2016-02-26 52 views
1

在我尝试进行rebase之前,我知道我的功能分支(GL18)的提交是什么(b7104e0),效果很差。我在Eclipse中查看Git Reflog,它多次列出提交b7104e0。我想将GL18的头重新设置回b7104e0。在重新引用日志中选择哪个b7104e0提交是否重要,或者它们都一样?使用reflog取消git rebase时,选择哪个提交会有影响吗?

+0

如果你的rebase失败了,你也可以运行'git rebase --abort'而不是'git reset'来达到旧状态。 – morxa

回答

2

使用提交消息,提交作者,提交日期,树形哈希和所有父提交散列来计算git散列,有关详细信息,请参阅this blog post on the anatomy of a Git commit

这意味着您看到的使用相同散列的每次提交都是完全相同的提交。你可以使用任何这些。实际上,如果您重置,则重置为提交哈希:git reset --hard b7104e0

2

无,但只是为了清楚起见,因为标题和正文乍看问不同的问题,我们拼出来这里明确:

  • 的“真名”的任何承诺(或实际上git中的任何存储库对象)都是它的SHA-1,在这种情况下,它以b7104e0开头(但继续追加33个字符)。这个真实名称唯一标识了该对象。在这种情况下,只要更短的版本保持唯一,它可以缩写为更短的。

  • 所有其他名称,如分支名称,标签,很特别REF HEAD,稍微特别少(但仍特别)ORIG_HEADMERGE_HEADCHERRY_PICK_HEAD,等等,和(终于 :-)) reflog条目,如[email protected]{3}branchname@{1},只是表示“真名”SHA-1 ID的方法。当使用git checkout或重写引用名称的命令时,对此规则有一个特殊的豁免,但通常情况下,名称或reflog条目仅解析为该ID。许多名称可能会解析为单个ID,或者可能只有一个名称解析为ID,但名称通常会解析为ID。

一旦你有了正确的ID,这不要紧,你如何得到它。


只是为了完整性:很明显,如果我们要变化目标名称的SHA-1的ID,例如,移动分公司或写一个新值CHERRY_PICK_HEAD,我们需要这个名字,而不是它的当前ID。我们需要一个名字的另一个地方是当使用间接(“符号”)引用,例如HEAD名称ref: refs/heads/master,以便您将on branch master作为git status将它放置。

我们还有一个特殊情况,名称不能解析为任何SHA-1 ID,这就是“尚未出生的分支”,这在最新版本库中最常见,没有任何提交:in这种情况下,您在分支master上,但refs/heads/master无法解析为提交ID,因为还没有提交。如果您使用git checkout --orphan创建一个尚未指向任何SHA-1(它将在下一次提交中获取其初始SHA-1)的新分支,则此特殊情况可以稍后再发生。在这两个古怪的情况下,HEAD参考存在,但名称分支字面上不存在存在(还)。