如何获取已合并分支的所有git提交记录列表?

4

我遇到一个非常类似于这个的问题,但是我无法想出如何将那里的解决方案应用到我的情况中,因为我的情况稍微复杂一些。

考虑以下历史记录:

X0 - X1 - - X - X - Xn - ... - Xinf
 \         /   /   /
  \   C - D   /   /
   \ /     \ /   /
    A - E - F - H
     \ /     \ /
      B       G

master 指向 Xinf,而 release 指向 H

master 创建 release 分支后,进行了一些修复。其中一些只合并到了 release 分支(如 BG),一些则同时合并到了 releasemaster 分支(如 C-D)。release 分支也被多次合并回 master 分支。在这个例子中,我确保所有这些事情都已经发生,但实际上它们可能比我的示例所示发生的更多次(或更少)。

在仅知道 releasemaster 引用的情况下,如何获取 release 分支中所有提交的列表,即 AH

我创建了一个包含上述历史记录的示例存储库,以便更容易地进行测试。


2
最简单的方法是使用 git rev-list releasegit log release,但这会包括提交 X0,因为 X0 是从 A 可达的(它是 A 的父提交)。要避免这种情况,可以使用 ^A^,但当然你需要先找到 A,或者使用 ^X0,但你需要先找到 X0 - torek
1
基本上,没有自动找到 X0 的方法。您可以使用 git log --first-parent master 来跟踪所有的 X 提交,但是无法知道哪一个用作停止项。X0X1 都可以作为停止项(^X1 也可以),但是一些 X 具有 D 或 F 作为父级,因此不起作用:它们会停止太多提交。 - torek
1
如果您已经知道 A,则可以通过检查 A 的祖先来找到正确的停止项。在这种情况下,只有 X0 是祖先。但是,如果您知道 A,则可以直接使用 ^A^ - torek
1个回答

2

针对X0的一种方法是:

  • 它是离主分支第一个父提交和发布版本第一个父提交都最近的祖先

我不知道如何一次性使用git rev-listgit log来完成它,但以下是通过脚本获取它的一种方法:

# get the list of first-parents of master, store this list in a file :
$ git rev-list --first-parent master > /tmp/tmp-rev-list

# get the list for release, and grep it using 'tmp-rev-list'
# commits will be listed in topo order, 'X0' is the first one :
$ git rev-list --first-parent release | grep -f /tmp/tmp-rev-list | head -1

你可以使用-F来加快grep的速度(意思是:所有模式都是钝括号字符串,不使用正则表达式), 并且你可以使用<(...) 跳过tmp文件:
最初的回答
$ X0=$( git rev-list --first-parent release |\
    grep -Ff <(git rev-list --first-parent master) |\
    head -1 )

# obviously : it would be better to write this command in a script,
# and then use it to get X0:   X0=$(bash myscript.sh)

Once you have this commit id, you can just run :

$ git log $X0..release

这太棒了 - 比我之前脚本化的暴力解决方案快多了。谢谢! - Tomas Aschan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接