【问题标题】:How do I resolve a conflict after git pull?git pull 后如何解决冲突?
【发布时间】:2010-11-28 23:25:53
【问题描述】:

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 conflict git-merge git-pull


【解决方案1】:

您不需要合并工具。它可以很容易地手动解决。

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

如果您只想使用远程提交的版本,那么您只需将未写入的副本移动到位并git add它。


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

【讨论】:

  • 谢谢!你帮我解决问题。请问我的mergetool有什么问题吗?谢谢和问候!
  • 很可能您没有配置合并工具。使用 git config --global mergetool.[tool].cmd = [命令行调用] 您可以使用许多差异工具,如 kdiff3、tkdiff、xxdiff 或许多其他工具。见gitguru.com/2009/02/22/integrating-git-with-a-visual-merge-tool
【解决方案2】:

我认为您只是在命令行中忘记了“-t”开关。根据 git 帮助页面,它代表“-t,--tool=”,所以它可以实现您想要的。

试试:

git mergetool -t gvimdiff

当然你可以用你喜欢的合并工具代替我的 gvimdiff,meld 也很棒...

【讨论】:

  • 如果对开关 -t 的实际作用以及为什么它解决了问题有一些解释,这将是一个更好的答案。
  • @Stewart 完成。感谢您的洞察力!
【解决方案3】:

如果您从项目的子目录运行合并,git 将为您的整个项目运行合并。但是,mergetool 只能查看(和合并)工作目录中或下面的文件。因此,如果发生这种情况,请确保您尝试从项目的顶级目录运行冲突解决方案。

【讨论】:

    【解决方案4】:

    如果我只是想让 git pull 的版本覆盖所有内容怎么办? 如果你只想这样,你应该使用:

     git fetch
     git reset --hard origin/your-branch-name
    

    【讨论】:

    • 是的,它应该是硬重置。
    【解决方案5】:

    如果您有适当的分支策略 - 也就是将功能合并到 develop 中,就在 merge rebased 等之前,通常当您想在分支上运行 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
    

    您也可以代替 stash 将当前状态放入 tmp 分支...但最终如果存在冲突,您将不得不手动解决它们...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-27
      • 2023-03-21
      • 2018-08-04
      • 2016-12-01
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多