我在develop
中删除了一堆文件,这些文件已在master
中修改过。我想将master
合并到develop
,但我收到了合并冲突,因为两个分支都修改了同一个文件。
如何将master
合并到develop
,并接受develop
中的所有更改?我按this quesiton尝试了git merge -s recursive -X ours master
,但我仍然遇到了很多冲突。我尝试了git merge -s ours master
,但我得到了一个空提交。
答案 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 add
或git rm
时被清理并存放。
一旦解决了所有高级别和低级别冲突并且所有分辨率都已git add
编辑(或git rm
,如果适用),运行git add
将完成合并。此提交在此时采用索引中的任何内容。
答案 1 :(得分:0)
使用合并工具。这是一个例子:
git mergetool --tool emerge
命令:
a-选择A
中的变化b-选择B中的变化
n-下次更改
p-之前的变化
q-完成合并
将来我只会合并为主人。有一个Master和Develop分支,然后分支开发,当你想更新master,合并开发成master。然后以这种方式继续。