9

我有一个简洁命名的特性分支feature,它有大约 100 次提交,都与某种特性相关。随着时间的推移,这些提交都合并到了主分支中。我想列出分支上的所有提交,以便我可以将该功能重新添加到其他项目。

基本上我想在下图中的绿点上有提交 ID。

相关提交

除了通过 gitk 或类似工具并手动收集所有相关的提交 ID 之外,我如何在 Git 中做到这一点?

4

3 回答 3

6

如果您获得特定分支的起点,例如,请SHA1尝试以下操作:

git log --pretty=oneline SHA1^..feature
于 2013-07-22T03:55:56.120 回答
3

master尽管给出并接受了答案,但我建议使用更自动的方法来执行此操作(但只有在您没有合并to时才会起作用feature):

考虑以下历史:

--A---B---C---D---E---F---G (master)
       \     /       /
        H---J-------K       (feature)

基本上我们要执行git log B..feature.

git log --format='%H' feature..master | tail -1 | \
xargs -I '{}' git log '{}'^..feature

git log --format='%H' feature..master | tail -1master将找到在您创建feature分支后立即完成的提交- 这是C

C-的祖先也将是分支B的第一次提交的祖先Hfeature

然后xargs -I '{}' git log '{}'^..feature(即转为git log B..feature)仅显示feature可从B.

于 2013-07-22T06:51:21.043 回答
0

一个更简单的版本,可以使用 Git 2.36(2022 年第二季度):

git log --exclude-first-parent-only feature ^master

feature这将列出来自分支的所有提交。


在 Git 2.36(2022 年第二季度)中,“ git logman和朋友们学会了一个选项--exclude-first-parent-only,即仅沿第一父链向下传播 UNINTERESTING 位,就像--first-parent选项显示仅沿第一父链缺少 UNINTERESTING 位的提交一样。

请参阅Jerry Zhang ( ) 的提交 9d505b7(2022 年 1 月 11 日(由Junio C Hamano 合并 -- --708cbef 提交中,2022 年 2 月 17 日)jerry-skydio
gitster

git-rev-list: 添加 --exclude-first-parent-only 标志

签字人:Jerry Zhang

为了能够枚举用户的本地更改,了解某个分支何时在历史上首次与某个集成分支分道扬镳很有用。
但是,这些局部变化可以包括任意的合并,因此在寻找分歧点时需要忽略这种合并结构。

为了做到这一点,请教“ rev-list”家庭接受“ --exclude-first-parent-only”,这将排除的提交的遍历限制为仅遵循第一个父链接

-A-----E-F-G--main
  \   / /
   B-C-D--topic

在此示例中,目标是返回集合{B, C, D},它表示已合并到分支中的主题main分支。( man )最终将不会返回任何提交,因为 exclude最终也会遍历提交。( man ) 但是会根据需要返回。
git rev-list topic ^mainmaintopic
git rev-list --exclude-first-parent-only topic ^main{B, C, D}

为新标志添加文档,并澄清文档--first-parent以表明它仅适用于遍历包含的提交集。

rev-list-options现在在其手册页中包含:

查找要包含的提交时,在看到合并提交时仅关注第一个父提交。

在查看特定主题分支的演变时,此选项可以提供更好的概览,因为合并到主题分支往往只是不时调整到更新的上游,并且此选项允许您忽略引入的单个提交通过这样的合并你的历史。

rev-list-options现在在其手册页中包含:

--exclude-first-parent-only

查找要排除的提交时(使用“{caret}”),在看到合并提交时仅遵循第一个父提交。

鉴于任意合并可能是有效的主题分支更改,这可用于从主题分支与远程分支分歧的点查找主题分支中的更改集。

于 2022-02-20T11:32:13.357 回答