git中跨分支的等效更改的簿记清理

git中跨分支的等效更改的簿记清理,git,cherry-pick,Git,Cherry Pick,我正在尝试清理大量主题分支,主要是为了使github中的master的分支概览不再由于存在相同的更改而在非活动主题分支中显示虚假的“n ahead”指示器 如果没有这些虚假的指标,这个概览页面将提供一个很好的方法,可以一目了然地查看来自旧主题分支的任何提交是否被无意中遗漏,并且没有合并回主 在下图中,Y是分支中的提交主题,后来作为Y'应用于master(因此它们有不同的sha1哈希,但补丁ID相同) 但是如果我试图通过从master发出git合并主题来解决这个问题,我会得到一个合并冲突,因为ma

我正在尝试清理大量主题分支,主要是为了使github中的
master
的分支概览不再由于存在相同的更改而在非活动主题分支中显示虚假的“n ahead”指示器

如果没有这些虚假的指标,这个概览页面将提供一个很好的方法,可以一目了然地查看来自旧主题分支的任何提交是否被无意中遗漏,并且没有合并回

在下图中,
Y
是分支中的提交
主题
,后来作为
Y'
应用于
master
(因此它们有不同的sha1哈希,但补丁ID相同)

但是如果我试图通过从
master
发出
git合并主题来解决这个问题,我会得到一个合并冲突,因为
master
中的change
E
已经改变了补丁应用的上下文


有没有办法告诉
master
“嘿,你真的已经有了
Y
,这样你就可以停止报告你没有的了。”?(能够以自动/编程的方式执行这一操作是关键的。)

< p>这是一个奇怪的步骤,因为它是一个公开的回购,但考虑了一个解决方案:“代码< >回复<代码>,<代码>合并<代码>,计数器>代码>回复< /代码>。 在
master
上,分别恢复E和Y'以将
master
恢复到其在C处的状态(提交消息表示您正在引入一个被遗忘的主题分支,而不是删除更改):

记下E的revert commit的sha1,或
git标记revert\u E sha1
it

现在,您可以将
主题
合并到
母版

git merge topic
此时主题已正确合并,并且
master
已返回到其在Y/Y之前的状态,您现在可以
revert
E的revert commit来恢复它:

git revert revert_E

这将完全适用,因为
master
与您最初提交E时处于相同的状态(该状态的历史记录刚刚更改)。感觉有点杂技,但可以解决你的问题。我想不出任何更干净的方法。

通过将--cherry pick选项传递给git log,您可以看到分支之间修订的有效差异

我最喜欢的咒语是:

git log --left-right --graph --cherry-pick --oneline branch1...branch2
(我的别名是
git-lr

发件人:

当提交集受到对称差异的限制时,忽略任何在“另一端”引入与另一个提交相同更改的提交

例如,如果您有两个分支,A和B,则通常使用
--left-right
(请参见下面对
--left-right
选项的说明中的示例)只列出其中一侧的所有提交。但是,它显示了从另一个分支中挑选的提交(例如,“b上的第三个”可能是从分支A挑选的)使用此选项,这些提交对将从输出中排除

--cherry-mark 
--cherry pick
(见下文)类似,但用
=
标记等效提交,而不是省略它们,用
+
标记不等效提交


永久解决方案#1 为了使git永远不再担心那些实际上是由cherry挑选的提交,您可以始终合并其他branh。合并提交将被标记为前一次提交的子版本和合并版本树的顶端的子版本

这会告诉修订树遍历在该点停止遍历历史。这样做只有在合并来自“其他”分支的修订时才是安全的,前提是您**知道它的所有父级都已合并(只要您希望合并)

永久解决方案#2 还有一些。这实际上意味着,您将告诉git(带外)某个修订版是另一个修订版的子版本,而不必实际重新设置它的基础/合并它

如中所示,包含成对sha1散列的手写文件:)

关于这一点,积极的一面是,你没有重写历史来让它工作。但是,如果您愿意,可以使用。此时,您不再需要grafts文件,但当然,您将面临重写历史记录(以及可能使已发布的修订ID无效)的缺点

零头? 如果所有其他方法都失败了,有时您可能会遇到经常需要合并的远程(主题)分支,但有些差异是您根本不想接受的。这些可能会一次又一次地导致相同的合并冲突

在这种情况下,我只想指出哪一点可以使生活变得相当简单,尽管更复杂
我不知道为什么我以前没有想到这一点,但只要相同的变更列表是
master
topic
之间的唯一区别,
git merge-s我们的主题
master
将很容易解决问题。合并显然将在没有冲突的情况下应用,并且合并的存在将消除虚假的未合并指示器


我的github branch overview页面现在没有误导性的“n ahead”指示器,因此真正的未合并提交将清晰可见。

不确定它是否相关,但X是否也存在于master中?或者它只是在主题中?也许您可以将主题分支中的Y提交修改为主文档中的Y提交?嗯,不确定。。。只是大声思考。似乎您需要一种方式来表示主题中的Y在master中是Y……在大多数情况下,
X
是否在
master
中并不相关。如果不是,它几乎总是一个变更列表,影响与
Y
Y'
正交的文件。所有这些提交都是发布的,所以我不想做任何重写历史的事情。这是一个
git revert revert_E
git log --left-right --graph --cherry-pick --oneline branch1...branch2
--cherry-pick 
--cherry-mark