最后更新日期: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不知道要采用哪一个更改,便发生了冲突。
举个栗子,假设刚开始master分支版本为C0,然后依次发生了以下情况:
C0创建新分支new_branch,并在该分支上改动了文件merge.txt,提交得到版本C2master上进行开发,同样改动了merge.txt,提交得到版本C1此时,如果用git merge将master与new_branch合并,就会发生冲突。完整的过程如图1所示。
Git提示冲突,也是一件好事,它其实是在告诉你:
“你让我合并new_branch和master两个分支,但是它们两个都改动了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,写入以下内容:
这是第一行,这行不会被修改
这是第二行

添加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分支上修改了第二行

添加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.
可以看到,冲突发生了。
在解决冲突之前,应该先要知道如何查看冲突。下面将进行介绍。
文章刚开始已经提到,合并时发生冲突,是因为两个分支都对同一个文件做了更改。当合并master和new_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告诉我们以下信息:
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步:
git add将冲突文件添加到暂存区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 status查看冲突的文件未冲突的内容(两个分支都未改动)在分隔线外面
<<<<<<< HEAD
Git当前所在分支修改的内容(准确来说是HEAD指针指向的分支修改的内容)
=======
要合并过来的分支修改的内容
>>>>>>> branch_to_merge
git status查看冲突的文件git add 冲突文件git commit -m "提交信息"git merge --abort
前文中提到,如果执行git merge合并时发生冲突,则会进入合并的中间状态。合并的中间状态下将无法执行其他一些操作(如切换分支)。git merge --abort命令退出。该命令会使你回到执行git merge 分支之前的状态。感谢大家能看到这里!本人也还是小白,如果有不对的地方,欢迎指正!
参考:
https://www.atlassian.com/git/tutorials/using-branches/merge-conflicts
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声
首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有, 也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g
有什么区别:@attr[:field]=new_value和@attr.merge(:field=>new_value) 最佳答案 如果您使用的是merge!而不是merge,则没有区别。唯一的区别是您可以在合并参数中使用多个字段(意思是:另一个散列)。例子:h1={"a"=>100,"b"=>200}h2={"b"=>254,"c"=>300}h3=h1.merge(h2)putsh1#=>{"a"=>100,"b"=>200}putsh3#=>{"a"=>100,"b"=>254,"c"=>300}h1.merge!(h2)pu
关于如何使用git设置类似Dropbox的服务,您有什么建议吗?您认为git是解决此问题的合适工具吗?我在考虑使用git+rush解决方案,你觉得怎么样? 最佳答案 检查这个开源项目:https://github.com/hbons/SparkleShare来自项目的自述文件:Howdoesitwork?SparkleSharecreatesaspecialfolderonyourcomputer.Youcanaddremotelyhostedfolders(or"projects")tothisfolder.Theseprojec
我编写了一个非常简单的“部署”脚本,作为我的裸git存储库中的post-updateHook运行。变量如下livedomain=~/mydomain.comstagingdomain=~/stage.mydomain.comgitrepolocation=~/git.mydomain.com/thisrepo.git(bare)core=~/git.mydomain.com/thisrepo.gitcore==addedremoteintoeachlive&stagegitslive和stage都初始化了gitrepos(非裸),我已经将我的裸仓库作为远程添加到它们中的每一个(名为co
我正在安装gitlabhq,并且在Gemfile中有对某些资源的“git://...”的引用。但是,我在公司防火墙后面,所以我必须使用http://。我可以手动编辑Gemfile,但我想知道是否有另一种方法告诉bundler使用http://作为git存储库? 最佳答案 您可以通过运行gitconfig--globalurl."https://".insteadOfgit://或通过将以下内容添加到~/.gitconfig:[url"https://"]insteadOf=git://
原始问题Letd(n)bedefinedasthesumofproperdivisorsofn(numberslessthannwhichdivideevenlyinton).Ifd(a)=bandd(b)=a,whereab,thenaandbareanamicablepairandeachofaandbarecalledamicablenumbers.Forexample,theproperdivisorsof220are1,2,4,5,10,11,20,22,44,55and110;therefored(220)=284.Theproperdivisorsof284are1,2,