如何解决Git中的合并冲突?


#1楼

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

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

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

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

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

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

ALT+x vc-resolve-conflicts

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

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

git add FILENAME

完成所有缓冲区类型后

git commit

完成合并。


#2楼

您可以采用其他方法详细介绍的多种方法来解决合并冲突。

我认为真正的关键是知道更改如何与本地和远程存储库一起流动。 关键在于了解跟踪分支。 我发现我将跟踪分支视为本地,实际文件目录与定义为源的远程之间的“中间缺失”部分。

我个人已经习惯了两件事来避免这种情况。

代替:

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,有什么区别?


#3楼

  1. 确定哪些文件有冲突(Git会告诉您)。

  2. 打开每个文件并检查差异; Git将它们划分边界。 希望可以很清楚地看到每个块的版本。 您可能需要与提交代码的其他开发人员进行讨论。

  3. 解决冲突后,在文件git add the_file

  4. 解决所有冲突后,请执行git rebase --continue或完成时Git所说的命令。


#4楼

如果您要进行频繁的小提交,请首先使用git log --merge查看提交注释。 然后git diff将向您显示冲突。

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

每次您编辑文件以解决冲突时, git add filename将更新索引,并且您的差异将不再显示它。 当所有冲突都已解决并且其文件已被git add -ed时, git commit将完成您的合并。


#5楼

尝试: git mergetool

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

根据@JoshGlover评论:

除非您安装一个GUI,否则该命令不一定会打开GUI。 为我运行git mergetool导致使用了vimdiff 。 您可以安装以下工具之一,而不是使用它: meldopendiffkdiff3tkdiffxxdifftortoisemergegvimdiffdiffuseecmergep4mergearaxisvimdiffemerge

以下是使用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个视图是

本地–这是当前分支中的文件

BASE –共同祖先,两次更改之前文件的外观

远程–将文件合并到分支中

已合并-合并结果,这就是保存在存储库中的内容

您可以使用ctrl + w在这些视图之间导航。 您可以使用ctrl + w和j直接进入MERGED视图。

有关此处和此处的 vimdiff导航的更多信息

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

如果您想从REMOTE获得更改

:diffg RE

如果要从BASE获得更改

:diffg BA

如果您想从本地获得更改

:diffg LO

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

:wqa保存并退出vi

git commit -m "message"

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


#6楼

请查看Stack Overflow问题中的答案, 中止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

#7楼

请参阅如何显示冲突,或者在Git中查看git merge文档,以了解什么是合并冲突标记。

此外,“ 如何解决冲突”部分介绍了如何解决冲突:

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

  • 决定不合并。 您需要执行的唯一清除操作是将索引文件重置为HEAD commit以反转2。并清除2和3对工作树所做的更改。 git merge --abort可用于此目的。

  • 解决冲突。 Git将在工作树中标记冲突。 将文件编辑为shape并git add它们git add到索引中。 使用git commit来完成交易。

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

  • 使用mergetool。 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书的“ 基本合并冲突 ”部分中了解有关合并冲突标记以及如何解决它们的信息。


#8楼

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

#9楼

如果要从分支(测试)合并到master,可以按照以下步骤操作:

步骤1:前往分行

git checkout test

步骤2: git pull --rebase origin master

步骤3:如果存在一些冲突,请转到这些文件进行修改。

步骤4:添加这些更改

git add #your_changes_files

步骤5: git rebase --continue

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

步骤7:然后在测试和主机之间没有冲突。 您可以直接使用合并。


#10楼

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

这样,您便可以查看在两个分支分歧之后,什么提交提交到了文件中。 通常,它更容易解决冲突。


#11楼

我始终按照以下步骤操作以避免冲突。

  • git checkout master(进入master分支)
  • git pull(更新您的母版以获得最新代码)
  • git checkout -b mybranch(签出一个新的分支并开始在该分支上工作,以便您的主服务器始终保持在主干的顶部。)
  • git添加 AND git commit和git push(更改后在本地分支上)
  • git checkout master(回到您的master。)

现在,您可以执行相同的操作,并维护所需的多个本地分支,并在需要时同时进行git checkout的同时工作。


