2017-04-17 66 views

回答

0

UPDATE - 增加了一些澄清差异为基础的方法

这有点误导地说,第二父是在一个正常的合并所有更改源。可能存在手动冲突解决方案,或者某人可能只合并--no-commit选项,并在合并期间引入其他更改。更广泛地适用于考虑合并方式与每个父母的区别,而不是考虑哪个父母介绍每个变更。

然而,它可以是有用来思考“这种变化从何而来”。取决于您可以从以下其中一个开始之后确定哪些信息:

1)git blame会告诉您每行代码的来源提交。任何源于HEAD^..branchN提交的内容都必须在branchN上指示更改。但是,由于您提供的信息是每行代码的提交ID,因此需要进行相当多的后处理才能将更改归零。

2)你可以为每个分支做差异。本来我想

git diff HEAD^ HEAD^2 

等(与每个分支合并的引用代替HEAD^2)。这是可以的,除非主分支自其他分支发散以来发生了很大变化(在这种情况下,这些变化的倒数会出现在每个差异中)。

真的要求的是每个分支尖端和该分支开始发散的点之间的差异;所以,如果你能找到“共同祖先”,也许只是使用:

git diff A HEAD^2 

(其中A是最新提交可达来自HEAD^HEAD^2)。虽然这是一种直接表达(对于一次分支)的确切含义,但它确实需要在每种情况下追踪共同的祖先。 (可能有一个很好的快捷方式,我没有想到;如果发生在我身上,我会回来一个更新。)

如果分支拓扑过于混乱,这可能仍然有点不清楚。例如,如果branch3实际上从branch2支,那么你就必须决定是否意味着差异比较branch3反对共同的祖先与HEADbranch2(前一种方法意味着一些改变将归因于两种branch2branch3)。

使用单个命令生成所有差异将会很好,并且表面上这是logshow将会执行的选项-m;但是这把我们带回到我的答案的开始,因为你要与各分支(不是每个分支引入的变化)合并的差异并有精神上否定每一个变化。 (即您必须查找其差异不包含包含更改以了解更改来自哪里的一个分支)。

+0

这家长版本比较的方法甚至可以到双亲合并应用,以区分真正从那些合并过程中引入的另一个分支出来的变化,顺便...... –

+1

注意'git的日志-p - m“或”git show -m“在合并提交时将显示每个父代的一个差异。如果'path/to/file.ext'中的行* L *在merge-vs-parent1和merge-vs-parent2中有所不同,但不在merge-vs-parent3中,则通过* to * line * L * parent3。由于章鱼合并策略拒绝允许冲突合并,这是一个相当不错的选择。 – torek

+0

@torek - 对于一组重要的修补程序,我不希望对每个更改(如果您与合并提交进行比较时需要执行的操作)进行负面工作来确定“哪个N diff不包含此内容” 。针对第一个父级运行diff(而不是针对合并提交)会有所帮助,但我对此的看法越多,我也不太喜欢它(因为每个diff都会包含与“first父母“分支(如果有的话))。直接查看分支变化的最直接方法:比较分支尖端和共同祖先。但是,每个分支都必须完成。 –

相关问题