如果发生冲突,防止git pull修改文件?

时间:2018-06-07 04:34:55

标签: git git-pull

当我运行git pull并且存在冲突时,git会将“冲突标记”插入到我的文件中,并将文件状态设置为某种pending-merge或某些sutch。就个人而言,我发现这真的很烦人,因为我可以访问很多更好的方法来解决冲突,而不是尝试解码它认为合并来自平面文本文件的内容。

有没有办法阻止git生成这些标记?具体来说,我希望所有命令,包括裸git pull,如果发生冲突,无论什么状态开始,都不会做任何事情。

暗示我正在寻找的是改变git配置。对我的工作流程的更改(例如“在拉动之前总是提交”)不是我正在寻找的。

理想情况下,我希望它对我的本地文件完全没有任何作用,如果它不能完全清除合并,而只是打印错误并告诉我自己修复它。

2 个答案:

答案 0 :(得分:2)

有几种方法可以解决这个问题。

首先要习惯它。这些是大多数合并工具使用的标准冲突标记。你会看到很多。

  

[我想使用我已经在另一个窗口中打开的编辑器来解决冲突]

一个好的编辑器会看到文件在磁盘上的更改时间并显示冲突的版本。如果您的编辑器不这样做,可能是一个配置选项,或者它可能是一个具有更好的文件系统感知的新编辑器的时候。许多编辑都了解这些标记,并将提供语法着色和其他帮助。例如,Atom开箱即用。

enter image description here

如果您喜欢合并工具,则可以通过配置然后在发生冲突时运行git mergetool来使用它。 Git将启动您配置的合并工具,您可以使用它来解决冲突。这包括在编辑器中打开文件。

如果没有现有的合并工具适配器可以执行您想要的操作,则可以编写一个。请查看vimdiff示例,以及this answer demonstrating writing your own merge tool

然后,首先有各种方法可以避免git pull上的冲突。

一个是不对master进行任何提交。而是在功能分支中完成所有工作。这些是您为处理单个功能或错误而创建的分支。即便是简单的。他们将你的工作与其他人分开,直到你完成为止。在分支中工作,直到功能完成。

# After `git checkout -b feature` and some commits.
          [origin/master]
A - B - C [master]
         \
          D - E - F [feature]

与此同时,您可以git pull master根据需要随时更新。如果没有本地更改,则不会发生冲突。

# After `git pull` on `master` to get other's work.
                  [origin/master]
A - B - C - G - H [master]
         \
          D - E - F [feature]

您可以使用git rebase master的其他人的最新作品更新您的功能分支,以便在master之上重播您的工作。使用rebase代替merge可以避免不必要的合并,这些合并只是簿记并简化了历史记录。

# After `git rebase master`
                  [origin/master]
A - B - C - G - H [master]
                 \
                  D1 - E1 - F1 [feature]

feature完成工作后,最后一次更新master,合并功能分支,然后按master。使用git merge --no-ff feature保留特征分支的存在以供将来考古。

# After `git merge --no-ff feature`
                 [origin/master]
A - B - C - G - H ------------- I [master]
                 \            /
                  D1 - E1 - F1 [feature]

# After `git push`
                                  [origin/master]
A - B - C - G - H ------------- I [master]
                 \            /
                  D1 - E1 - F1 [feature]

然后删除分支。历史的地形将保留其存在。这有助于未来的代码考古学家通过显示哪些提交被组合在一起作为单个功能来理解您的代码。

                                  [origin/master]
A - B - C - G - H ------------- I [master]
                 \            /
                  D1 - E1 - F1

最后,如果真的希望按照自己的方式进行操作,则可以使用git checkout --ours来检查您的干净版本。它是“我们的”,因为当你git pull时,你真正在做git fetch + git merge origin/mastermaster是“我们的”,origin/master是“他们的”。

我不建议这样做,因为您现在必须自己手动执行合并,从而无法使用合并工具。你很可能会犯一个错误导致更多的冲突。

答案 1 :(得分:1)

git中的常用工作流程是在合并失败后调用git mergtool。可以使用您喜欢的任何程序调用Mergetool:kdiff3bcomparep4merge按命令:

git mergetool [--tool=<tool>]. 

您甚至可以使用一些自定义工具。设置默认的合并工具

 git config --global merge.tool [tool]

阅读有关配置的there

相关问题