【问题标题】:List all commits in a topic branch列出主题分支中的所有提交
【发布时间】:2013-07-22 03:47:12
【问题描述】:

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

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

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

【问题讨论】:

    标签: git


    【解决方案1】:

    如果你得到了特定分支的起点,例如,SHA1,试试这个:

    git log --pretty=oneline SHA1^..feature
    

    【讨论】:

      【解决方案2】:

      尽管给出并接受了答案,但我会建议更自动的方法来执行此操作(但只有在您没有将 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
      • 查看Finding a branch point with Git?了解如何找到分支起点的详细信息
      【解决方案3】:

      更简单的版本,可以使用 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}”),仅遵循 看到合并提交时的第一个父提交。

      这可用于查找主题分支中的更改集 从它与远程分支分歧的点开始,给定 任意合并可以是有效的主题分支更改。

      【讨论】:

        猜你喜欢
        • 2021-09-28
        • 2016-07-19
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 2012-06-04
        • 2016-09-10
        • 2014-02-22
        相关资源
        最近更新 更多