#12楼

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

  1. 检查Git状态: git status

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

  3. 签出本地分支(在我的示例中为temp1): git checkout -b temp1

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

  5. 启动mergetool并检查冲突并解决它们...并使用当前分支检查远程分支中的更改: git mergetool

  6. 再次检查状态: git status

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

  8. 再次检查状态: git status

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

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


#13楼

同时更改文件时,会发生合并冲突。 这是解决方法。

git CLI

当您陷入冲突状态时,请执行以下简单步骤:

  1. 请注意以下冲突文件列表: git status (在“未Unmerged 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然后像往常一样推送到remote。

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

有关实际的教程,请检查: 场景5-修复Katacoda的合并冲突 。

差异合并

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

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

图像来源: DiffMerge (Linux屏幕截图)

只需下载并以以下方式在回购中运行:

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

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

  • ⌘ - Alt- 上 / 下跳到上一个/下一个更改。
  • ⌘ - Alt- 左 / 右接受来自左或右的更改

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


#14楼

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

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

git fetch origin
git pull origin masterFrom 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 masterFrom 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 masterFrom ssh://gitosis@example.com:22/projectname* branch            master     -> FETCH_HEAD
Already up-to-date.

-


#15楼

奖金:

说到上述答案中的拉取/提取/合并,我想分享一个有趣且富有成效的技巧,

git pull --rebase

上面的命令是我的git一生中最有用的命令,它节省了很多时间。

在将新提交的更改推送到远程服务器之前,请尝试git pull --rebase而不是git pull和手动merge ,它将自动同步最新的远程服务器更改(通过fetch + merge),并将本地最新提交置于git的顶部日志。 无需担心手动拉/合并。

如有冲突,请使用

git mergetool
git add conflict_file
git rebase --continue

有关详细信息,请访问: http : //gitolite.com/git-pull--rebase


#16楼

简而言之,如果您知道其中一个存储库中的更改并不重要,并且想要解决所有更改以支持另一个存储库,请使用:

git checkout . --ours

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

git checkout . --theirs

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

否则,您将不得不使用GUI合并工具来一步一步地浏览文件,例如合并工具为p4merge ,或者写下您已经安装的任何人的名字。

git mergetool -t p4merge

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


#17楼

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

  • 运行“ 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 configs以使用Kdiff作为其合并工具:

$ 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

(请记住将路径替换为Kdiff exe文件的实际路径。)

然后,每次遇到合并冲突时,您只需要运行以下命令:

$git mergetool

然后,它打开Kdiff3,然后首先尝试自动解决合并冲突。 大多数冲突将自发解决,您需要手动修复其余的冲突。

这是Kdiff3的样子:

然后,一旦完成,请保存文件,然后转到有冲突的下一个文件,然后再次执行相同的操作,直到解决所有冲突。

要检查所有内容是否成功合并,只需再次运行mergetool命令,您应该得到以下结果:

$git mergetool
No files need merging

#18楼

我要么想要我的完整版本,要么想要查看单个更改并决定每个更改。

完全接受我或他们的版本

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

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。


#19楼

patience

令我惊讶的是,没有其他人谈论过使用合并递归策略来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>

#20楼

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

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


#21楼

从2016年12月12日开始,您可以合并分支并解决github.com上的冲突

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

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


#22楼

共有3个步骤:

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

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

     <<<<<<<<head blablabla 
  3. 将其更改为所需的方式,然后使用命令进行提交

     git add solved_conflicts_files git commit -m 'merge msg' 

#23楼

git获取
git checkout 你的分支
git rebase master

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

您可以点击此链接检查ho来解决文件中的冲突
https://help.github.com/articles/resolving-a-merge-conflict-using-the-command-line/

git添加
git rebase-继续
git commit-修改
git push origin HEAD:refs / drafts / master(像草稿一样推送)

现在,一切都很好,您会发现自己在gerrit中的承诺

我希望这将对每个与此问题有关的人有所帮助。


#24楼

对于使用Visual Studio的用户(在我的情况下为2015)

  1. 在VS中关闭项目。 尤其是在大型项目中,使用UI进行合并时,VS往往会出现异常。

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

    git checkout target_branch

    git merge source_branch

  3. 然后在VS中打开项目,然后转到Team Explorer-> Branch。 现在,出现一条消息,指出合并处于挂起状态,并且在该消息的正下方列出了有冲突的文件。

  4. 单击有冲突的文件,您将可以选择合并,比较,获取源,获取目标。 VS中的合并工具非常易于使用。


#25楼

如果您使用intelliJ作为IDE,请尝试通过以下方法将父级合并到分支中

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

它将显示所有这样的冲突

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

现在请注意,文件TestClass.java在intelliJ中显示为红色,并且git status将显示

Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified:   src/test/java/com/.../TestClass.java

在intelliJ中打开文件,它将包含以下部分:

  <<<<<<< HEADpublic void testMethod() {}=======public void testMethod() { ...}>>>>>>> origin/<remotebranch>

HEAD是本地分支上的更改,而origin /是远程分支上的更改。 在这里保留您需要的东西,然后删除不需要的东西。 那是

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

#26楼

我遵循以下过程。

解决合并冲突的过程:

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

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

  3. 进行git add将这些编辑后的文件git add到git队列中,以便可以commitpush送到您正在处理的同一分支。

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

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

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


#27楼

这个答案是为像我这样喜欢在编辑器中进行所有操作的VIM用户添加替代方法。


TL; DR


Tpope提出了这个功能强大的VIM插件fugitive 。 一旦安装,你可以运行:Gstatus检查有冲突的文件:Gdiff要在3种方式合并打开的Git。

在三元合并中, 逃犯可以让您以以下方式获取要合并的任何分支的更改:

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

完成合并文件后,在合并的缓冲区中键入:Gwrite 。 Vimcasts发布了一段精彩的视频 ,详细介绍了此步骤。


#28楼

如果尚未尝试,请尝试使用Visual Studio Code进行编辑。 它的作用是在您尝试合并(并陷入合并冲突)之后。VS代码自动检测到合并冲突。

通过显示对原始内容所做的更改以及您是否接受incoming或删除的内容,它可以为您提供很好的帮助。

current change (表示合并前的原始current change )'?。

它对我有帮助,它也可以为您服务!

PS:只有在您的代码和Visual Studio Code中配置了git时,它才有效。


#29楼

Gitlense For VS代码

您可以尝试Gitlense for VS Code,它们的主要功能是:

3.轻松解决冲突。

我已经喜欢这个功能:

2.当前的线路责备。

3.天沟责备

4.状态栏责备

您可以在此处查看许多功能。


#30楼

我发现合并工具很少能帮助我理解冲突或解决方案。 通常,在文本编辑器中查看冲突标记并使用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

这与使用合并工具不同,因为合并工具也将包括所有不冲突的差异块。 我发现这会分散注意力。

技巧二

有人已经提到了这一点,但是了解每个差异块背后的意图通常对于理解冲突的根源和如何处理很有帮助。

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

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

秘诀三

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

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

秘诀四

未雨绸缪; 与同事沟通。

提前计划并了解其他人正在做什么,可以帮助防止合并冲突和/或帮助及早解决它们-尽管细节仍在脑海中。

例如,如果您知道您和另一个人都在进行都会影响同一组文件的不同重构,那么您应该提前进行交谈,以便更好地了解每个人的更改类型制造。 如果以串行方式而不是并行方式执行计划的更改,则可以节省大量时间和精力。

对于跨越大量代码的大型重构,您应该强烈考虑串行工作:每个人都停止工作在代码的那个区域,而一个人执行完整的重构。

如果您不能连续工作(也许是由于时间紧迫),那么就预期的合并冲突进行交流至少可以帮助您在细节仍在脑海中的同时早日解决问题。 例如,如果某个同事在一个星期的时间内进行了一系列破坏性的提交,则您可以选择在该周中每天一次或两次在该同事分支上进行合并/重新设置。 这样,如果您发现合并/重新设置冲突,则与等待几周一次将所有内容合并在一起相比,可以更快地解决它们。

秘诀五

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

合并可能会让人感到不知所措,尤其是当存在大量冲突文件并且冲突标记覆盖数百行时。 通常,在估算软件项目时,我们没有为处理诸如粗糙的合并之类的开销项目留出足够的时间,因此,花数小时来剖析每个冲突似乎是一种真正的拖累。

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

如何解决Git中的合并冲突相关推荐

  1. 解决git 中 error 10053 问题

    解决git 中 error 10053 问题 问题描述: git pull 时,报错:fatal: unable to access 'https://github.com/huangyuanyin/ ...

  2. 解决Git中打开gitk图形界面时中文部分乱码

    解决Git中打开gitk图形界面时中文部分乱码 gitri图形日志gitk打开时,看到中文时乱码,不用着急按照下面方法立刻解决! 分析:这大部分是因为编码格式的问题,建议使用utf-8 without ...

  3. git 阿善有用 git 的分支合并 冲突的解决

    今日内容:1) Git基本介绍2) Git安装操作3) 如何使用Git管理版本库操作4) 远程仓库: 码云5) 分支管理6) 在IDEA中如何git--- 一上午的时间7) 主题一: 访问咨询主题看板 ...

  4. git pull时报合并冲突的bug

    想在本地拉下最新的代码,不知为啥,出现合并冲突的bug warning: Cannot merge binary files: by.tar (HEAD vs. 050fecfd1537b03953d ...

  5. kotlin中既继承又实现_Kotlin程序| 解决继承中的主要冲突的示例

    kotlin中既继承又实现 继承中的主要冲突 (Overriding Conflicts in Inheritance) It may appear, we inherit more than one ...

  6. 解决git中出现的“fatal ‘xxxx‘ does not appear to be a git repository”错误的方法

    今天来分享一下我在使用git中出现的一个错误提示,话不多说,我们直接来分析~ 这个错误是我在通过SSH方式pull远程仓库时候出现的,错误提示如下: fatal: 'xxx(你的仓库别名)' does ...

  7. git (master|MERGING)合并冲突

    进行git操作时,推送失败. 这是因为本地分支与远程不同步, git pull origin master 合并出现冲突,直接去代码编辑器中解决冲突 然后 git add . git commit - ...

  8. 解决Git中fatal: refusing to merge unrelated histories

    Git的报错 在使用Git的过程中有时会出现一些问题,那么在解决了每个问题的时候,都需要去总结记录下来,下次不再犯. 一.fatal: refusing to merge unrelated hist ...

  9. 解决Git中fatal: refusing to merge unrelated histories(亲测)

    Git的报错 在使用Git的过程中有时会出现一些问题,那么在解决了每个问题的时候,都需要去总结记录下来,下次不再犯. 一.fatal: refusing to merge unrelated hist ...

最新文章

  1. 文本框可编辑查看页面
  2. torch.norm
  3. Python操作MySQL之SQLAlchemy
  4. python args函数_Python函数参数*args和**kwargs
  5. Redis 命令--Redis列表(List))
  6. http multipart java_Http MultiPart请求
  7. [备查]SPQuery 返回所有的项目(查询不生效)的问题
  8. Install Cockpit on Fedora/CentOS/RHEL
  9. 旁站,子域名,C段的含义
  10. 小程序分类图标提取_垃圾分类小程序上线 微信和支付宝都支持
  11. U盘拔出时总是提示有程序正在使用?
  12. 我们和蹦迪博主聊了聊,哪家大厂人在夜店最受欢迎?
  13. PHP 毕生功力 图片,视听发烧网_汇集毕生功力的代表作:静神Monitor Acoustics KenStyle Silver Signature...
  14. 解码快手新市井电商,新品牌流量多,大品牌政策好
  15. Robot Framework(3)——RIDE工具详解
  16. java基于HuTool工具类ExcelWriter合并单元格
  17. /opt/MegaRAID/MegaCli/MegaCli64
  18. Ubuntu !生命不息,折腾不止!
  19. GOF23设计模式总结
  20. 树莓派魔镜MagicMirror —— 7 安装MagicMirror

热门文章

  1. 360Apm源码解析
  2. Android多媒体框架之MediaMetadataRetriever
  3. 第十、十一周项目一-点-圆-圆柱类族的设计(1)
  4. Android App代码混淆终极解决方案
  5. ScrollView和ListView冲突解决
  6. opengl 贴图坐标控制_材质贴图正确打开方式
  7. 【Android UI】TextView的垂直方向概念之top,bottom,ascent,descent,baseline
  8. java解析getresponsebodyasstring_java读取网站内容的两种方法是什么呢?
  9. webpage not available是什么意思_MySQL很想啊,为什么还要有noSQL?
  10. page fault in nonpaged area 蓝屏_记一次蓝屏0x00000050