【问题标题】:What should RESETING detached HEAD to BRANCH do?RESETING detached HEAD to BRANCH 应该怎么做?
【发布时间】:2015-03-28 17:36:50
【问题描述】:

如果我理解正确,当你有一个分离的头(HEAD->commit)时, 然后 git CHECKOUT 分支解决了问题(HEAD->branch[->someCommit])

但是重置到分支有什么作用呢?它应该设置 HEAD 指向另一个分支的对象(通常是分支)的指针。 但是既然我们没有这个中间人(分支)——那么它会做什么呢?为什么?

【问题讨论】:

    标签: git git-reset


    【解决方案1】:

    它只是移动 HEAD:正如我在“Practical uses of git reset --soft?”中提到的:

    git reset 是关于移动 HEAD。

    如果您将 HEAD 移至另一个提交,则 HEAD 仍为 detached

    a discussion 之后,关于git resetgit checkoutsymbolic reference HEAD 的分离或附加性质之间的区别,我们一起发现了以下内容:

    • 如果 HEAD 指向分支,git reset 也会将分支移动到 <something>:重置它不会使其脱离,它会更改分支 HEAD
    • 如果 HEAD 指向提交(已经分离),那么它将保持分离:正如 OP 所说:

    所以当分离时我调用git reset <branch>,它会在分支后面找到提交,并将.git/HEAD 中的提交更改为<branch> 所指的提交。

    让我们考虑一个附加到 branch1 的 HEAD(cat .git/HEAD 将返回 branch1):

    • git checkout branch2 将 HEAD 更改为 branch2 并保持 branch1 不变
    • git reset branch2 会将 branch1 HEAD 重置为 branch2cat .git/refs/heads/branch1 将包含与 branch2 相同的 SHA1。

    这就是区别:

    • 重置移动 HEAD(正如我在开头所说的:这都是关于移动 HEAD)
    • 结帐开关分支(或分离 HEAD)

    关于 HEAD 的附加/分离性质:

    • 重置不会改变 HEAD 的性质(如果已连接,则保持连接状态)
    • checkout 可以改变 HEAD 的性质(如果它已附加并且您签出提交而不是分支,则 HEAD 会分离)

    【讨论】:

    • 结帐不也是关于移动 HEAD 的吗?在我看来,结帐移动了 HEAD,而重置移动了 HEAD 指向的东西......
    • 正如我在““git reset”和“git checkout”之间有什么区别?” (stackoverflow.com/a/3639387/6309)、git checkout 将修改工作树(而不是索引)。 git reset 可以在不修改工作树的情况下移动 HEAD(如果不是 --soft,它也可以重置索引)。
    • 好的。所以在分离头中,当我们忽略工作树和索引时,重置分支和结帐分支本质上是一样的吗?(=都将头移到分支)
    • @Novellizator 他们对 HEAD 做同样的事情,如果你重置或者你结帐一个分支。但是这些命令应用于 detached HEAD 的事实并不相关。如果 HEAD 没有分离,他们仍然会这样做。
    • 好吧,现在我真的感到困惑。在您自己的帖子中 - stackoverflow.com/questions/3639342/… 您展示了一张图片,显然 HEAD 在重置后没有移动(.git/HEAD 包含 same 的东西),只有开发被移动了。所以我得出的结论是 git reset (--soft,为简化起见)对 HEAD 做任何事情。我错过了什么?
    猜你喜欢
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 2012-11-21
    • 2012-02-11
    相关资源
    最近更新 更多