5164

我想解决我的Git存储库中的合并冲突。

我怎样才能做到这一点?

4

36 回答 36

3237

尝试:git mergetool

它会打开一个 GUI,引导您完成每个冲突,您可以选择如何合并。有时它需要在之后进行一些手工编辑,但通常它本身就足够了。这肯定比手动完成整个事情要好得多。

根据Josh Glover 的评论

命令

除非您安装 GUI,否则不一定会打开 GUI。为我跑步git mergetool导致vimdiff被使用。您可以安装以下工具之一来使用它:meld, opendiff, kdiff3, tkdiff, xxdiff, tortoisemerge, gvimdiff, diffuse, ecmerge, p4merge, araxis, vimdiff, emerge.

以下是vimdiff用于解决合并冲突的示例过程。基于此链接

第 1 步:在终端中运行以下命令

git config merge.tool vimdiff
git config merge.conflictstyle diff3
git config mergetool.prompt false

这会将 vimdiff 设置为默认的合并工具。

第 2 步:在终端中运行以下命令

git mergetool

第 3 步:您将看到以下格式的 vimdiff 显示

  ╔═══════╦══════╦════════╗
  ║       ║      ║        ║
  ║ LOCAL ║ BASE ║ REMOTE ║
  ║       ║      ║        ║
  ╠═══════╩══════╩════════╣
  ║                       ║
  ║        MERGED         ║
  ║                       ║
  ╚═══════════════════════╝

这4个视图是

LOCAL - 这是来自当前分支的文件

BASE - 共同祖先,文件在两次更改之前的样子

REMOTE - 您正在合并到您的分支的文件

MERGED - 合并结果,这是保存在 repo 中的内容

ctrl您可以使用+在这些视图之间导航wctrl您可以使用+w后跟直接到达 MERGED 视图j

关于 vimdiff 导航的更多信息在这里这里

第 4 步。您可以通过以下方式编辑 MERGED 视图

如果您想从 REMOTE 获取更改

:diffg RE

如果您想从 BASE 获取更改

:diffg BA

如果您想从 LOCAL 获取更改

:diffg LO

步骤 5。保存、退出、提交和清理

:wqa保存并退出vi

git commit -m "message"

git clean删除 diff 工具创建的额外文件(例如 *.orig)。

于 2008-10-02T17:50:25.100 回答
1765

这是一个可能的用例,从顶部开始:

您将进行一些更改,但是糟糕,您不是最新的:

git fetch origin
git pull origin master

From ssh://gitosis@example.com:22/projectname
 * branch            master     -> FETCH_HEAD
Updating a030c3a..ee25213
error: Entry 'filename.c' not uptodate. Cannot merge.

所以你得到最新的,然后再试一次,但有一个冲突:

git add filename.c
git commit -m "made some wild and crazy changes"
git pull origin master

From ssh://gitosis@example.com:22/projectname
 * branch            master     -> FETCH_HEAD
Auto-merging filename.c
CONFLICT (content): Merge conflict in filename.c
Automatic merge failed; fix conflicts and then commit the result.

所以你决定看看这些变化:

git mergetool

哦,我的,哦,我的,上游改变了一些东西,但只是为了使用我的改变......不......他们的改变......

git checkout --ours filename.c
git checkout --theirs filename.c
git add filename.c
git commit -m "using theirs"

然后我们尝试最后一次

git pull origin master

From ssh://gitosis@example.com:22/projectname
 * branch            master     -> FETCH_HEAD
Already up-to-date.

达达!

于 2010-08-04T17:04:57.563 回答
772

我发现合并工具很少能帮助我理解冲突或解决方案。我通常更成功地在文本编辑器中查看冲突标记并使用 git log 作为补充。

这里有一些提示:

提示一

我发现最好的方法是使用“diff3”合并冲突样式:

git config merge.conflictstyle 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.
>>>>>>>

中间部分是共同祖先的样子。这很有用,因为您可以将其与顶部和底部版本进行比较,以更好地了解每个分支上的更改内容,从而更好地了解每个更改的目的。

