详解Git合并冲突——问题重现、原因及解决 “Automatic merge failed; fix conflicts and then commit the result.“

这篇具有很好参考价值的文章主要介绍了详解Git合并冲突——问题重现、原因及解决 “Automatic merge failed; fix conflicts and then commit the result.“。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


最后更新日期:2022/10/6

在Git中使用git merge命令合并两个分支的时候,有可能产生这种情况:

$ git merge A
Auto-merging merge.txt
CONFLICT (content): Merge conflict in merge.txt
Automatic merge failed; fix conflicts and then commit the result.

这就是发生了冲突(conflict)。

为什么会有冲突?要如何解决呢?请看下文介绍。

为什么会发生冲突?

简单来说,就是两个分支都对同一个文件做了更改,当这两个分支合并的时候,Git不知道要采用哪一个更改,便发生了冲突。

git merge 冲突,Git,git,github,团队开发
图1 一个冲突的例子

举个栗子,假设刚开始master分支版本为C0,然后依次发生了以下情况:

  1. 小A基于C0创建新分支new_branch,并在该分支上改动了文件merge.txt,提交得到版本C2
  2. 小B在主分支master上进行开发,同样改动了merge.txt,提交得到版本C1

此时,如果用git mergemasternew_branch合并,就会发生冲突。完整的过程如图1所示。

Git提示冲突,也是一件好事,它其实是在告诉你:
“你让我合并new_branchmaster两个分支,但是它们两个都改动了merge.txt,一个说要这样改,一个说要那样改,我应该听谁的呀?你来帮我看下吧!”。(形象解释)

在讲解如何解决冲突之前,我们得先有一个冲突。下面将根据图1制造出一个冲突。

制造一个冲突

制造图1的冲突分为4个步骤:

  • 第一步:初始化仓库及文件
  • 第二步:在新分支上更改并提交文件
  • 第三步:在主分支上更改并提交文件
  • 第四步:执行合并,触发冲突

第一步:初始化仓库及文件

首先创建一个新仓库。打开Git Bash,顺序执行以下命令:

$ mkdir git-merge-test
$ cd git-merge-test
$ git init
Initialized empty Git repository in path/to/your/work/dictionary/git-merge-test/.git/

以上命令在当前位置创建了一个名为git-merge-test的文件夹,并将其初始化为Git仓库。

然后创建仓库文件。在仓库根目录下新建merge.txt,写入以下内容:

这是第一行,这行不会被修改
这是第二行

git merge 冲突,Git,git,github,团队开发

添加merge.txt到暂存区并提交更改:

$ git add .
$ git commit -m"初始化仓库内容"
[master 8bc6262] 初始化仓库
 Date: Wed Oct 5 16:30:35 2022 +0800
 1 file changed, 2 insertions(+)
 create mode 100644 merge.txt

此时,master处于图1中的C0

第二步:在新分支上更改并提交文件

然后,创建一个新分支new_branch::

$ git checkout -b new_branch
Switched to a new branch 'new_branch'

说明:git checkout -b 分支名表示创建一个新分支并切换到这个分支上。

修改merge.txt

这是第一行,这行不会被修改
我在new_branch分支上修改了第二行

git merge 冲突,Git,git,github,团队开发

添加merge.txt并提交更改:

$ git commit -am"修改merge.txt"
[new_branch 8eb88a9] 修改merge.txt
 1 file changed, 1 insertion(+), 1 deletion(-)

说明:git commit -am"提交信息"中的选项a表示先git add所有发生改动的文件再提交。

此时,new_branch位于图1中的C2

第三步:在主分支上更改并提交文件

$ git checkout master
Switched to branch 'master'
$ echo "我在master分支上添加了第三行" >> merge.txt
$ git commit -am"新增内容到merge.txt"
[master 52c86fa] 新增内容到merge.txt
 1 file changed, 1 insertion(+)

