我正在阅读有关在 git 中使用~
与^
运算符的区别,我遇到了这个问题 Git 中的 HEAD^ 和 HEAD~ 有什么区别?
谷歌搜索后,我在网上找不到一个好的解释,那就是 git 如何区分合并提交的第一个父级和第二个父级?
有经验法则吗?
以这个示例为例,feature
分支合并到develop
分支中,创建合并提交G
。
develop feature/foo
A D
| |
B E
| |
C F
/
G <- develop(HEAD)
哪一个是G
的第一个父母?C
还是F
?为什么是第一个父母?
注意:这不是请求 git 命令来确定第一个或第二个父级。我知道可以使用git show G^1
和git show G^2
来实现。我看到C
是G
的第一个父母,F
是第二个父母。但是,我不明白为什么会这样。是否像进行合并提交的分支决定了第一个父级?
是否像进行合并提交的分支决定了 第一亲?
是的。
参考 Git-Tools-Revision-Selection of Pro Git:
您还可以在 ^ 后指定一个数字来标识您的父级 要;例如,D921970^2 表示"D921970 的第二个父级"。 此语法仅对具有多个合并提交有用 父 — 合并提交的第一个父级来自分支 在您合并时处于打开状态(通常是主(,而第二个父级 的合并提交来自已合并的分支(例如,主题(:
像git show G^1
、git show G^2
、git log -1 --pretty=%P G
和git rev-parse G^@
这样的命令可以证明它与描述的相同。此外,使用git cat-file -p G
检查提交对象的内容,我们可以看到父项是按顺序记录的。
第一个父级通常是执行合并的分支的HEAD
提交。
git commit
使用HEAD
提交作为第一个父级(如果没有冲突,git merge
将为您执行提交,否则您自己执行。无论哪种方式,结果都相同(。 所有方便的命令都遵循此约定。您可以使用git commit-tree
自己构建任意提交,并出于任何原因指定您喜欢的任何父级。
因此,提交本身没有父级。但是您可以根据运行git merge
的分支说哪一个是父级