如果冲突只有几行,这通常会使冲突非常明显。(知道如何解决冲突是非常不同的;你需要知道其他人在做什么。如果你感到困惑,最好把那个人叫到你的房间,这样他们就可以看到你在看什么在。)

如果冲突时间较长,那么我会将三个部分分别剪切并粘贴到三个单独的文件中,例如“mine”、“common”和“theirs”。

然后我可以运行以下命令来查看导致冲突的两个差异块:

diff common mine
diff common theirs

这与使用合并工具不同,因为合并工具也会包含所有不冲突的差异数据块。我觉得这让人分心。

提示二

已经有人提到了这一点,但是了解每个 diff hunk 背后的意图通常对于了解冲突的来源以及如何处理它非常有帮助。

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

这显示了在共同祖先和您要合并的两个头之间触及该文件的所有提交。(因此它不包括合并之前两个分支中已经存在的提交。)这可以帮助您忽略明显不是当前冲突因素的差异大块。

提示三

使用自动化工具验证您的更改。

如果您有自动化测试,请运行它们。如果您有lint,请运行它。如果它是一个可构建的项目,则在提交之前构建它,等等。在所有情况下,您都需要进行一些测试以确保您的更改不会破坏任何东西。(哎呀,即使没有冲突的合并也会破坏工作代码。)

提示四

未雨绸缪; 与同事沟通。

提前计划并了解其他人正在做什么可以帮助防止合并冲突和/或帮助更早地解决它们 - 而细节仍然是新鲜的。

例如,如果您知道您和另一个人都在进行不同的重构,这些重构都会影响同一组文件,那么您应该提前互相交谈,并更好地了解你们每个人的更改类型制造。如果您按顺序而不是并行进行计划更改,您可能会节省大量时间和精力。

对于涉及大量代码的重大重构,您应该强烈考虑按顺序工作:每个人都停止在代码的该区域工作,而一个人执行完整的重构。

如果您不能连续工作(可能是由于时间压力),那么就预期的合并冲突进行沟通至少可以帮助您在细节仍然记忆犹新的情况下更快地解决问题。例如,如果一个同事在一周内进行了一系列破坏性的提交,您可以选择在该周内每天一次或两次在该同事分支上合并/rebase。这样,如果你确实发现了合并/变基冲突,你可以更快地解决它们,而不是等待几周将所有内容合并到一个大块中。

提示五

如果您不确定合并,请不要强行合并。

合并可能会让人感到不知所措,尤其是当有很多冲突文件并且冲突标记覆盖数百行时。通常在估算软件项目时,我们没有足够的时间来处理诸如处理复杂合并之类的开销项目,因此花几个小时剖析每个冲突感觉真的很累。

从长远来看,提前计划并了解其他人正在做什么是预测合并冲突并准备在更短的时间内正确解决它们的最佳工具。

于 2011-09-28T21:08:22.960 回答
364
  1. 确定哪些文件存在冲突(Git 应该告诉你这一点)。

  2. 打开每个文件并检查差异;Git 对它们进行了划分。希望保留每个块的哪个版本是显而易见的。您可能需要与提交代码的其他开发人员讨论它。

  3. 一旦你解决了文件中的冲突git add the_file

  4. 解决所有冲突后,执行git rebase --continueGit 完成时要求执行的任何命令。

于 2008-10-02T12:41:36.510 回答
123

当同时对文件进行更改时,会发生合并冲突。以下是如何解决它。

git命令行界面

以下是当您进入冲突状态时要执行的简单步骤:

  1. 请注意冲突文件列表:(git statusUnmerged paths部分下)。
  2. 通过以下方法之一分别解决每个文件的冲突:

    • 使用 GUI 解决冲突:(git mergetool最简单的方法)。

    • 要接受远程/其他版本,请使用:git checkout --theirs path/file. 这将拒绝您对该文件所做的任何本地更改。

    • 要接受本地/我们的版本,请使用:git checkout --ours path/file

      但是,您必须小心,因为远程更改冲突是出于某种原因进行的。

      相关:git中“我们的”和“他们的”的确切含义是什么?

    • 手动编辑冲突文件并在<<<<</之间查找代码块,>>>>>然后从上面或下面选择版本=====。请参阅:如何呈现冲突

    • 路径和文件名冲突可以通过git add/解决git rm

  3. 最后,使用以下命令查看准备提交的文件:git status.

    如果您仍然有任何文件Unmerged paths,并且您确实手动解决了冲突,那么让 Git 知道您通过以下方式解决了它git add path/file

  4. 如果所有冲突都已成功解决,请通过以下方式提交更改:git commit -a并像往常一样推送到远程。

