如何通过编程找到Git合并前的最后一次提交



假设我有一个Git历史记录,如下图所示:

A - B - D - F - G   <- "master" branch (at G)
        /
C - E --'     <- "topic" branch (note: deleted!)

假设我已经删除了topic,这样我的本地或远程存储库中就不再有它了(历史已经很长时间了,我的reflog已经好几个月没有包含它了)。

我想找到提交F,即主分支中不包含任何来自主题分支的提交的最新提交。

如果有帮助的话,我已经找到了提交C,我开始在主题分支上工作的提交。

重要:我不能通过查看Git的可视化输出来做到这一点。在我拥有的实际代码中,topic被合并到master中数十次甚至数百次,然后master随后被开发(有许多不相关的合并)。因此,这个问题的解决方案对我来说是没有用的。

我想找到…主分支中不包含任何主题分支提交的最新提交。如果有帮助的话,我已经找到了提交C,我开始在主题分支上工作的提交。

在第一个主题分支提交的祖先路径上提交:

git rev-list --ancestry-path C..master

在主分支的第一父级历史记录中提交,而不是在C的历史记录中提交(即设置一个合理的截止):

git rev-list --first-parent C..master

主分支的第一父历史中第一次提交,没有在任何到C的主祖先路径上:

git rev-list --first-parent C..master 
| grep -vm1 -f <(git rev-list --ancestry-path C..master)

使用示例repo:

$ git rev-list --first-parent :/first..| grep -vm1 -f <(git rev-list --ancestry-path :/first..)
e7c863d79e8918ca947fc602ebb06266374c10e6
$ lgdo
*   a9546a2 (HEAD -> master, origin/master, origin/HEAD) merge from topic back to master
|  
| *   648ca35 (origin/topic) merging master onto topic
| |  
| * | 132ee2a first commit on topic branch
* | | e7c863d commit on master after master was merged to topic
| |/  
|/|   
* | 37ad159 post-branch commit on master
|/  
* 6aafd7f second commit on master before branching
* 4112403 initial commit on master

我找到了一个名为git-when-merged脚本,它让我得到了大部分的方式。在我最初的例子中,执行

git when-merged C

来自主分支的定位到G,即C第一次将其写入主分支的合并提交。在这之后,简单地通过直系父母查找不在通往c的路径上的那个

最新更新