代码之家  ›  专栏  ›  技术社区  ›  Elliott Slaughter

如何以编程方式查找Git合并前的最后一次提交

  •  0
  • Elliott Slaughter  · 技术社区  · 4 年前

    假设我有一个Git历史,看起来像(归功于 this answer 对于图表,以及 see here 对于具有此结构的可克隆git repo):

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

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

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

    如果有帮助的话,我已经找到了commit C,这是我开始处理主题分支的地方。

    重要的 我不能通过观察Git的视觉输出来做到这一点。在我所拥有的真实代码中,主题被合并到master中数十次或数百次,然后master随后被开发(有许多不相关的合并)。因此,建议的解决方案 this question 对我来说不可用。

    2 回复  |  直到 4 年前
        1
  •  3
  •   jthill    4 年前

    我想在master分支中找到最新的提交,它不包含来自主题分支的任何提交。如果有帮助的话,我已经找到了commit 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)
    

    使用样本回购进行此操作:

    $ 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
    
        2
  •  1
  •   Elliott Slaughter    4 年前

    我找到了一个名为的脚本 git-when-merged 这让我大部分时间都在那里。在我最初的例子中,做

    git when-merged C
    

    从主分支定位G,即C第一次进入主分支的合并提交。在那之后,只需简单地查找直系父母,就可以找到一个不在C之路上的人。