另请参阅:从GitHub的命令行解决合并冲突

有关实用教程,请查看:Scenario 5 - Fixing Merge Conflicts by Katacoda

差异合并

我已经成功使用DiffMerge,它可以在 Windows、macOS 和 Linux/Unix 上直观地比较和合并文件。

它可以以图形方式显示 3 个文件之间的更改,并允许自动合并(在安全的情况下)和对编辑结果文件的完全控制。

差异合并

图片来源:DiffMerge(Linux 截图)

只需下载它并在 repo 中运行:

git mergetool -t diffmerge .

苹果系统

在 macOS 上,您可以通过以下方式安装:

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 "$@"

然后,您可以使用以下键盘快捷键:

  • ⌘</kbd>-Alt-Up/Down to jump to previous/next changes.
  • ⌘</kbd>-Alt-Left/Right to accept change from left or right

或者,您可以使用opendiff(Xcode 工具的一部分),它允许您将两个文件或目录合并在一起以创建第三个文件或目录。

于 2015-08-05T14:29:48.680 回答
111

查看 Stack Overflow 问题Aborting a merge in Git中的答案,尤其是Charles Bailey 的答案,它显示了如何查看有问题的文件的不同版本,例如,

# Common base version of the file.
git show :1:some_file.cpp

# 'Ours' version of the file.
git show :2:some_file.cpp

# 'Theirs' version of the file.
git show :3:some_file.cpp
于 2008-10-03T15:15:07.637 回答
82

如果您经常进行小型提交,请先查看带有git log --merge. 然后git diff将向您展示冲突。

对于涉及多行的冲突,更容易查看外部 GUI 工具中发生的情况。我喜欢 opendiff——Git 还支持 vimdiff、gvimdiff、kdiff3、tkdiff、meld、xxdiff、emerge 开箱即用,您可以安装其他工具:git config merge.tool "your.tool"将设置您选择的工具,然后git mergetool在合并失败后将在上下文中显示差异。

每次您编辑文件以解决冲突时,git add filename都会更新索引并且您的差异将不再显示它。当所有的冲突都得到处理并且它们的文件已经被git add编辑后,git commit将完成你的合并。

于 2008-10-02T16:11:18.143 回答
54

我要么想要我的或他们的完整版本,要么想要查看个别更改并为每个更改做出决定。

完全接受我或他们的版本

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

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

查看所有更改并单独接受

  1. git mergetool
  2. 查看更改并接受每个版本的任一版本。
  3. git add <filename>
  4. git commit -m "merged bla bla"

默认mergetool命令行中工作。如何使用命令行合并工具应该是一个单独的问题。

您还可以为此安装可视化工具,例如meld并运行

git mergetool -t meld

它将打开本地版本(我们的)、“基础”或“合并”版本(合并的当前结果)和远程版本(他们的)。完成后保存合并的版本,git mergetool -t meld再次运行,直到出现“没有文件需要合并”,然后转到步骤 3 和 4。

于 2016-09-29T13:02:01.233 回答
50

请参阅如何呈现冲突或在 Git 中的git merge文档以了解什么是合并冲突标记。

此外,如何解决冲突部分解释了如何解决冲突:

看到冲突后,您可以做两件事:

  • 决定不合并。您需要的唯一清理是将索引文件重置HEAD为反向提交 2. 并清理 2. 和 3. 所做的工作树更改;git merge --abort可用于此。

  • 解决冲突。Git 将标记工作树中的冲突。将文件编辑成形状并将git add它们编辑到索引中。用来敲定git commit交易。

