显示主题分支的唯一更改(即使它已经合并到主分支)

时间:2015-03-19 13:33:18

标签: git

如果有主题分支,是否有办法显示在该分支上进行的唯一更改?

主题分支可能已经合并到master。

用例是指有人想在合并后的6个月内看到该主题分支的唯一更改。

3 个答案:

答案 0 :(得分:2)

如果主题分支合并为fast-forward merge,则无法执行此操作,因为无法确定主题分支的启动位置。

然而,在许多情况下,合并将不是快进合并,因为在主干分支正在开发时,在主干上进行了提交。在这种情况下,将会有一个合并提交,这使我们能够实现您的要求:

如果合并主题分支的提交由commit-ish $topic_merge表示,那么您可以这样做:

git log $topic_merge --not $topic_merge^

这将排除合并之前的主干(即合并提交的第一个父级)及其所有祖先的所有提交。

请注意,这也可以写为

git log $topic_merge ^$topic_merge^

git log $topic_merge^..$topic_merge

虽然在使用zsh时,您可能必须避免在第一种情况下扩展文件名:

git log $topic_merge \^$topic_merge^

这甚至适用于octopus merges,因为它将显示合并带来的任何分支的所有更改,这些更改尚未在主干中。

唯一的缺点是它可以包含合并到主题分支中的任何其他提交。如果您不想包含这些,那么您需要再次依赖合并提交的存在,以便将主题分支提交与合并到主题中的提交区分开来。这需要递归完成,结果从上面给出的结果中减去。

答案 1 :(得分:0)

我遇到了各种日志选项,用于处理cherry-pick {able,ed}提交,我很确定一些变体

git log --decorate --oneline --cherry   master...topic

将在这里服务(注意三个点)。

供参考,git loggit revisions(指定修订和修订集的方法)文档。

要查找topicmaster的最新记录合并,无论topic ref是否已被删除,

git log --oneline -1 --first-parent --merges --grep="^Merge branch 'topic'" master

并记住它供以后使用,例如

merge=$(git log --pretty=%H -1 --first-parent --merges --grep="^Merge branch 'topic'")

所以你可以

git log --decorate --oneline --cherry   $merge^...$merge^2

其他选择:

在通常情况下,topic仍处于活动状态,您只关心与他人合并的变化:

git diff master...topic

如果topic参考号已被删除,请查找mastertopic的最新记录合并,即如果您在此处处理考古案例:

git log --oneline -1 --first-parent --merges --grep="^Merge branch 'topic'" master

您可以使用

为合并和merged-tip提交ID设置变量
merge=$(git log --pretty=%H -1 --first-parent --merges \
              --grep="^Merge branch 'topic'"   master)
topic=$(git rev-parse -q --verify $merge^2)

编辑:总有一天我保证我会停止提供键盘到编辑框的命令。以上工作现在。

如果您决定不记录合并,那么当然没有合并的记录。

记录的合并可能会使提交图形变得混乱,如果有很多这样的合并可能会使其难以理解;此外,提交消息主题旨在足以确定其中所完成工作的范围。所以git通常在可能的情况下更喜欢线性历史。为了避免依赖于提交主题,要确保在祖先链中记录行政上重要的边界(对于大型项目,这通常是一个非常好的主意),进行合并并指定--no-ff

获取当前topic提示或未通知其最近合并的提示:

topic=$( git rev-parse -q --verify refs/heads/topic \
         || git rev-parse -q --verify $( git log --pretty=%H \
                            -1 --first-parent --merges  \
                            --grep="^Merge branch 'topic'"   master)^2 )

$topic分支中第一次提交主人:

first=`git rev-list master..$topic --reverse --first-parent | sed q`

该提交的第一个父级是来自master的分支点:

branchbase=`git rev-parse $first^`

显示自历史首次分歧以来$主题的所有更改:

git diff $branchbase..$topic

答案 2 :(得分:-1)

我相信这里的答案是不可能的。

原因是git没有跟踪最初创建分支的位置。分支只是一个指向分支尖端的指针。

因此,如果自最初创建主题分支以来已对主题分支进行了merge-commits,则无法明确说明哪个提交启动了分支。