我认为我的情况应该很普遍,必须有更简单的方法来做我所做的事情。 假设有两个分支,current
和 next
,用于两行开发。 目前阶段,next
接收所有来自 current
分支的更改。 作为 next
分支的维护人员,我正在按照以下方式同步更改(因为需要进行 alpha 版本发布):
$ git co origin/next -b next
$ git merge origin/current
一些文件在
next
上更改了其格式,自上次同步合并以来对这几个文件的每个更改都导致冲突。为解决此冲突,我需要查看从上一次合并以来current
分支中的更改。通常会有很多文件已更改,但只有1或2个文件(如我所提到的)发生了冲突。
示例
假设current
分支上的文件baz.dat
包含方括号中的单词,例如[real]
[programmers]
[use]
[pascal]
在
next
分支中,语法更改要求单词用冒号括起来。:real:
:programmers:
:use:
:pascal:
current
分支上的更改已经向文件中添加了一行:
[real]
[programmers]
[don't]
[use]
[pascal]
每当合并冲突导致以下差异合并标记时:
<<<<<<< ours
:real:
:programmers:
:use:
:pascal:
=======
[real]
[programmers]
[don't]
[use]
[pascal]
>>>>>>>> theirs
整个文件内容被删除并替换,因为它从某种意义上说就是这样。
同样地,只有 git diff
显示所有传入的“their”行被删除,“our”行被添加:
$ git diff
<usual unified diff preamble>
+ :real:
... more lines with "+ " (our new) or " -" (their deleted) mark,
- [pascal]
我需要的是什么
一种查看自上次合并以来当前
(“他们”的)分支中发生了什么更改的方法,以便我可以手动将更改合并到下一个
(“我们的”)分支中。
$ git diff --magically-from-merge-point --theirs
<usual unified diff preamble>
+ [don't]
换句话说,我希望在这个例子中只添加一行,这样我也可以将其插入到新格式中。
(我的真实案例是领域特定语言的更改,但本质上与这个简单的例子非常相似)。
当前解决方案
我正在使用一系列相当笨拙的命令:
$ git status
. . . .
both modified: foo/bar/baz.dat <== copy/paste every conflict filename
$ git diff `git merge-base HEAD origin/current`..origin/current -- foo/bar/baz.dat
这里展示的是我想要的,但比较复杂,每次都需要构建和输入。用bash脚本编写很容易,但在此之前,我想问一下是否有更简单的方法来查看合并基础中的冲突变更?
(next)$ git merge origin/current
. . .
CONFLICT (content): foo/bar/baz.dat
(next|MERGING)$ git diff --magic-switch
而diff只会显示冲突文件的更改,作为合并基础和合并点之间的增量(在理想情况下,我会进一步限制使用例如--magic-switch --theirs
)
是否存在这样的魔法开关?看起来我错过了一些显而易见的东西!
git diff
命令会显示组合差异。但我发现这种方式难以阅读:我更喜欢将merge.conflictstyle
设置为diff3
,这样可以将基础(第一阶段)冲突文本保留在冲突文件中,同时也包含第二阶段(HEAD)和第三阶段(--theirs
)的文本。 - torek