您可以使用多种工具解决冲突:

  • 使用合并工具。git mergetool启动图形合并工具,它将帮助您完成合并。

  • 看看差异。git diff将显示三向差异,突出显示HEADMERGE_HEAD版本的更改。

  • 查看每个分支的差异。git log --merge -p <path>将首先显示HEAD版本的差异,然后显示MERGE_HEAD版本。

  • 看看原件。git show :1:filename显示共同祖先,git show :2:filename显示HEAD版本,git show :3:filename显示MERGE_HEAD版本。

您还可以在Pro Git书籍部分Basic Merge Conflicts中阅读有关合并冲突标记以及如何解决它们的信息。

于 2013-07-14T18:34:47.100 回答
42

对于想要半手动解决合并冲突的Emacs用户:

git diff --name-status --diff-filter=U

显示所有需要解决冲突的文件。

一个一个地打开每个文件,或者一次打开所有文件:

emacs $(git diff --name-only --diff-filter=U)

在 Emacs 中访问需要编辑的缓冲区时,键入

ALT+x vc-resolve-conflicts

这将打开三个缓冲区(我的、他们的和输出缓冲区)。按“n”(下一个区域)、“p”(预置区域)进行导航。按“a”和“b”分别将我的或他们的区域复制到输出缓冲区。和/或直接编辑输出缓冲区。

完成后:按“q”。Emacs 询问您是否要保存此缓冲区:是的。完成缓冲区后,通过从终端运行将其标记为已解决:

git add FILENAME

完成所有缓冲区类型后

git commit

完成合并。

于 2013-02-22T23:04:53.277 回答
37

奖金:

在谈到之前答案中的拉/取/合并时,我想分享一个有趣且富有成效的技巧,

git pull --rebase

上面这个命令是我 Git 生活中最有用的命令,它节省了很多时间。

在将新提交的更改推送到远程服务器之前,请尝试git pull --rebase手动git pull操作merge,它会自动同步最新的远程服务器更改(使用 fetch + merge)并将本地最新提交放在 Git 日志的顶部。无需担心手动拉/合并。

如果发生冲突,只需使用

git mergetool
git add conflict_file
git rebase --continue

在以下位置查找详细信息:“git pull –rebase”是做什么的?

于 2015-12-25T15:24:07.393 回答
35

简单地说,如果您很清楚其中一个存储库中的更改并不重要,并且想要解决所有更改以支持另一个存储库,请使用:

git checkout . --ours

解决有利于您的存储库的更改,或

git checkout . --theirs

解决有利于其他或主存储库的更改。

否则,您将不得不使用 GUI 合并工具逐个遍历文件,例如合并工具是p4merge,或者写下您已经安装的任何人的名字

git mergetool -t p4merge

完成一个文件后,您必须保存并关闭,以便打开下一个文件。

于 2016-01-26T17:42:46.997 回答
33

请按照以下步骤修复 Git 中的合并冲突:

  1. 检查 Git 状态: git status

  2. 获取补丁集: git fetch(从你的 Git 提交中签出正确的补丁)

  3. 签出本地分支(此处为 temp1): git checkout -b temp1

  4. 从 master 拉取最近的内容: git pull --rebase origin master

  5. 启动合并工具并检查冲突并修复它们......并使用当前分支检查远程分支中的更改: git mergetool

  6. 再次检查状态: git status

  7. 删除mergetool本地创建的不需要的文件,通常mergetool会创建带有*.orig扩展名的额外文件。请删除该文件,因为它只是重复的并在本地修复更改并添加正确版本的文件。 git add #your_changed_correct_files

  8. 再次检查状态: git status

  9. 将更改提交到相同的提交 ID(这避免了新的单独补丁集): git commit --amend

  10. 推送到主分支: git push(到您的 Git 存储库)

于 2015-04-16T07:02:03.280 回答
33

分为三个步骤:

  1. 通过命令查找哪些文件导致冲突

     git status
    
  2. 检查文件,您会在其中找到标记为的冲突

     <<<<<<<<head
     blablabla
    
  3. 将其更改为您想要的方式,然后使用命令提交

     git add solved_conflicts_files
     git commit -m 'merge msg'
    
于 2017-06-23T14:38:06.647 回答
30

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
于 2014-01-25T16:17:01.463 回答
29

正如其他人所详述的那样,您可以通过多种方式修复合并冲突。

