如何解决git pull后的冲突?

56

我需要在 git pull 后解决一些冲突。

$ git pull
CONFLICT (rename/add): Renamed vignette_generator_mashed.h->vision_problem_8.h in 49423dd0d47abe6d839a783b5517bdfd200a202f. vision_problem_8.h added in HEAD
Added as vision_problem_8.h~HEAD_1 instead
Removed vignette_generator_cross_square.cc
Automatic merge failed; fix conflicts and then commit the result.

于是我上网搜索了一下,发现有人说可以使用git mergetool。但是我得到了以下结果:

$ git mergetool
merge tool candidates: meld kdiff3 tkdiff xxdiff meld gvimdiff emerge opendiff emerge vimdiff
No files need merging
$ git mergetool opendiff
merge tool candidates: meld kdiff3 tkdiff xxdiff meld gvimdiff emerge opendiff emerge vimdiff
opendiff: file not found

那这是否意味着我需要安装一些东西?

如果我只想使用git pull获取的版本覆盖一切,该怎么办?


有关Git提出和搜索合并工具的方式,请参见http://stackoverflow.com/questions/1064103/is-gits-auto-detection-scripted-or-is-it-within-some-git-executable(附加信息)。 - VonC
1
你可以在这里看到安装/设置mergetool的示例:https://dev59.com/KHRA5IYBdhLWcg3wyRJ7 - VonC
5个回答

25

对于这个问题,你不需要使用合并工具,可以手动很容易地解决。

你的冲突是你本地的提交添加了一个文件vision_problem_8.h,而远程提交也创建了一个文件,通过将vignette_generator_mashed.h重命名为vision_problem_8.h。如果你运行ls -l vision_problem_8.h*,你可能会看到git为你保留了多个版本的这个文件。其中一个是你的版本,另一个是远程版本。你可以使用编辑器或其他工具来解决冲突的内容。完成后,git add受影响的文件并提交以完成合并。

如果你只想使用远程提交的版本,那么你可以将你没有编写的副本移动到正确的位置,并用git add添加它。


关于合并工具,请查看git help mergetool。基本上,它将尝试运行包含的每个可能性,直到找到一个,或者使用你明确配置的工具。


谢谢!你帮我解决了问题。我还可以问一下我的合并工具出了什么问题吗?谢谢和问候! - Tim
1
很可能你没有配置合并工具。使用 git config --global mergetool.[tool].cmd = [命令行调用]。您可以使用许多 diff 工具,如 kdiff3、tkdiff、xxdiff 或许多其他工具。请参阅 http://gitguru.com/2009/02/22/integrating-git-with-a-visual-merge-tool/。 - Cesar

7

我觉得您只是在命令行中忘记了加上“-t”开关。根据Git帮助页面的说明,“-t,--tool=” 表示执行您想要的操作。

尝试执行以下命令:

git mergetool -t gvimdiff

当然,您可以使用自己喜欢的合并工具,而不是我的gvimdiff,meld也很棒...

1
如果能解释一下 -t 开关的作用以及为什么它可以解决问题,那么这将是一个更好的答案。 - Stewart
@Stewart 已完成。感谢您的见解! - mano2a0c40

5

如果你在项目的子目录中运行合并操作,git将为整个项目运行合并操作。然而,mergetool只能看到(并合并)工作目录下或以下的文件。因此,如果出现这种情况,请确保你正在尝试从项目的顶层目录运行冲突解决。


5
如果您只想使用git pull中的版本覆盖所有内容,可以使用以下命令:
 git fetch
 git reset --hard origin/your-branch-name

是的,它应该是硬重置。 - saferJo

0
如果您有一个适当的分支策略 - 即在合并重置等操作之前将功能合并到开发分支中,那么大多数情况下,当您想在分支上运行 git pull 时,您基本上想要从 git 服务器获取所有新内容,然后再应用自己的内容,这在 git 社区中被称为“lingua franca”。
# put all my changes on the stash 
git stash 

# fully reset the current branch to the state it is on the server
git clean -d -x -f ; git reset HEAD --hard ; git pull --force

# apply your own changes 
git stash pop

你也可以将当前状态放入一个临时分支,而不是隐藏起来...但是如果有冲突,最终你仍然需要手动解决它们...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接