Git互动合并?


77

我有两个具有完全相同文件的分支(以防您想知道它是一个.sql文件),并且我想交互式地合并它。

我几乎想像在发生冲突(或命令行)时一样打开一个diff程序,并精确选择行的位置。

反正有这样做吗?

Answers:


84

是的,但这主要是通过手动实现。您将告诉Git您正在合并两个相关的分支,但是它不应该尝试自己提交结果(编辑为添加:如果认为合并是微不足道的,也不能进行快速转发):

git merge --no-commit --no-ff branch-to-merge

然后,您将询问git出现在两个分支中的文件:

git show HEAD:filename >filename.HEAD
git show branch-to-merge:filename >filename.branch

及其合并基础,

git show `git merge-base HEAD branch-to-merge`:filename  >filename.base

您将使用所需的任何工具合并它们(例如)

meld filename.{HEAD,branch,base}

您将分阶段(git add filename),然后提交合并(git commit)。


2
想知道格雷厄姆(Graham)的同一件事...我试图做git merge --no-commit branch,最终将它合并了...我想要的是最终得到3个文件或2个文件。我可以使用diff并将所有想要的内容移到该文件中。
史蒂文

如果您希望原始的merge命令将所有内容保留为手动完成,可以将其git merge -s ours保留为当前分支中的所有内容,但是可以确保其他文件中的更改完全由您决定。
Phil Miller 2012年

@史蒂文; 我认为,您的想法是您忽略合并的文件,而使用HEAD和分支文件,即您追求的“两个文件”是HEAD:filename和branch-to-merge:filename。
Adrian Mouat 2013年

7
Git Gotcha:git merge --no-commit --no-ff完全不会提交任何内容,请参阅下面的@ Brad-O答案。您必须包括--no-ff
罗恩·韦特伦

1
@Kootoopas:是
菲尔·米勒

41

最简单的方法是做git merge <other_branch然后git mergetool以图形方式解决冲突。有关如何设置mergetool的信息,请参见#10935226

问题是,您更改的文件可能会与较旧的文件快速合并。然后,您必须变得更加聪明。

Novelocrat提供了一种更好的方法来进行更深入的了解,但是您通常必须将初始命令更改为git merge --no-commit --no-ff <other_branch>--no-commit的真正含义是“不要提交合并……除非它是快速合并。” 对于很多想完全按照自己的意愿做事的人来说,这有点像毒刺。

有时,最令人困惑的方法不是很时髦:在另一个工作副本中签出另一个分支,使用您喜欢的合并工具在所需目录中获取所需版本,然后提交。


12
这个问题的号码是10935226。你在那写什么意思?
Mathieu K.

32

按照这个要点,temp可能是现有分支。

https://gist.github.com/katylava/564416


在母版上:

git checkout -b temp

在温度下:

git merge --no-commit --no-ff refactor

…分阶段进行,所以:

git reset HEAD

然后开始添加所需的片段:

git add --interactive

1
这行得通,但是我不得不在“ git reset head”中省略“ head”,但是git reset可以正常工作。
米卡2014年

决赛git commit不做合并!–如何最终完成合并?
罗伯特·西默

@RobertSiemer也许我想您可以在下一步中进行常规合并:git co master; git merge temp
Victor Choy

不错的部分是patch来自的选项git add --interactive,如git book所述,它允许您暂存diff的各个部分。
djvg

29

从您要合并到的分支中:

git checkout -p branch_to_merge --

这不会签出branch_to_merge,但可以让您从补丁(diff)中交互地添加块。

http://git-scm.com/docs/git-checkout


1
这对于交互式合并非常易于使用-谢谢!
cbcoutinho

这正是我想要的。为什么这不是公认的答案?
iliis

此命令显示每个“大块”(分组在一起的文件中的差异)以及使用或不使用的“是”或“否”选项。很有用。
Mark Lakata

对于您在分支上已经完成但不在母版上的所有操作,这假定应将其删除。那不是最明智的合并策略。
Anne van Rossum

0

您可以简单地使用WinMergeDiffMerge或任何可用的diff / merge UI工具来手动完成工作。如果要将其连接到“ git difftool”,则可以在线搜索以找到使这些工具与git一起使用的方法。


0

我发现做到这一点的最好方法是:

  1. 签出您所做的更改与分支
  2. 从这一点创建一个新分支
  3. 将新分支重置为要比较并建立的提交。默认情况下,该重置将是“混合”重置,这意味着它不会更改“工作树”,即实际的代码文件
  4. 此时,我的文本编辑器(VSCode)向我显示了当前文件与重置为的提交之间的区别。我可以编辑代码以选择要提交的行。这样做是让我看到分支更改的所有内容,并确认将提交的每一行代码。这很有用,例如在将更改合并回生产之前。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.