上述命令的意思是,先切换回master分支,然后往merge.txt中添加一行内容(">>"表示追加重定向文件),最后提交更改。

此时,master位于图1中的C1

第四步:执行合并,触发冲突

在合并之前,我们先捋一下现在的状况:

  • 最初的merge.txt的内容为:
    这是第一行,这行不会被修改
    这是第二行
    
  • new_branch分支上改动后的merge.txt内容为:
    这是第一行,这行不会被修改
    我在new_branch分支上修改了第二行
    
  • master主分支上改动后的merge.txt内容为:
    这是第一行,这行不会被修改
    这是第二行
    我在master分支上添加了第三行
    

两个分支都改动了merge.txt,合并会发生什么呢?下面就来试一下。

master分支上执行git merge new_branch,尝试把new_branch分支合并过来:

$ git merge new_branch
Auto-merging merge.txt
CONFLICT (content): Merge conflict in merge.txt
Automatic merge failed; fix conflicts and then commit the result.

可以看到,冲突发生了。

在解决冲突之前,应该先要知道如何查看冲突。下面将进行介绍。

如何查看冲突?

文章刚开始已经提到,合并时发生冲突,是因为两个分支都对同一个文件做了更改。当合并masternew_branch的时候,Git发现对于merge.txt,一个分支这样改,另一个分支那样改,就陷入了两难。从报错信息可知,冲突需要我们手动解决后方可提交。

很多人到这里就懵了,不知道该怎么弄。实际上,我们现在正处于合并的“中间状态”。合并的中间状态就是合并了,但还没完全合并。。好吧,是废话,意思就是你执行git merge了,但git merge并没有执行完成(因为发生冲突了),需要你解决冲突后继续进行。

敲入git status,就可以看到这样的信息:

$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)
        both modified:   merge.txt

no changes added to commit (use "git add" and/or "git commit -a")

git status告诉我们以下信息:

  • “You have unmerged paths”:我们现在正处于合并的中间状态,有一些没有合并的文件;
  • “Unmerged paths”:下面列出了所有未合并的文件,都显示为红色(网页上看不到)。可以看到,merge.txt没有合并,因为两个分支都更改了它(“both modified”),发生了冲突。我们要先把冲突解决了。

那我们现在就来查看冲突。用编辑器打开merge.txt,会发现内容变成了这样:

这是第一行,这行不会被修改
<<<<<<< HEAD
这是第二行
我在master分支上添加了第三行
=======
我在new_branch分支上修改了第二行
>>>>>>> new_branch

里面多了三行我们看不懂的记号:

  • <<<<<<< HEAD
  • =======
  • >>>>>>> new_branch

这些记号是标记冲突内容的分隔线,解释如下:

  • <<<<<<< HEAD=======之间的内容:是master分支修改的内容(准确来说是HEAD指针指向的分支修改的内容);
  • =======>>>>>>> new_branch之间的内容:是new_branch分支修改的内容;
  • 分割线之外的内容:是两个分支都没有改动的内容(如merge.txt第一行)。

看懂了吗?然后,解决冲突就变得很简单了。

如何解决冲突?

解决冲突只需3步:

  1. 编辑冲突文件。决定要保留的内容,然后删掉三行分割线
  2. git add将冲突文件添加到暂存区
  3. git commit提交

对于第1步,要按照你的具体情况去改。通常情况下,我们有这两种做法:

  • 保留其中一个修改,删掉另一个
  • 同时保留两个修改

不管怎样,最终改好的文件会原封不动地提交到仓库中。另外需要注意,最后不要忘了删掉三行分隔线,即:<<<<<<< HEAD=======>>>>>>> new_branch

在我们的例子中,假如我们想同时保留两个分支的修改,那么可以编辑merge.txt,仅删掉三行分隔线,其他部分不用管,得到以下内容:

这是第一行,这行不会被修改
这是第二行
我在master分支上添加了第三行
我在new_branch分支上修改了第二行

改好后,就可以提交了:

$ git add merge.txt
$ git commit -m "合并new_branch分支并解决冲突"
[master 0c88c4f] 合并new_branch分支并解决冲突

查看合并后的提交记录:

$ git log
commit 0c88c4f9210af067125c9027f3e5885065f88dd0 (HEAD -> master)
Merge: 52c86fa 8eb88a9
Author: lanjianghao <528601933@qq.com>
Date:   Wed Oct 5 22:28:34 2022 +0800

    合并new_branch分支并解决冲突

commit 52c86fa51bca34c7763ed7b56b7705b3ce31379c
Author: lanjianghao <528601933@qq.com>
Date:   Wed Oct 5 19:23:32 2022 +0800

    新增内容到merge.txt

commit 8eb88a9d1dc88b30333492ec44c12685aaa8187c (new_branch)
Author: lanjianghao <528601933@qq.com>
Date:   Wed Oct 5 19:17:06 2022 +0800

    修改merge.txt

commit 8bc626277eec39e413dcdd764642865b5291674e
Author: lanjianghao <528601933@qq.com>
Date:   Wed Oct 5 16:30:35 2022 +0800

    初始化仓库

可以看到,日志中新增了一条合并记录。

总结

  • 为什么合并时发生了冲突?
    • 要合并的两个分支改动了同一个文件,Git不知道要采用哪个,还是两个都采用,需要由你来决定。
  • 怎样查看冲突?
    • git status查看冲突的文件
    • 编辑器打开冲突的文件,查看冲突的内容
    • 冲突内容分隔线怎么看:
      未冲突的内容(两个分支都未改动)在分隔线外面
      <<<<<<< HEAD
      Git当前所在分支修改的内容(准确来说是HEAD指针指向的分支修改的内容)
      =======
      要合并过来的分支修改的内容
      >>>>>>> branch_to_merge
      
  • 怎样解决冲突?
    1. git status查看冲突的文件
    2. 编辑冲突文件,解决冲突(记得删除三行分隔线)
    3. git add 冲突文件
    4. git commit -m "提交信息"

其他问题

  • 我不想继续合并了,如何退出合并的中间状态?
    git merge --abort
    
    前文中提到,如果执行git merge合并时发生冲突,则会进入合并的中间状态。合并的中间状态下将无法执行其他一些操作(如切换分支)。
    如果不想继续合并,要先用git merge --abort命令退出。该命令会使你回到执行git merge 分支之前的状态。

感谢大家能看到这里!本人也还是小白,如果有不对的地方,欢迎指正!

参考:
https://www.atlassian.com/git/tutorials/using-branches/merge-conflicts文章来源地址https://www.toymoban.com/news/detail-633976.html

