【发布时间】:2015-03-28 17:36:50
【问题描述】:
如果我理解正确,当你有一个分离的头(HEAD->commit)时, 然后 git CHECKOUT 分支解决了问题(HEAD->branch[->someCommit])
但是重置到分支有什么作用呢?它应该设置 HEAD 指向另一个分支的对象(通常是分支)的指针。 但是既然我们没有这个中间人(分支)——那么它会做什么呢?为什么?
【问题讨论】:
如果我理解正确,当你有一个分离的头(HEAD->commit)时, 然后 git CHECKOUT 分支解决了问题(HEAD->branch[->someCommit])
但是重置到分支有什么作用呢?它应该设置 HEAD 指向另一个分支的对象(通常是分支)的指针。 但是既然我们没有这个中间人(分支)——那么它会做什么呢?为什么?
【问题讨论】:
它只是移动 HEAD:正如我在“Practical uses of git reset --soft?”中提到的:
git reset是关于移动 HEAD。
如果您将 HEAD 移至另一个提交,则 HEAD 仍为 detached。
在a discussion 之后,关于git reset 和git checkout 与symbolic reference HEAD 的分离或附加性质之间的区别,我们一起发现了以下内容:
git reset 也会将分支移动到 <something>:重置它不会使其脱离,它会更改分支 HEAD所以当分离时我调用
git reset <branch>,它会在分支后面找到提交,并将.git/HEAD中的提交更改为<branch>所指的提交。
让我们考虑一个附加到 branch1 的 HEAD(cat .git/HEAD 将返回 branch1):
git checkout branch2 将 HEAD 更改为 branch2 并保持 branch1 不变git reset branch2 会将 branch1 HEAD 重置为 branch2:cat .git/refs/heads/branch1 将包含与 branch2 相同的 SHA1。这就是区别:
关于 HEAD 的附加/分离性质:
【讨论】:
git reset”和“git checkout”之间有什么区别?” (stackoverflow.com/a/3639387/6309)、git checkout 将修改工作树(而不是索引)。 git reset 可以在不修改工作树的情况下移动 HEAD(如果不是 --soft,它也可以重置索引)。