似乎 git 中的^
and~
语法只用于左父提交(右父合并到的提交)。在我的具体情况下,我有一棵这样的树:
$ git log --pretty=format:"%h" --graph
* f5712e3
|\
| * d0f8257
* | e1fe071
|/
* e0fff07
我找到了两个git log HEAD^ -1
并git log HEAD~1 -1
给了我 left parent e1fe071
。获得正确父级的常规语法是什么?
似乎 git 中的^
and~
语法只用于左父提交(右父合并到的提交)。在我的具体情况下,我有一棵这样的树:
$ git log --pretty=format:"%h" --graph
* f5712e3
|\
| * d0f8257
* | e1fe071
|/
* e0fff07
我找到了两个git log HEAD^ -1
并git log HEAD~1 -1
给了我 left parent e1fe071
。获得正确父级的常规语法是什么?
$ git log HEAD^2
插入符号允许您在提交的直接父项中进行选择,如git rev-parse
文档中所述。
<rev>^
,例如,HEAD^
,v1.5.1^0
修订参数的后缀
^
表示该提交对象的第一个父级。^<n>
表示第n个父级(即,<rev>^
等价于<rev>^1
)。作为特殊规则,<rev>^0
表示提交本身,并且在<rev>
引用提交对象的标记对象的对象名称时使用。
为了确定哪个是哪个,输出*的git show
顺序列出了父母。例如,libgit2 中 master 分支的负责人是合并提交a3ef70b。
$ git 显示大师 提交 a3ef70bb405a05c16fb533d828da2510ff751224 合并:c4c47fc 8aba3d4 作者:爱德华·汤姆森 <ethomson@edwardthomson.com> 日期:2014 年 12 月 30 日星期二 11:53:55 -0600 合并来自 libgit2/cmn/fetch-prune 的拉取请求 #2761 远程跟踪分支修剪
请注意输出的第二行 begin Merge:
,它按顺序列出了父母。我们可以使用git rev-parse
as来验证这个属性
$ git rev-parse master^1
c4c47fc2861935d8e373319c0734ea7b2ce34a73
和
$ git rev-parse master^2
8aba3d47cf96e24e02601175f900f0e851077c1a
检查来源确认。
strbuf_addstr(sb, "Merge:");
while (parent) {
struct commit *p = parent->item;
const char *hex = NULL;
if (pp->abbrev)
hex = find_unique_abbrev(p->object.sha1, pp->abbrev);
if (!hex)
hex = sha1_to_hex(p->object.sha1);
parent = parent->next;
strbuf_addf(sb, " %s", hex);
}
相关答案: 在 git 中获取合并提交的父级
* 的文档git show
给出了关于提交谱系的警告:
如果提交是合并,并且如果 pretty-format 不是oneline、email或raw ,则在Author:行之前插入一个附加行。此行以“Merge:”开头,并打印祖先提交的 sha1,用空格分隔。请注意,如果您限制了对历史的查看,列出的提交可能不一定是直接父提交的列表:例如,如果您只对与某个目录或文件相关的更改感兴趣。