我认为真正的关键是了解本地和远程存储库的变化是如何流动的。关键是理解跟踪分支。我发现我认为跟踪分支是我的本地实际文件目录和定义为源的远程目录之间的“中间缺失的部分”。

我个人已经养成了两件事来帮助避免这种情况的习惯。

代替:

git add .
git commit -m"some msg"

这有两个缺点 -

a) 添加所有新的/更改的文件,其中可能包括一些不需要的更改。
b) 您没有先查看文件列表。

所以我这样做:

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

这样,您可以更仔细地考虑添加哪些文件,并且您还可以查看列表并在使用消息编辑器时进行更多思考。我发现当我使用全屏编辑器而不是-m选项时,它也会改善我的提交消息。

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

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

]

另外(并且与您的情况更相关),我尽量避免:

git pull

或者

git pull origin master.

因为 pull 意味着合并,如果您在本地有不想合并的更改,您很容易以合并代码和/或不应该合并的代码的合并冲突告终。

相反,我尝试做

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

您可能还会发现这很有帮助:

git branch、fork、fetch、merge、rebase 和 clone,有什么区别?

于 2013-04-19T01:08:18.483 回答
26

如果要从分支合并testmaster,可以按照以下步骤操作:

第一步:去分行

git checkout test

第 2 步

git pull --rebase origin master

第三步:如果有冲突,到这些文件去修改。

第 4 步:添加这些更改

git add #your_changes_files

第 5 步

git rebase --continue

步骤 6:如果仍然存在冲突,请再次返回步骤 3。如果没有冲突,请执行以下操作:

git push origin +test

第7步:然后test和master之间就没有冲突了。您可以直接使用合并。

于 2014-08-18T19:42:40.470 回答
19

使用patience

对于大的合并冲突,使用patience为我提供了很好的结果。它将尝试匹配块而不是单个行。

