git:通过接受我的更改来解决合并冲突

时间:2017-08-23 20:52:19

标签: git merge

我在develop中删除了一堆文件,这些文件已在master中修改过。我想将master合并到develop,但我收到了合并冲突,因为两个分支都修改了同一个文件。

如何将master合并到develop,并接受develop中的所有更改?我按this quesiton尝试了git merge -s recursive -X ours master,但我仍然遇到了很多冲突。我尝试了git merge -s ours master,但我得到了一个空提交。

2 个答案:

答案 0 :(得分:2)

正如一些快速背景,当你运行git merge otherbranch时:

  • Git检查提交图,通常看起来只是更复杂:

    ...--o--B--o--o--L   <-- yourbranch
             \
              o--o--o--R   <-- otherbranch
    

    我在这里标记了三个特定的提交, B ,它是合并基础 L ,它是左侧或本地或{ {1}}提交, R 是右侧或远程或--ours提交。

  • 然后Git或多或少地运行两个--theirs命令,如:

    git diff
  • 然后,合并过程本身包括获取这两个差异中每个变化的一个副本。对于仅在B-to-L中修改或仅在B-to-R中修改的文件,这非常简单:Git可以只获取该文件的L或R版本。对于根本没有修改的文件,Git可以采用文件的B,L或R版本,因为它们之间没有任何区别。它只是在L和R中以某种方式改变的文件,相对于B,需要努力工作(“低级别”合并)。

然而,最大的问题出现在你遇到像你这样的情况时:文件在一侧是修改,但在另一侧完全删除。 Git不清楚是通过单独更改行还是完全删除文件来解决这个问题。 (如果文件在B-to-L和B-to-R中重命名,但是在两个不同的名称中重命名,或者如果在B-to-L和B-中都添加了新文件,则会出现同样的冲突to-R,但相同的名称。)

我称之为高级冲突,Git无法解决这些冲突,即使使用git diff --find-renames B L > /tmp/diff.B-to-L git diff --find-renames B R > /tmp/diff.B-to-R -Xours也是如此。对于单个文件中的冲突 - 我称之为低级别冲突,其中一些-Xtheirs在双方都有重叠的变化 - Git通常会因冲突而停止,但使用eXtended选项{ {1}}或file.ext,Git会支持针对特定冲突的“我们的”或“他们的”变更。

但是,如果出现高级别冲突,则必须自行解决。如果要删除文件的正确分辨率,请运行-Xours。如果要保留修改后的文件,请运行-Xtheirs。如果正确的解决方案是别的,那么执行其他操作,然后git rm <filename>生成的文件。请注意,这些git add <filename>和/或git add操作适用于索引,从当前工作树复制文件。冲突的文件由额外的索引条目表示;这些额外的条目会在您git addgit rm时被清理并存放。

一旦解决了所有高级别和低级别冲突并且所有分辨率都已git add编辑(或git rm,如果适用),运行git add将完成合并。此提交在此时采用索引中的任何内容。

答案 1 :(得分:0)

使用合并工具。这是一个例子:

git mergetool --tool emerge

命令:

a-选择A

中的变化

b-选择B中的变化

n-下次更改

p-之前的变化

q-完成合并

info on emerge

将来我只会合并为主人。有一个Master和Develop分支,然后分支开发,当你想更新master,合并开发成master。然后以这种方式继续。