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