【发布时间】:2013-04-03 20:25:38
【问题描述】:
有两次提交 SHA1,我如何在不手动分析 git 日志的情况下获得哪个先提交?
请注意,我不是想找出哪个是另一个的祖先,我想知道哪个是最先推送的。
我想按照它在 git 历史中的时间顺序来获取它,而不是按照提交日期。欢迎任何方法,但首选直接的方法(我直接在终端模拟器上使用它,而不是在脚本上)。
我尝试按照@wRAR 的建议使用git merge-base。
首先,有一个缺点:git merge-base --is-ancestor 没有给我输出。它以 0 或 1 退出而不向 stdout 输出任何内容。编写脚本时可以,但是当 手动 直接在我的终端上使用它时,我必须在之后的额外步骤中检查退出状态(echo $?on bash,$LASTEXITCODEon PowerShell)。不会破坏交易,但会产生一些麻烦。
但是,无论如何,它没有用。
适用于以下场景:
> git log --oneline --graph
| * <SHA1 D> Fourth commit.
| * <SHA1 C> Third commit.
| * <SHA1 B> Second commit.
| * <SHA1 A> First commit.
> git merge-base --is-ancestor <SHA1 B> <SHA1 C>
> echo $?
0
> git merge-base --is-ancestor <SHA1 C> <SHA1 B>
> echo $?
1
但不是在这个中(不符合我的意图):
> git log --oneline --graph
* <SHA1 D> Merged work.
|\
| * <SHA1 C> Paul's first commit.
* | <SHA1 B> John's second commit.
|/
* <SHA1 A> John's first commit.
> git merge-base --is-ancestor <SHA1 B> <SHA1 C>
> echo $?
1
> git merge-base --is-ancestor <SHA1 C> <SHA1 B>
1
【问题讨论】:
-
它按预期工作:两个提交都不是另一个人的祖先。
-
如果您想使用自然提交 DAG 以外的其他东西来建立提交顺序,请澄清这一点。
-
@wRAR 添加了一条说明我的意图的说明。