git - 两个分支添加的相同文件会导致奇怪的合并冲突

Bra*_*one 20 git git-merge merge-conflict-resolution

我目前有两个分支机构,我正在研究.由于软件更新,我必须完全更改文件夹结构.因此我在两个分支中移动文件.现在我达到了一个点,我想将我的工作分支合并到我的主分支中.

问题是存在合并冲突,告诉我文件仅由一个分支(added by themadded by us)添加.问题是两个分支都添加了该文件.

例如,我有一个纹理textures/texture1.png.主分支刚刚将其移动到正确的位置(之前misc/textures/texture1.png).工作分支将其移动到完全相同的位置并在之后进行编辑.此文件的合并冲突说:

    added by us: textures/texture1.png
Run Code Online (Sandbox Code Playgroud)

关键是这不是我想要的文件!我想要来自其他分支的文件!
当我做

git checkout --theirs textures/texture1.png
Run Code Online (Sandbox Code Playgroud)

我明白了

error: path 'textures/texture1.png' does not have their veresion
Run Code Online (Sandbox Code Playgroud)

但是这个文件确实存在!我最近加了!这就是我想要的文件

我该如何解决这些冲突?

(如果需要更多信息!)

max*_*s ツ 13

你可以随时试试

git mergetool
Run Code Online (Sandbox Code Playgroud)

这将打开一个GUI,您只需单击相应的链接即可选择所需的更改.有时您需要进行手动更改.但在您的情况下,您只需选择一个文件图像.


mna*_*gel 8

a--b--c--M--d--f--E--g--h--i  <<< master
    \
     \
      x--M'--y--z              <<< you
Run Code Online (Sandbox Code Playgroud)

你的情况看起来有点像上面(M和M'是提交移动而E是编辑纹理的提交)?你尝试合并z/i和git并不是很开心.

您可能会尝试在临时分支上将M与M'合并

a--b--c---M--d--f--E--g--h--i  <<< master
    \      \
     \      X                  <<< helper
      \    /
       x--M'--y--z             <<< you
Run Code Online (Sandbox Code Playgroud)

然后将helper("X")与您("z")和master("i")合并.

a--b--c---M--d--f--E--g--h--i     <<< master
    \      \                 \ 
     \      X-----XX---------XXX  <<< helper
      \    /      /
       x--M'--y--z                <<< you
Run Code Online (Sandbox Code Playgroud)

这种方式冲突在创建后不会被直接解决.通常这会更容易,因为冲突会随着时间的推移而增长.


use*_*246 5

解决冲突时,仅需使用git checkout正确的树形(分支名称,标记,提交的sha1 ...)即可从中获取文件:

git checkout theirBranchYouAreMerging -- textures/texture1.png
Run Code Online (Sandbox Code Playgroud)

如果您不希望所有“他们”的更改,则可以部分取消。为此,您需要git reset -p有选择地从索引中删除任何不需要的更改,然后git checkout也将它们从工作目录中删除:

git checkout theirBranch -- some/file.txt
git reset -p -- some/file.txt
git checkout -- some/file.txt
Run Code Online (Sandbox Code Playgroud)