92

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

几乎我想打开一个差异程序,就像我在发生冲突(或命令行)时所做的那样,并准确选择哪些行去哪里。

有没有办法做到这一点?

4

6 回答 6

90

是的,但主要是通过手动实现。你会告诉 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)。

于 2012-06-07T15:51:29.973 回答
42

最简单的方法是以图形git merge <other_branch方式git mergetool解决冲突。有关如何设置合并工具的信息,请参阅#10935226 。

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

Novelocrat 提供了一种深入挖掘的好方法,但您通常必须将初始命令更改为,git merge --no-commit --no-ff <other_branch>因为 --no-commit 的真正意思是“不要提交合并……除非它是快进合并。” 对于很多想要做你想做的事的人来说,这有点刺痛。

有时,最不令人困惑的方式不是很时髦:在不同的工作副本中检查另一个分支,使用您最喜欢的合并工具在您想要的目录中获取您想要的版本,然后提交它。

于 2013-07-19T20:06:54.240 回答
40

从您要合并到的分支:

git checkout -p branch_to_merge --

这不会检出 branch_to_merge,但会让您以交互方式从补丁(差异)中添加大块。

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

于 2015-05-27T20:37:21.887 回答
36

根据这个要点, temp 可能是现有的分支。

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


在主人:

git checkout -b temp

在温度:

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

… 将所有内容分阶段,所以:

git reset HEAD

然后开始添加你想要的部分:

git add --interactive
于 2014-03-13T22:24:33.880 回答
0

您可以简单地使用WinMergeDiffMerge或任何可用的 diff/merge UI 工具手动完成工作。如果你想把它挂在“git difftool”中,你可以在线搜索以找到使这些工具与 git 一起使用的方法。

于 2012-06-07T16:02:15.633 回答
0

我发现这样做的最好方法是:

  1. 使用您的更改签出分支
  2. 从该点创建一个新分支
  3. 将您的新分支重置为您想要比较和构建的提交。默认情况下,重置将是“混合”重置,这意味着它不会更改“工作树”,即实际的代码文件
  4. 此时,我的文本编辑器 (VSCode) 向我展示了我当前文件和我重置到的提交之间的不同之处。我可以编辑代码以选择要提交的行。这样做是让我看到我的分支发生的所有变化并确认我将提交的每一行代码。这很有用,例如在将我的更改合并回生产之前。
于 2018-01-12T02:09:37.437 回答