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

Git 显示对主题分支的唯一更改(即使它已合并到主分支),git,Git,如果存在主题分支,是否有方法显示在该分支上所做的唯一更改 主题分支可能已经合并到主目录中 用例是如果有人想在该主题分支被合并6个月后看到它的独特变化。我相信这里的答案是这是不可能的 原因是git没有跟踪分支最初创建的位置。分支只是指向分支尖端的指针 因此,如果自主题分支最初创建以来已对其进行了合并提交,则无法确定是哪个提交启动了该分支。如果主题分支被合并为,则无法执行此操作,因为无法确定主题分支的启动位置 但是,在许多情况下,合并不会是快进合并,因为提交是在主题分支开发期间在主干上进行的。在这种

如果存在主题分支,是否有方法显示在该分支上所做的唯一更改

主题分支可能已经合并到主目录中


用例是如果有人想在该主题分支被合并6个月后看到它的独特变化。

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

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


因此,如果自主题分支最初创建以来已对其进行了合并提交,则无法确定是哪个提交启动了该分支。

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

但是,在许多情况下,合并不会是快进合并,因为提交是在主题分支开发期间在主干上进行的。在这种情况下,将有一个合并提交,这允许我们实现您要求的:

如果合并主题分支的提交由
$topic\u merge
表示,则您只需执行以下操作:

git log $topic_merge --not $topic_merge^
这将排除合并前主干中的所有提交(即合并提交的第一个父级)及其所有祖先

注意,这也可以写成

git log $topic_merge ^$topic_merge^

尽管在第一种情况下,使用时可能必须避免文件名生成扩展:

git log $topic_merge \^$topic_merge^
这甚至适用于,因为它将显示合并引入的任何分支中尚未在主干中的所有更改


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

我在使用cherry pick{able,ed}提交时遇到了各种日志选项,我非常确定

git log --decorate --oneline --cherry   master...topic
将在此处提供(请注意三个点)

供参考,和(指定修订和修订集的方式)文档

要查找
主题
的最新记录合并,无论
主题
参考是否已被删除

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
其他选择:

在普通情况下,
主题
仍然处于活动状态,您只关心hunks merge使用的是什么更改:

git diff master...topic
如果
主题
参考文献已被删除,即如果您正在处理考古案例,则要查找
主题
的最新记录合并:

git log --oneline -1 --first-parent --merges --grep="^Merge branch 'topic'" master
您可以使用设置合并和合并提示提交ID的变量

merge=$(git log --pretty=%H -1 --first-parent --merges \
              --grep="^Merge branch 'topic'"   master)
topic=$(git rev-parse -q --verify $merge^2)
编辑:有一天我保证不再给editbox命令键盘。以上方法现在可以使用了

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

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

要获取当前的
主题
提示或获取最近合并的提示,请执行以下操作:

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`
提交的第一个父级是主节点的分支点:

branchbase=`git rev-parse $first^`
要显示自历史记录首次偏离以来$topic上的所有更改,请执行以下操作:

git diff $branchbase..$topic

不正确-您不需要
git
来跟踪分支的创建位置。为了澄清这一点,只要存在合并提交,就有可能。在没有合并提交的快进合并的情况下,您是对的,这在某些情况下是使用
--no ff
选项进行
git merge
的一个很好的论据。很抱歉,这个答案是错误的,所以您不应该接受它。您最初的问题没有说明合并是否是快进合并,因此正如我所解释的,在某些情况下是可能的。在某些情况下是可能的,但最初的问题不清楚,无法解释尝试合并的场景,因此此答案在技术上是不正确的。@ike-Huh?我从未声称我有一个通用的编程解决方案,OP也没有要求。所有这些都不妨碍我的答案是a)正确的和b)有用的,所以我不知道你的观点是什么。我也很难看出你的第二句话有什么意义;最初的问题要求提供一种显示更改的方式,而不是“了解”更改的方式(无论您的意思是什么)。是否由用户创建$topic\u merge commit?或者git会自动将其存储在某个地方吗?如果在主题分支的开发过程中在主分支上进行了提交,那么合并将自动导致合并提交,否则git将默认进行快进合并,除非使用了
--no ff
选项
git merge
。我将更新答案以澄清这一点。有用的信息,但我不认为我可以做我最初打算做的事情…能够识别已合并到master中的主题分支的唯一提交(在事实发生后确定唯一提交)@Jonathan.Brink为什么不能?你是说你的主题合并是一个快进合并吗?这是唯一能阻止它发生的事情。请重新考虑
git diff $branchbase..$topic