我该如何解决Git仓库中的合并冲突?
我该如何解决Git仓库中的合并冲突?
合并冲突可能会在不同的情况下发生:
git fetch
,然后运行git merge
git fetch
,然后运行git rebase
git pull
(实际上等于上述条件之一)git stash pop
您需要安装与Git兼容的合并工具来解决冲突。我个人使用KDiff3,我发现它很好用。您可以在此处下载其Windows版本:
https://sourceforge.net/projects/kdiff3/files/
顺便说一句,如果您安装了Git扩展程序,则在其安装向导中有一个选项可以安装Kdiff3。
然后设置Git配置以使用KDiff3作为其合并工具:
$ git config --global --add merge.tool kdiff3
$ git config --global --add mergetool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
$ git config --global --add mergetool.kdiff3.trustExitCode false
$ git config --global --add diff.guitool kdiff3
$ git config --global --add difftool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
$ git config --global --add difftool.kdiff3.trustExitCode false
(记得将路径替换为KDiff3 EXE文件的实际路径。)
然后,每当您遇到合并冲突时,只需运行此命令:
$ git mergetool
然后它会打开Kdiff3,首先尝试自动解决合并冲突。大多数冲突会自动解决,但您需要手动修复其余部分。
以下是Kdiff3的外观:
完成后,保存文件,程序将继续下一个存在冲突的文件,您需要重复以上步骤直到所有冲突都被解决。
检查是否已成功合并所有内容,只需再次运行mergetool命令即可,您应该会得到这个结果:
$ git mergetool
No files need merging
我知道什么是合并冲突,但当我看到git diff
的输出时,起初它对我来说像是一堆无意义的东西:
git diff
++<<<<<<< HEAD
+ display full last name boolean in star table
++=======
+ users viewer.id/star.id, and conversation uses user.id
+
++>>>>>>> feat/rspec-tests-for-cancancan
但是这里是帮助我的方法:
两个箭头之间的所有内容都在一个文件中,用=======分隔的所有内容都在另一个文件中
所以你要做的就是打开有合并冲突的文件,从任一分支中删除或使它们相同,然后merge
将立即成功。问题解决了!
我一直遵循以下步骤以避免冲突:
git checkout master
(来到主分支)git pull
(更新您的主分支以获取最新的代码)git checkout -b mybranch
(检出一个新分支并在该分支上开始工作,以使您的主分支始终保持在主干之上。)git add .
和 git commit
和 git push(在您的本地分支上进行更改后)git checkout master
(返回到您的主分支)现在,您可以执行相同的操作并维护任意多的本地分支,并通过只需在必要时对您的分支进行git checkout
来同时工作。
如果您还没有使用过Visual Studio Code进行编辑,请尝试一下。
当您尝试合并(并进入合并冲突)时,Visual Studio Code会自动检测到合并冲突。
它可以通过显示对原始文件所做的更改以及您是否应该接受“incoming”或“current change”(即合并前的原始文件)来帮助您。
它帮助了我,也可以为您工作!
PS:只有在您已经将Git与您的代码和Visual Studio Code配置好后,它才能正常工作。
如果你正在使用 IntelliJ IDEA 作为集成开发环境,那么可以通过以下方式将父分支合并到你的分支中:
git checkout <localbranch>
git merge origin/<remotebranch>
它会显示所有的冲突,如下:
A_MBPro:test anu$ git merge origin/ 自动合并 src/test/java/com/.../TestClass.java 冲突 (内容):在 src/test/java/com/.../TestClass.java 中合并冲突
现在请注意,在IntelliJ IDEA中,TestClass.java文件显示为红色。
git status
也会显示:
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: src/test/java/com/.../TestClass.java
打开IntelliJ IDEA中的文件。它将具有不同的部分:
<<<<<<< HEAD
public void testMethod() {
}
=======
public void testMethod() { ...
}
>>>>>>> origin/<remotebranch>
这里的HEAD表示你在本地分支上所做的更改,而origin/<remotebranch>则代表来自远程分支的更改。在这里保留你需要的内容并删除不需要的内容。之后,按照正常步骤进行操作即可。
git add TestClass.java
git commit -m "commit message"
git push
对于那些使用Visual Studio(例如我所用的Visual Studio 2015)的人:
关闭Visual Studio中的项目。特别是在大型项目中,使用UI进行合并时,Visual Studio往往会出现问题。
在命令提示符中进行合并。
git checkout target_branch
git merge source_branch
然后在Visual Studio中打开项目,转到团队资源管理器→分支。现在有一条消息显示为合并待处理,冲突文件列在消息正下方。
单击冲突文件,将会有合并、比较、采取源和采取目标选项。Visual Studio中的合并工具非常容易使用。