例如,如果您更改程序的缩进,默认的 Git 合并策略有时会匹配{属于不同函数的单个大括号。这可以避免patience

git merge -s recursive -X patience other-branch

从文档中:

With this option, merge-recursive spends a little extra time to avoid 
mismerges that sometimes occur due to unimportant matching lines 
(e.g., braces from distinct functions). Use this when the branches to 
be merged have diverged wildly.

与共同祖先的比较

如果您有合并冲突并想看看其他人在修改他们的分支时的想法,有时将他们的分支直接与共同的祖先(而不是我们的分支)进行比较更容易。为此,您可以使用merge-base

git diff $(git merge-base <our-branch> <their-branch>) <their-branch>

通常,您只想查看特定文件的更改:

git diff $(git merge-base <our-branch> <their-branch>) <their-branch> <file>
于 2016-11-30T19:51:37.433 回答
18
git log --merge -p [[--] path]

似乎并不总是对我有用,并且通常最终显示两个分支之间不同的每个提交,即使使用--将路径与命令分开也会发生这种情况。

我要解决此问题的方法是打开两个命令行并一次运行

git log ..$MERGED_IN_BRANCH --pretty=full -p [path]

而在另一个

git log $MERGED_IN_BRANCH.. --pretty=full -p [path]

$MERGED_IN_BRANCH用我合并的分支和[path]有冲突的文件替换。此命令将以补丁形式记录 ( ..) 两次提交之间的所有提交。如果您像上面的命令一样将一侧留空,git 将自动使用HEAD(在这种情况下您要合并到的分支)。

这将允许您查看两个分支在分歧后进入文件的提交。它通常使解决冲突变得容易得多。

于 2014-12-11T15:19:55.277 回答
17

截至 2016 年 12 月 12 日,您可以在 github.com 上合并分支并解决冲突

因此,如果您不想使用旧答案中提供的命令行或任何第 3 方工具,请使用 GitHub 的本机工具。

这篇博文进行了详细解释,但基本原理是,通过 UI “合并”两个分支后,您现在将看到一个“解决冲突”选项,该选项将带您进入允许您处理这些合并冲突的编辑器。

在此处输入图像描述

于 2017-01-09T19:45:15.063 回答
15

合并冲突可能发生在不同的情况下:

  • 运行时git fetch然后git merge
  • 运行时git fetch然后git rebase
  • 运行时git pull(实际上等于上述条件之一)
  • 跑步时git stash pop
  • 当您应用 git 补丁时(导出到要传输的文件的提交,例如,通过电子邮件)

您需要安装与 Git 兼容的合并工具来解决冲突。我个人使用KDiff3,我发现它很好用而且很方便。您可以在此处下载其 Windows 版本:

https://sourceforge.net/projects/kdiff3/files/

顺便说一句,如果你安装了 Git Extensions,它的设置向导中有一个选项可以安装 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
于 2016-06-18T05:29:19.257 回答
14

我总是按照以下步骤来避免冲突。

  • git checkout master(来到master分支)
  • git pull(更新你的主人以获得最新的代码)
  • git checkout -b mybranch(检查一个新的分支并开始在该分支上工作,以便您的主干始终保持在主干的顶部。)
  • git add . git push(在您更改后的本地分支上git commit
  • git checkout master(回到你的主人那里)

现在,您可以做同样的事情并维护您想要的多个本地分支,并且只需git checkout在必要时对您的分支执行一个操作即可同时工作。

于 2015-02-12T04:25:58.150 回答
9

适用于 Visual Studio 代码的 GitLens

您可以尝试使用 GitLens for Visual Studio Code。主要特点是:

3. 轻松解决冲突

我已经喜欢这个功能了:

在此处输入图像描述

2. 当前线责。

在此处输入图像描述

3. 天沟责备

在此处输入图像描述

4.状态栏责备

在此处输入图像描述

并且有很多特点。你可以在这里查看它们。

于 2019-01-05T18:33:46.963 回答
8

这个答案是为像我这样喜欢在编辑器中做所有事情的 Vim 用户添加一个替代方案。


TL;博士

在此处输入图像描述


Tpope为 Vim 提出了这个很棒的插件,叫做fugitive。安装后,您可以运行:Gstatus检查有冲突的文件,并:Gdiff以三向合并方式打开 Git。

一旦进入三路合并,fugitive将让您以下列方式获取您正在合并的任何分支的更改:

  • :diffget //2,从原始(HEAD)分支获取更改:
  • :diffget //3,从合并分支获取更改:

完成文件合并后,输入:Gwrite合并的缓冲区。

Vimcasts 发布了一个很棒的视频,详细解释了这些步骤。

于 2017-10-16T06:01:29.347 回答
7

我明白什么是合并冲突,但是当我看到 的输出时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就会立即成功。问题解决了!

于 2021-02-09T11:24:09.860 回答
5
git fetch <br>
git checkout **your branch**<br>
git rebase master<br>

在此步骤中,您将尝试使用首选 IDE 修复冲突。

您可以按照此链接检查如何修复文件中的冲突。

git add<br>
git rebase --continue<br>
git commit --amend<br>
git push origin HEAD:refs/drafts/master  (push like a drafts)<br>

现在一切都很好,你会在Gerrit中找到你的提交。

于 2017-07-05T13:25:30.940 回答
4

我正在使用 Microsoft 的 Visual Studio Code 来解决冲突。使用起来非常简单。我在工作区中保持我的项目打开。它检测并突出显示冲突。此外,它提供了 GUI 选项来选择我想从 HEAD 保留或传入的任何更改。

在此处输入图像描述

于 2019-10-02T06:53:35.250 回答
3

解决冲突的一种更安全的方法是使用git-mediate(这里建议的常见解决方案很容易出错,恕我直言)。

有关如何使用它的快速介绍,请参阅这篇文章。

于 2016-12-29T16:46:35.800 回答
3

对于那些使用 Visual Studio 的人(在我的例子中是Visual Studio 2015 )

  1. 在 Visual Studio 中关闭您的项目。尤其是在大型项目中,Visual Studio 在使用 UI 进行合并时往往会崩溃。

  2. 在命令提示符下进行合并。

    git checkout target_branch

    git 合并 source_branch

  3. 然后在 Visual Studio 中打开项目并转到 Team Explorer → Branch。现在有一条消息显示Merge is pending并且冲突文件列在消息下方。

  4. 单击冲突文件,您将拥有MergeCompareTake SourceTake Target选项。Visual Studio 中的合并工具非常易于使用。

于 2017-07-10T20:29:53.717 回答
3

如果您使用IntelliJ IDEA作为 IDE,请尝试通过以下方式将父级合并到您的分支:

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

它将显示所有冲突,如下所示:

A_MBPro:test anu$ git merge origin/ Auto-merging src/test/java/com/.../TestClass.java CONFLICT (content): Merge conflict in src/test/java/com/.../TestClass.java

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

还会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
于 2017-07-11T16:23:52.803 回答
3

如果您还没有,请尝试使用 Visual Studio Code 进行编辑。

在您尝试合并(并陷入合并冲突)后,Visual Studio Code 会自动检测合并冲突。

它可以通过显示对原始更改所做的更改以及您是否应该接受incoming

current change(意思是合并前的原始)'。

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

PS:仅当您使用代码和 Visual Studio Code 配置了 Git 时,它才会起作用。

于 2018-03-16T06:26:08.890 回答
1

我遵循以下过程。

修复合并冲突的过程:

  1. 首先,从要合并到的目标分支中提取最新的git pull origin develop

  2. 当您从目的地获得最新信息时,现在通过删除那些多余的字符在 IDE 中手动解决冲突。

  3. 执行 agit add将这些已编辑的文件添加到 Git 队列,以便它可以commitpush您正在处理的同一分支。

  4. git add完成后,执行 a以git commit提交更改。

  5. 现在将更改推送到您的工作分支git push origin HEAD

就是这样,如果您使用的是 Bitbucket 或 GitHub,您将在拉取请求中看到它已解决。

于 2017-10-13T21:49:32.427 回答
0

我喜欢使用WinMerge(免费工具),它既可以进行完整的整个目录树比较/合并,也可以进行完整目录树比较的单个文件比较/合并。

Git 合并冲突告诉您您的拉取请求将撤消/丢失/覆盖同事的更改,通常是因为您的内容副本不够新。

解决的步骤可以是:

  • 将源的另一个新克隆复制到新命名的文件夹中,
  • 使用 WinMerge 比较您的内容和最近的内容以了解冲突,
  • 对于您和您的同事更改的导致 Git 合并冲突的文件,请查看您的同事添加/更改/删除的行与您添加/更改的代码行相比/删除。
  • 使用 WinMerge 左/右代码部分移动箭头,以确保您同事的工作在您的文件副本中,并且您不会破坏他们的工作。

即,除了手动查看每个人对相同源文件所做的操作之外,没有什么神奇的方法可以解决 Git 合并冲突。

这就是我的想法。

注意:WinMerge 创建 .bak 文件 .. 并且您不希望将它们复制到源代码控制 AzOps、TFS 等,因此如果您确定您已正确完成编辑,请删除 .bak 文件。

于 2020-07-23T07:13:54.163 回答
0

好吧,所有已经给出的答案似乎都解释了您可以使用哪些工具来检测合并冲突或如何启动合并请求......

然而,您的问题的答案既简单又令人沮丧。合并冲突几乎总是手动手动解决。如果您使用诸如 GitLab 之类的工具,GUI 可能会帮助您找到两个代码版本之间的差异,但归根结底,您必须决定应该保留哪一行,删除哪一行。

一个简单的例子:程序员 A 和程序员 B 都将相同的 - 不同修改的 - 文件推送到远程存储库。程序员 A 打开一个合并请求,GitLab 会突出显示两个版本之间发生冲突的几行代码。现在由程序员 A 和 B 来决定,谁在这些特定的行中编写了更好的代码。他们必须做出妥协。

于 2020-08-09T12:11:01.347 回答
-3

如果您只是想恢复远程主机,那么

git reset --hard origin/master

警告:所有本地更改都将丢失,请参阅https://stackoverflow.com/a/8476004/11769765

于 2020-06-05T16:51:32.540 回答
-5

如果不使用工具进行合并,请先将代码复制到外面:

- `checkout master`
- `git pull` / get new commit
- `git checkout` to your branch
- `git rebase master`

它解决了冲突,您可以复制您的代码。

于 2014-06-10T08:11:14.560 回答