我必须在
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
的版本覆盖所有内容怎么办?
为此您不需要 mergetool。手动即可轻松解决。
您的冲突是您的本地提交添加了一个文件
vision_problem_8.h
,远程提交也通过从 vignette_generator_mashed.h
重命名创建了该文件。如果您运行 ls -l vision_problem_8.h*
,您可能会看到 git 为您保留的该文件的多个版本。其中一个将是您的,另一个将是远程版本。您可以使用编辑器或任何您喜欢的工具来解决冲突的内容。完成后,git add
受影响的文件并提交以完成合并。
如果您只想使用远程提交的版本,那么您可以将未写入的副本移动到适当的位置并
git add
它。
关于合并工具,请查看
git help mergetool
。基本上,它将尝试运行其中的每一种可能性,直到找到一种,或者使用您已明确配置的一种。
我想你只是忘记了命令行上的
-t
开关。根据 Git 的帮助页面,它代表 -t <tool>, --tool=<tool>
,所以它实现了你想要的。
尝试:
git mergetool -t gvimdiff
当然,您可以使用您喜欢的合并工具而不是我的,
gvimdiff
。 Meld也很棒...
如果您从项目的子目录运行合并,git 将为您的整个项目运行合并。但是,mergetool 只能查看(并合并)工作目录中或以下的文件。因此,如果发生这种情况,请确保您尝试从项目的顶级目录运行冲突解决方案。
如果我只是想要 git pull 中的版本覆盖所有内容怎么办? 如果你想要这样,你应该使用:
git fetch
git reset --hard origin/your-branch-name
如果你有一个正确的分支策略 - 又名功能被合并到开发中,就在合并重新基等之前,最常见的是当你想在分支上运行
git pull
时,你基本上想从git服务器获取所有新东西,然后应用你自己的东西,这就是 git 通用语言,是这样的:
# 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
您也可以将当前状态放入 tmp 分支,而不是存储...但最终如果存在冲突,您将必须手动解决它们...