【问题标题】:How to understand the git commit ID如何理解 git commit ID
【发布时间】:2016-04-10 06:38:46
【问题描述】:

我有一个 git 存储库并在那里工作了几个月。现在我想回到历史上的一个提交。我通过运行列出了历史:

git log -3

这显示了前 3 次提交。然后我选择一个我想去的提交并运行:

git checkout 77486083c985e6858b8aecd6a085e2f028885b4b 

在那之后,我认为我的 HEAD 已更改为该提交。当我运行git status 时,我得到:

HEAD detached at 6b90718
nothing to commit, working directory clean

我不明白“6b90718”是从哪里来的。我怎样才能读到这个ID?如果我想显示我当前所在的提交列表,我该怎么做?

【问题讨论】:

  • 您应该会看到您签出的提交的前 7 个字符。
  • 当你像这样签出一个提交 ID 时,你将 HEAD 指向那个特定的提交而不是它所在的分支。这就是“分离的 HEAD”状态 - HEAD 不再指向任何特定的分支,因此需要分支的操作​​(如合并)将无法正常工作。您可以通过签出一个分支(如 master)再次取消分离它。至于您在那里看到的特定提交 ID.. 嗯,它应该与您签出的任何内容相同。你确定你在 checkout 命令之后没有做任何事情吗?
  • checkout 命令后我什么也没做。我签出的提交 ID 是“77486083c985e6858b8aecd6a085e2f028885b4b”,但它如何变成“6b90718”
  • 如果您签出带注释的标签,就会发生这种情况。
  • 抱歉,我不明白您所说的查看带注释的标签是什么意思。

标签: git


【解决方案1】:

我错了。以下是我现在固定的答案。


之后,我认为我的 HEAD 已更改为该提交。

git checkout 更改您的HEAD 并使您的工作目录看起来像您提交时所代表的目录,在本例中为7748608。它不做的是更改任何分支引用。 分离的 HEAD 意味着您的 HEAD 引用不指向任何分支引用。如果您进行任何提交,您将从任何其他分支历史记录中分支出来。这是来自git checkout 手册页的示例:

$ edit; git add; git commit

     HEAD (refers to commit 'e')
      |
      v
      e
     /
a---b---c---d  branch 'master' (refers to commit 'd')
    ^
    |
  tag 'v2.0' (refers to commit 'b')

在此示例中,HEAD 被分离以指向 b,然后进行了提交(提交 e)。因为e 没有被任何分支或标签引用引用,所以当 git 垃圾收集器下次运行时,它有被删除的风险。这就是拥有一个分离的HEAD 的危险,也是 git 在你拥有一个时发出警告的原因。

回到你的问题:

HEAD detached at 6b90718

这表示您的HEAD 已分离(它不指向任何分支引用)并且它让您知道您的HEAD 正在引用提交6b90718。它是6b90718 而不是7748608 的事实看起来很奇怪,但是如果您在结帐后进行了任何提交,那么它就很有意义了。 7748608 就像上面示例中的 b,而 6b90718 将是 e

【讨论】:

  • 这是不正确的。 HEAD 始终是您当前签出的提交。如果您已签出一个分支,则 HEAD 指向该分支。如果你检查了一些任意的提交,HEAD 会指向它并且是分离的。例外情况是,如果您将结帐与路径一起使用,则只会更新这些路径而不是 HEAD。重置可以(但不是必须)更新 HEAD,具体取决于参数。更重要的是,通过 reset 可以修改当前分支指向的内容,这对于 checkout 是不可能的。 Checkout 仅适用于工作树和 HEAD 参考!
  • 哇,我真的错了。你是对的。我什至在发布后意识到它听起来有些不对劲,但由于某种原因看不到它。在我的脑海中,我在考虑分支参考,而不是 HEAD 参考。将更新我的答案以更正它。谢谢你接听。
  • 至少现在你的文字是正确的。但它并没有回答这个问题。在 OP 的 cmets 中,问题是他在结帐后是否做了任何事情,比如提交,他明确表示他没有。我认为这个答案应该被删除。虽然被接受,但它根本没有回答问题。
  • 我接受这个答案主要是因为他给了我比我预期的更好的解释。我非常了解背景信息,非常感谢。
  • 我是 SO 新手,所以我仍在弄清楚什么是合适的答案,什么不是合适的答案,所以我很感激反馈。我对为什么我的回答是合适的想法是,对于所说的 OP 的问题并没有真正的答案。至少缺少信息。我的回答背后的想法是,它为 OP 提供了足够的信息来找出他们可能偏离的地方,从而导致检查不同的提交。
【解决方案2】:

如果我想显示我当前所在的提交列表,我该怎么做?

git loggitkgitg

我不明白“6b90718”从何而来

ditzy 的 answer 涵盖了这个

从这里开始

“我选择了一个我想去的提交”

接下来要做什么取决于您到底想做什么,以及您是否已向上游推进,以及是否有人从中撤出。

如果您只想从签出的那一刻起进行一些更改(并更新或重做或删除随后的更改),see a previous answer here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    相关资源
    最近更新 更多