【发布时间】:2013-07-22 03:47:12
【问题描述】:
我有一个简洁命名为 feature 的功能分支,它有大约 100 次提交,都与某种功能相关。随着时间的推移,这些提交都合并到了主分支中。我想列出分支上的所有提交,以便我可以将该功能重新添加到其他项目。
基本上我想要下图中绿点的提交 ID。
除了使用 gitk 或类似工具并手动收集所有相关的提交 ID 之外,我如何在 Git 中做到这一点?
【问题讨论】:
标签: git
我有一个简洁命名为 feature 的功能分支,它有大约 100 次提交,都与某种功能相关。随着时间的推移,这些提交都合并到了主分支中。我想列出分支上的所有提交,以便我可以将该功能重新添加到其他项目。
基本上我想要下图中绿点的提交 ID。
除了使用 gitk 或类似工具并手动收集所有相关的提交 ID 之外,我如何在 Git 中做到这一点?
【问题讨论】:
标签: git
如果你得到了特定分支的起点,例如,SHA1,试试这个:
git log --pretty=oneline SHA1^..feature
【讨论】:
尽管给出并接受了答案,但我会建议更自动的方法来执行此操作(但只有在您没有将 master 合并到 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 -1 将找到在您创建 feature 分支后立即完成的对 master 的提交 - 这是 C
C 的祖先 - B 也将是 feature 分支的第一个提交 H 的祖先。
然后xargs -I '{}' git log '{}'^..feature(即转为git log B..feature)仅显示可从feature 访问但不能从B 访问的提交。
【讨论】:
feature 分支的开头有些混乱,需要手动选择开始提交,但除此之外,您的配方工作得很好。这是一条线:git log $(git rev-list feature..master | tail -1)^..feature
更简单的版本,可以使用 Git 2.36(2022 年第二季度):
git log --exclude-first-parent-only feature ^master
这将列出来自feature 分支的所有提交。
在 Git 2.36(2022 年第二季度)中,“git log”(man) 和朋友们学习了一个选项 --exclude-first-parent-only 仅沿第一父链向下传播 UNINTERESTING 位,只需like --first-parent 选项显示仅在第一个父链上缺少 UNINTERESTING 位的提交。
参见 Jerry Zhang (jerry-skydio) 的 commit 9d505b7(2022 年 1 月 11 日)。
(由 Junio C Hamano -- gitster -- 合并到 commit 708cbef,2022 年 2 月 17 日)
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分支的主题分支。git rev-list topic ^main( man) 最终将不返回任何提交,因为排除main最终也会遍历topic上的提交。git rev-list --exclude-first-parent-only topic ^main(man)但是会根据需要返回{B, C, D}。为新标志添加文档,并澄清
--first-parent的文档以表明它仅适用于遍历包含的提交集。
rev-list-options 现在包含在其man page 中:
当找到要包含的提交时,只关注第一个 看到合并提交时的父提交。
这个选项 在查看演变过程时可以提供更好的概览 一个特定的主题分支,因为合并到一个主题中 分支往往只是为了适应更新的上游 有时,此选项允许您忽略 通过此类将个人提交带入您的历史 合并。
rev-list-options 现在包含在其man page 中:
--exclude-first-parent-only查找要排除的提交时(使用“{caret}”),仅遵循 看到合并提交时的第一个父提交。
这可用于查找主题分支中的更改集 从它与远程分支分歧的点开始,给定 任意合并可以是有效的主题分支更改。
【讨论】: