我遇到一个非常类似于这个的问题,但是我无法想出如何将那里的解决方案应用到我的情况中,因为我的情况稍微复杂一些。
考虑以下历史记录:
X0 - X1 - - X - X - Xn - ... - Xinf
\ / / /
\ C - D / /
\ / \ / /
A - E - F - H
\ / \ /
B G
master
指向 Xinf
,而 release
指向 H
。
从 master
创建 release
分支后,进行了一些修复。其中一些只合并到了 release
分支(如 B
和 G
),一些则同时合并到了 release
和 master
分支(如 C-D
)。release
分支也被多次合并回 master
分支。在这个例子中,我确保所有这些事情都已经发生,但实际上它们可能比我的示例所示发生的更多次(或更少)。
在仅知道 release
和 master
引用的情况下,如何获取 release
分支中所有提交的列表,即 A
到 H
?
我创建了一个包含上述历史记录的示例存储库,以便更容易地进行测试。
git rev-list release
或git log release
,但这会包括提交X0
,因为X0
是从A
可达的(它是A
的父提交)。要避免这种情况,可以使用^A^
,但当然你需要先找到A
,或者使用^X0
,但你需要先找到X0
。 - torekX0
的方法。您可以使用git log --first-parent master
来跟踪所有的X
提交,但是无法知道哪一个用作停止项。X0
和X1
都可以作为停止项(^X1
也可以),但是一些 X 具有 D 或 F 作为父级,因此不起作用:它们会停止太多提交。 - torekA
,则可以通过检查A
的祖先来找到正确的停止项。在这种情况下,只有X0
是祖先。但是,如果您知道A
,则可以直接使用^A^
。 - torek