到了这里,关于详解Git合并冲突——问题重现、原因及解决 “Automatic merge failed; fix conflicts and then commit the result.“的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Git管理神器SourceTree使用教程详解(连接远程仓库,克隆,拉取,提交,推送,新建/切换/合并分支,冲突解决,提交PR)

    Git管理神器SourceTree使用教程详解(连接远程仓库,克隆,拉取,提交,推送,新建/切换/合并分支,冲突解决,提交PR)

    俗话说的好工欲善其事必先利其器,Git分布式版本控制系统是我们日常开发中不可或缺的。目前市面上比较流行的Git可视化管理工具有SourceTree、Github Desktop、TortoiseGit,综合网上的一些文章分析和自己的日常开发实践心得个人比较推荐开发者使用SourceTree,因为SourceTree同时支持

    2024年02月03日
    浏览(52)
  • git 分支合并冲突解决

    git 分支合并冲突解决

    已经累到不想说话了,直接上流程吧! 1、比如你想A分支合并到B分支,先把这两分支都pull一下最新代码:git pull 2、切换到要合并的分支:git checkout tougu_pan (tougu_pan 是我的B分支) 3、在 tougu_pan 分支上执行 git merge --no-ff dev 4、git status 查看本地修改,就会出现以下状态 5、如

    2024年02月10日
    浏览(41)
  • git代码合并、git解决冲突的方法?

    Git是一种分布式版本控制系统,它提供了多种方法来合并代码和解决冲突。下面是两个常见的场景以及对应的操作步骤: 合并分支 当我们在一个项目中有多个分支时,需要将不同分支中的代码合并到一起。假设我们有一个主分支master和一个开发分支dev,现在需要将dev分支合

    2024年02月02日
    浏览(47)
  • git使用常见问题(提交代码,合并冲突)

    git使用常见问题(提交代码,合并冲突)

    git fetch 获取远程分支更新 git branch 查看本地分支 git branch -r 查看远程分支 git branch -a 查看所有分支(本地分支和远程分支) git clone 地址 克隆代码 git checkout 切换分支 git pull 同步到本地(拉) git push 推送至服务器 git checkout -b dev origin/master 基于主分支创建dev分支 git add . 添加

    2024年02月03日
    浏览(49)
  • Git合并多分支及冲突解决

    工作场景 工作场景中我们常常会遇到以下情况: 小明:靓仔/妹,我上线那天有事情,我的那个分支你帮我一起推一下 摸鱼崽:帮我也合一下,好哥哥 我:好(你)呀(md) 如果在这种时候你说我不会,我只会add,commit、push我本地的,你的分支我哪儿会啊,是不是有点尴尬

    2024年02月13日
    浏览(12)
  • 【Git】分支合并&冲突产生与解决

    【Git】分支合并&冲突产生与解决

    文章学习自:麦兜搞IT,如有侵权,告知删除 合并操作在Git中属于最为核心的一个操作,包括三种合并方式:一种为fast forward ,需要满足有非常强的前提条件才能执行;一种为3 way merge方式,这种是我们工作中常见的;最后一种为变基rebase。另外,本篇文章也会深入讲解冲突

    2024年02月04日
    浏览(12)
  • 【Git教程】(六)分支合并 —— 合并过程,各类合并冲突及解决思路 ~

    【Git教程】(六)分支合并 —— 合并过程,各类合并冲突及解决思路 ~

    使用 merge 命令来进行分支合并是 Git 中最重要的操作之一。虽然这一操作的底层算法很复杂,但调用起来却很简单。我们可以通过指定分支名称来选择待合并修改的分支。然后, Git 会基于合并的内容来创建一次新的提交。 下面,我们来看下图中的这个例子:在一群开发者在

    2024年04月25日
    浏览(14)
  • git必备知识 git使用常见问题(提交代码,合并冲突)

    git必备知识 git使用常见问题(提交代码,合并冲突)

    git fetch 获取远程分支更新 git branch 查看本地分支 git branch -r 查看远程分支 git branch -a 查看所有分支(本地分支和远程分支) git clone 地址 克隆代码 git checkout 切换分支 git pull 同步到本地(拉) git push 推送至服务器 git checkout -b dev origin/master 基于主分支创建dev分支 git add . 添加

    2024年02月16日
    浏览(44)
  • Git合并冲突——both modified解决

    Git合并冲突——both modified解决

    使用GitHub的时候,手欠在网页上修改了readme,然后今天在本地更新readme的时候又忘记了git pull先,然后就出现了merge conflict了,提示both modified 那么这个时候,我们不要慌,想办法解决冲突就好了 调出合并工具  回车使用工具,出现kdiff3图形界面,其中A区为修改前,B区为本地

    2024年02月16日
    浏览(8)
  • 如何解决Git合并分支造成的冲突

    如何解决Git合并分支造成的冲突

    一、造成冲突的场景         在我们在参与项目开发的时候,通常会创建公共的文件,但是当我们编码完成,使用git进行分支合并时,往往会出现合并冲突,也就是负责不同部分的开发人员会对同一个文件的同一个部分进行修改,这个时候就需要我们解决合并造成的冲突

    2023年04月23日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包