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


当前回答

我要我的或他们的版本完整,或者想审查个别的变化,并决定每一个。

完全接受我的或他们的版本:

接受我的版本(本地,我们的):

git checkout --ours -- <filename>
git add <filename>              # Marks conflict as resolved
git commit -m "merged bla bla"  # An "empty" commit

接受其版本(远程,自己的):

git checkout --theirs -- <filename>
git add <filename>
git commit -m "merged bla bla"

如果你想做所有冲突文件运行:

git merge --strategy-option ours

git merge --strategy-option theirs

查看所有变更并单独接受它们

git mergetool 评论 改变并接受每个版本. git 添加 <filename> git commit -m "merged bla bla"

默认的 mergetool 在命令线上工作. 如何使用命令线 mergetool 应该是一个单独的问题。

您也可以为此安装视觉工具,例如通讯和运行

git mergetool -t meld

它将打开本地版本(ours),“base”或“合并”版本(合并的当前结果)和远程版本(天花板)。在完成时保存合并版本,运行 git mergetool -t 再次登记,直到您获得“不需要合并文件”,然后转到步骤3和4。

其他回答

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 mergetool

它打开一个GUI,你通过每个冲突,你得到选择如何合并。有时它需要一些手编辑后,但通常它是足够的本身。


根据Josh Glover的评论:

[此命令] 不必打开 GUI 除非你安装一个. 运行 git mergetool 为我导致 vimdiff 被使用. 您可以安装下列工具之一来使用它: meld, opendiff, kdiff3, tkdiff, xxdiff, tortoisemerge, gvimdiff, diffuse, ecmerge, p4merge, araxis, vimdiff, emerge。


下面是使用vimdiff解决合并冲突的样本程序,基于此链接。

如果您正在使用 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

简单地说,如果你知道其中一个存储库的变化并不重要,并且想解决所有变化,有利于另一个,请使用:

git checkout . --ours

以您的存储库的利益来解决更改,或者

git checkout . --theirs

以解决其他或主要存储库的利益的变更。

或者你将不得不使用一个 GUI 合并工具,一步一步通过文件,说合并工具是 p4merge,或者写下你已经安装的任何一个的名字。

git mergetool -t p4merge

完成文件后,您将不得不保存和关闭,以便下一个将打开。

合并冲突发生时,同时对文件进行更改,这里是如何解决。

下面是简单的步骤,当你进入冲突状态时要做什么:

对于实用的教程,请检查: 剧本 5 - 解决混合冲突 由 Katacoda。

差异化

我成功地使用了DifMerge,它可以在Windows、macOS和Linux/Unix上视觉上比较和合并文件。

此分類上一篇

圖片來源:DifMerge(Linux屏幕拍攝)

git mergetool -t diffmerge .

马克思

brew install caskroom/cask/brew-cask
brew cask install diffmerge

而且,你可能(如果没有提供)需要下列额外简单的插槽放置在你的PATH(例如 /usr/bin):

#!/bin/sh
DIFFMERGE_PATH=/Applications/DiffMerge.app
DIFFMERGE_EXE=${DIFFMERGE_PATH}/Contents/MacOS/DiffMerge
exec ${DIFFMERGE_EXE} --nosplash "$@"

-Alt-Up/Down to jump to previous/Next changes. -Alt-Left/Right to accept change from left or right. -Alt-Up/Down to jump to previous/Next changes. -Alt-Left/Right to accept change from left or right