我如何在我的 Git 存储库中解决合并冲突?


当前回答

如果您正在使用 IntelliJ IDEA 作为 IDE,请尝试通过:

git checkout <localbranch>
git merge origin/<remotebranch>

它将显示所有类似的冲突:

A_MBPro:test anu$ git merge 起源/ 自动合并 src/test/java/com/.../TestClass.java CONFLICT (内容): 合并冲突 src/test/java/com/.../TestClass.java

现在请注意,TestClass.java 文件在 IntelliJ IDEA 中显示为红色。

此外,Git 状态也将显示:

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>

在哪里,头部是你的本地分支和起源的变化/<remotebranch>是从远方分支的变化. 在这里保持你需要的东西,并删除你不需要的东西。

   git add TestClass.java
   git commit -m "commit message"
   git push

其他回答

CoolAJ86的答案相当于一切. 如果您在同一代码中有两个分支的变化,您将不得不进行手动合并. 在任何文本编辑器中打开冲突中的文件,您应该看到下列结构。

(Code not in Conflict)
>>>>>>>>>>>
(first alternative for conflict starts here)
Multiple code lines here
===========
(second alternative for conflict starts here)
Multiple code lines here too    
<<<<<<<<<<<
(Code not in conflict here)

选择一个替代品或两者的组合,以一种方式,你想要新的代码是,同时删除平等的标志和角膜。

git commit -a -m "commit message"
git push origin master

你可以以一些方式解决合并冲突,因为其他人已经详细说明了。

我认为真正的关键是知道如何在本地和远程存储库中流动的变化。 关键是理解跟踪分支. 我发现我认为跟踪分支是我之间的“中间失落的片段”我的本地,实际的文件目录和远程定义为起源。

而不是:

git add .
git commit -m"some msg"

相反,我做:

git add file,file2,file3...
git commit # Then type the files in the editor and save-quit.

因此,你更有意识到哪些文件被添加,你也可以查看列表,并在使用编辑器为消息时思考更多。

[更新 - 随着时间的流逝,我已经更换到:

git status # Make sure I know whats going on
git add .
git commit # Then use the editor

)

此外(更重要的是你的情况),我试图避免:

git pull

git pull origin master.

git checkout master
git fetch   
git rebase --hard origin/master # or whatever branch I want.

你也可能會發現這有用:

git 分支, fork, fetch, merge, rebase 和 clone,什么是差异?

尝试编辑 Visual Studio 代码,如果您还没有。

一旦尝试合并(并在合并冲突中登陆),Visual Studio Code 会自动检测合并冲突。

它可以非常好地帮助你,通过显示原来的变更,以及你是否应该接受进入或

目前的变化(即合并前的原始变化)。

它帮助了我,它也可以为你工作!

PS:它只会工作,如果您与您的代码和Visual Studio代码配置了Git。

解决冲突的更安全的方式是使用 git-mediate (这里提出的常见解决方案是相当错误的 prone imho)。

查看此帖子,以便快速介绍如何使用它。

我发现的最好的东西是使用“diff3”合并冲突风格:

<<<<<<<
Changes made on the branch that is being merged into. In most cases,
this is the branch that I have currently checked out (i.e. HEAD).
|||||||
The common ancestor version.
=======
Changes made on the branch that is being merged in. This is often a 
feature/topic branch.
>>>>>>>

如果冲突更长,那么我会把三个部分切成三个单独的文件,如“小”,“普通”和“天花板”。

diff common mine
diff common theirs

提示2

git log --merge -p <name of file>

如果你有自动测试,运行这些,如果你有绳子,运行它,如果这是一个可构建的项目,然后在你承诺之前建造它,等等,在所有情况下,你需要做一些测试,以确保你的变化没有打破任何东西。

例如,如果你知道你和另一个人都在不同的重复工作,这两者都会影响相同的文件集,你应该提前彼此谈话,并更好地了解你每个人都在做什么类型的变化。

如果你不确定合并,不要强迫它。