`checkout` =`reset` +`symbolic ref`?

时间:2017-04-12 17:36:40

标签: git git-checkout

假设a_branch是指向不同提交的现有分支,而HEAD指向(HEAD可能指向直接提交或通过某些branch)提交的提交不同

以下命令是否等效?

  

git checkout a_branch

  

git symbolic-ref HEAD ref/heads/a_branch
  git reset --hard a_branch

另见this related post

2 个答案:

答案 0 :(得分:2)

不,如果您在运行命令之前进行了暂存或更改,则它们不会。

如果在运行git checkout之前修改预先存在的文件,则移动HEAD后修改将保持不变。无论更改是分阶段还是肮脏,都是如此。

运行git reset --hard时同样不成立。当您运行git reset --hard时,将销毁已暂存或变脏的修改。

答案 1 :(得分:2)

我也想知道,git checkout(和git branch)在"管道中的含义是什么?命令。因此,我尝试了一个案例,在那里我创建了一个新的分支,因为它只是为了学习基础知识。为了确保,我不会错过任何东西,我从头开始:

Create a folder "Test" with one file "test.txt" and write  
"Great content" into that file.

使用git book中的chapter 10,我调查了以下序列:

  • git init
  • git add .
  • git commit -m "Init"
  • 瓷器命令:
    • git branch b1
    • git checkout b1
  • OR管道命令:
    • git symbolic-ref HEAD
    • git update-ref refs/heads/b1 $(git rev-parse HEAD)

结果:两者重合!

详细信息。我将使用以下命令检查状态:

来自Git bash的使用命令:

  • find .git/refs -type f查找.git / refs
  • 中的所有文件
  • git symbolic-ref HEAD指向符号HEAD引用,与cat .git/HEAD
  • 相同
  • git rev-parse HEAD获取HEAD
  • 可以访问的历史记录(提交,对象?)
  • git rev-list --objects --all查看所有提交对象
  • git cat-file -p refs/heads/master查看文件内容 如果有不同的分支,没有共同的历史,则必须使用
    git rev-list --objects --no-walk $(git fsck --unreachable | grep '^unreachable commit' | cut -d' ' -f3)
  • git reflog显示一次提交和HEAD历史记录(仅一次提交) Git瓷器命令
  • git branch -av使用哈希和消息显示所有分支(如果有,还显示遥控器!)。

在下文中,命令仅在结果为非空或自上一步后发生变化时才会显示。

初始化Git仓库

git init # creates empty .git/ folder. HEAD exists but without history.

.git / objects中没有对象。文件夹/信息和/包是空的 .git / refs /为空

阶段变化

git add .
find .git/refs -type f # One object in c1/ created:
git cat-file -p c15479631b40176f3b09b7bc74ac5e189190e991 # yields "great content"
git cat-file -t c15479631b40176f3b09b7bc74ac5e189190e991 # yields  "blob"

因此,创建了refs/objects/中的一个对象

提交更改

git commit -m "Init"
find .git/refs -type f # refs/heads/master created. Not empty. So have a look:
git symbolic-ref HEAD               # refs/heads/master
git cat-file -p refs/heads/master   # The full commit information including tree, author, commiter and commit message
git rev-parse HEAD                  # The hash to which HEAD points
git reflog                          # shows the HEAD history (just one commit)

# View all commit-objects. Everything is reachable by the commit:
git rev-list --objects --all        
git cat-file -p $(git rev-parse HEAD) # Commit Hash changes with time. -t instead of -p yields "commit"
git cat-file -p 69b13879c229e1cc35f270db248910e5a828dc65 # -t yields tree
git cat-file -p c15479631b40176f3b09b7bc74ac5e189190e991 # -t yields blob

git branch -av

来自git rev-parse HEAD创建的哈希的主分支

* master 7845459 Init

创建分支

git update-ref refs/heads/b1 $(git rev-parse HEAD)
# refs/heads/master still there. refs/heads/b1 created. So have a look:
find .git/refs -type f
git symbolic-ref HEAD          # Still at ref/heads/master
git cat-file -p refs/heads/b1  # The same result as from "git cat-file -p refs/heads/master"

git branch -av                      

b1存在但未检出:

  b1     7845459 Init
* master 7845459 Init

结帐b1,即更新HEAD

git symbolic-ref HEAD refs/heads/b1
git symbolic-ref HEAD  # now at refs/heads/b1 => b1 checked out! Cross-check:
git branch -av

b1签出:

* b1     7845459 Init
  master 7845459 Init

我希望,这很有帮助。