【发布时间】:2011-11-04 21:09:37
【问题描述】:
我需要做一个 git revert -m ,但我找不到任何关于提交父母如何编号的文档。我所看到的一切(包括 rev-parse 的帮助页面)只是告诉我父母是编号的,但没有说明他们是如何编号的。有人可以向我指出这是在哪里定义的以及如何确定的吗?
【问题讨论】:
我需要做一个 git revert -m ,但我找不到任何关于提交父母如何编号的文档。我所看到的一切(包括 rev-parse 的帮助页面)只是告诉我父母是编号的,但没有说明他们是如何编号的。有人可以向我指出这是在哪里定义的以及如何确定的吗?
【问题讨论】:
git show --format="%P" <SHA>
将按数字顺序为您提供给定提交的父 SHA。大多数情况下,您要为git revert 指定的地址是1。
在大多数合并的情况下,签出分支的 SHA 将是第一个父级,而合并到的分支的 SHA 将是第二个。 (基本上,签出的分支始终是第一个父级;其他父级是按其规范顺序指定给合并命令的分支。)
如果要查找特定父级的 SHA,请使用插入符运算符:
git rev-parse <SHA>^1
git rev-parse <SHA>^2
等等。
【讨论】:
git-filter-branch 操作,现在看来,在某些情况下,顺序是相反的。见stackoverflow.com/questions/27704438/…
在合并提交上执行 git log 或 git show 将在“Merge:”标题中显示合并的父级列表。这按从左到右的顺序列出了合并的父级。第一个是第一个父母,第二个是第二个父母,依此类推。
例如在 git 仓库上:
$ git show 0af53e188a3a8915f65c3b3edaeed3e07d8d3802
commit 0af53e188a3a8915f65c3b3edaeed3e07d8d3802
Merge: b81b758 8894d53
Author: Junio C Hamano <gitster@pobox.com>
Date: Thu Aug 11 11:04:28 2011 -0700
Merge branch 'cb/partial-commit-relative-pathspec'
* cb/partial-commit-relative-pathspec:
commit: allow partial commits with relative paths
b81b758 是第一个父级,8894d53 是合并提交 0af53e1 的第二个父级。
提交完成时,父提交根据它们在命令行上的出现顺序编号:
[on branch master]
$ git merge foo bar baz
这会将分支 foo、bar 和 baz 合并到 master 中,如果无法进行快进,则会创建一个新的合并提交。
在生成的合并提交中,“master”将是第一个父级,“foo”第二个,“bar”第三个,“baz”第四个。
【讨论】:
提交“编号”实际上是它的 SHA1 哈希值。这为验证目的提供了极大的完整性。
它还有一个很好的副作用,即您不/不能期望它以任何方式是顺序的,这也是分支和合并多用户分布式 VCS 系统的自然属性。有很多 tree walk 命令和引用提交的方法,例如 HEAD^ 或 HEAD^^。
git help revisons 给出了所有不同语法的完整描述。
【讨论】:
HEAD^1 vs HEAD^2)
git help revisons 作为来源。