在我尝试使用rebase之前,我知道我的功能分支(GL18)的提交是什么(b7104e0)。我正在浏览Eclipse中的Git Reflog,它会多次列出提交b7104e0。我想将GL18的头部重置为b7104e0。请问我在reflog中选择哪个b7104e0提交哪个重置,或者它们都一样?
答案 0 :(得分:2)
使用提交消息,提交作者,提交日期,树形哈希和所有父提交哈希计算git哈希,有关详细信息,请参阅this blog post on the anatomy of a Git commit。
这意味着您使用相同哈希看到的每个提交都是完全相同的提交。您可以使用其中任何一种。实际上,如果重置,则重置为提交哈希:git reset --hard b7104e0
。
答案 1 :(得分:2)
不 - 但为了清楚起见,由于标题和正文最初似乎提出了不同的问题,请在此处明确说明:
"真名"任何提交(或者实际上是git中的任何存储库对象)都是它的SHA-1,在这种情况下以b7104e0
开头(但继续另外33个字符)。此真实名称唯一标识对象。它可以缩写为更短的东西,就像在这种情况下,只要较短的版本保持唯一。
所有其他名称,例如分支名称,标签,非常特殊的引用HEAD
,稍微不那么特别(但仍然特殊)ORIG_HEAD
,MERGE_HEAD
,{{ 1}},依此类推,以及(终于 :-))CHERRY_PICK_HEAD
或HEAD@{3}
之类的reflog条目,只是表达"真实姓名&#的方式34; SHA-1 ID。使用branchname@{1}
或重写引用名称的命令时,对此规则有特殊豁免,但通常,名称或reflog条目只会解析为ID。许多名称可以解析为单个ID,或者可能只有一个名称解析为ID,但通常名称确实解析为ID。 1
一旦你拥有了正确的ID,你得到它并不重要。
1 只是为了完整性:显而易见的是,如果我们要更改名称的目标SHA-1 ID,例如,要移动分支或将新值写入git checkout
,我们需要名称,而不是其当前ID。我们需要名称的另一个地方是使用间接("符号")引用时,例如当CHERRY_PICK_HEAD
名称为HEAD
时,您和#39 ; ref: refs/heads/master
将重新on branch master
。
我们还有一个特殊情况,即名称无法解析为任何SHA-1 ID,而且该分支尚未诞生"一个,在新的存储库中最常见,根本没有提交:在这种情况下,你在分支git status
上,但是master
无法解析为提交ID,因为没有提交然而。如果您使用refs/heads/master
创建一个尚未(尚未)指向任何SHA-1的新分支(它将在下次提交时获取其初始SHA-1),则此特殊情况可能会在以后重复出现。在这两个奇怪的案例中,git checkout --orphan
引用存在,但命名的字符串不存在(尚未)。