Git:将更改合并到先前提交的正确方法(手动回放和重放?)

时间:2011-12-19 03:53:36

标签: git git-merge

我不确定在git中解决这种情况的正确方法是什么,无论我做什么,我都会得到奇怪的结果。

我有一个文件的版本X,在提交A中。随着时间的推移,这个文件已被修改,现在处于A'。

有人通过电子邮件向我发送了一个文件X',它是commitsh A中包含的文件的修改版本。重要提示:此更改是带外的(通过电子邮件而非git)并且已过时(更改)到该文件的早期版本。)

我确切地知道我在git术语中“想要”做什么,但我不确定是否有最简洁的方法:倒带,提交,重放。我认为它应该是那么简单,我知道git在它内部内部进行重新定位时,但我不能让它自己工作。

我做了什么:

  • 根据提交A。
  • 结帐并创建新分支B.
  • 复制并粘贴已更改的文件
  • 提交更改
  • 结帐分支主管
  • 合并分支B

我的问题是,分支B与主服务器的合并会导致文件中所有行发生冲突。

文件中的更改(我认为这就是原因)如下:

版本A:

line 1
line 2
line 3

分公司主人:

line 1, file 1
line 2, file 1
line 3, file 1

通过电子邮件发送文件:

line 1
line B
line 3

如您所见,分支主数据包括对所有行的更改,但行保持不变。带外更改是对第2行的修改。

合并告诉我文档中的所有行都是冲突的。我可以理解git是否根本无法在两个版本中合并第2行的更改,但我不明白为什么所有3行都被标记为冲突。

有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:1)

我认为你回答了自己的问题。

  

如您所见,分支主数据包括对所有行的更改

合并时,Git不知道哪组更改对您更重要。你必须自己做出这个选择。

答案 1 :(得分:1)

我不确定这是否是“正确的”解决方案,但除非采取其他解决方法,否则我会接受这一点:

通过配置git以使用外部差异/合并编辑器,在这种情况下,令人惊叹且功能强大的BeyondCompare3,我能够解决这个问题。 BC3具有更精细的“块”变化,检测同一行中的修改。虽然我仍然需要手动合并更改,但它只是将单独更改的行标记为已更改(尽管它确实显示Git已经检测到更大的周围块已修改,但它为我提供了覆盖它的选项)。 / p>

答案 2 :(得分:0)

如果我错了,请纠正我,但看起来你真的想要git rebase B作为最后一步,而不是git merge B

但是,对于所有三行,您可能仍然存在合并冲突,因为这些行彼此非常接近,因此git不希望假设冲突仅在第2行而不是第1-3行。