我在git merge的时候遇到了冲突,怎么解决?

我在git merge的时候遇到了冲突,怎么解决?,第1张

首先我们来看看为什么会冲突,git冲突的原因很简单,就是两个分支当中对同一处代码进行了不同的改动。于是git会困惑,不知道在merge的时候究竟应该怎么做,于是就会出现冲突。

实战

光说不练没有意义,让我们来实际 *** 作一下。

我们首先创建一个一个testtxt文件,在其中写入一行test。git add并且git commit。

接着我们checkout -b创建一个新的分支,在这个分支当中我们把testtxt之前的一行改成get conflict。然后我们同样add commit。

最后,我们回到master分支,尝试merge test_conf分支。merge了之后,会看到这样的结果:

输出的log当中提示我们有两个文件出现了冲突,这个第八篇md就是当前编辑的文章,由于我们一直实时在写,所以也会产生冲突。但是文章里的冲突看起来不方便,所以我们就不展示相关的冲突了。我们重点来看testtxt这个文件,也就是我们刚才创建的演示文件。

会发现原本我们testtxt只有一行,现在多出了好几行。这个是git在merge的时候处理冲突的方法,它把两边的冲突都保留了下来。用>>>>>>和=======以及<<<<<<<<这样的符号进行分隔,我们简单介绍一下其中的含义。

其实还是挺明显的,这个<<<<<<<< HEAD后面跟着的内容是HEAD指针指向的节点的代码,也就是我们当前所处的分支master分支当中冲突的代码,这些代码的内容一直到========结束。从=========开始一直到最后>>>>>>> test_conf是我们合并进来的分支的代码。

除了直接打开文件之外,我们还可以运行git diff命令来查看冲突。

解决冲突

手动解决

查看完了冲突之后当然是解决冲突,最简单的方法将去做手动合并。手动合并的方法很简单,就是我们选择我们要保留的代码,然后再把>>>>>, ======, <<<<<<这些提示行给去掉。最后重新add commit。

放弃合并

这样当然可以完成合并,但是显然并不友好,如果改动量小还行,如果改动量很大的话,那么显然是非常费劲的。如果你觉得改动量太大想要先放弃合并,先想想其他的办法,可以使用git merge --abort命令,这样可以让你的代码恢复到合并之前的状态。如果你运行了git merge之后又进行了一些人为的改动,那么在abort之后,也会被回滚掉。

git merge --abort

mergetool

除了手动合并以及放弃之外,我们还有一些其他的合并工具。比如git官方也开发了一个专门用来合并的工具,叫做git merge tool,它会将找到一份两个分支的祖先代码作为base也就是基准,然后再将两个分支的改动都列举出来作为对比,让我们在git编辑器当中决定要留下什么。

它打开大概是这样的,我个人只用过一次,因为觉得太难用了。

git mergetool

IDE工具

除了git官方之外,一般的IDE当中也都会提供merge的工具。比如vscode当中的git插件为我们提供了非常好用的merge功能,它会用不同的颜色高亮不同分支的代码。并且还提供了几个非常好用的功能。分别是保留当前分支的代码,保留合并分支的代码,以及保留两者和对比改动。

我们用vscode打开testtxt之后会看到:

当我点击compare changes之后,它就会把这两个文件排列在一起给我们观察它们各自的改动,不得不说是非常好用了。

1、先将本地修改存储起来
$ git stash
这样本地的所有修改就都被暂时存储起来 。是用git stash list可以看到保存的信息:
git stash暂存修改
git stash暂存修改
其中stash@{0}就是刚才保存的标记。
2、pull内容
暂存了本地修改之后,就可以pull了。
$ git pull
3、还原暂存的内容
$ git stash pop stash@{0}
系统提示如下类似的信息:
Auto-merging c/environc
CONFLICT (content): Merge conflict in c/environc
意思就是系统自动合并修改的内容,但是其中有冲突,需要解决其中的冲突。
4、解决文件中冲突的的部分

首先你要明白造成冲突的原因,两个分支同时修改了同一个文件
既然同时修改了同一个文件的话,那么有两种情况
21 取其中的一个分支的代码
22 合并两个分支,两个分支的都要
关于解决冲突,因为我们使用eclipse,里面集成了一个git解决冲突的软件merge tool,如果你没也不用怕,你可以看见冲突的文件里面有标志位:
<<<<Head
some code branch1
=======
some code branch2
>>>> commitNum
head 到===branch1的代码是你当前分支的代码,而====到commitNum的代码是另一个分支上的,如果你只要branch1的代码,你只要删除===到>>>commitNum里面之间的内容,然后去掉<<<Head标志就好

两个分支合并时,两个已经提交的分支的相同文件的不同 *** 作进行了合并。

当出现冲突时,文件会出现如下图所示的符号。

重新将文件添加到本地缓存区,提交到本地库,最后推送到远程库

git stash 可用来暂存当前正在进行的工作, 比如想pull 最新代码, 又不想加新commit, 或者另外一种情况,为了fix 一个紧急的bug。

先stash, 使返回到自己上一个commit, 改完bug之后再stash pop, 继续原来的工作。基础命令。

re you can merge 这个意思是说更新下来的内容和本地修改的内容有冲突,先提交你的改变或者先将本地修改暂时存储起来。

先将本地修改存储起来 $ git stash 这样本地的所有修改就都被暂时存储起来

系统提示如下类似的信息: Auto-merging c/environc CONFLICT (content): Merge conflict in c/environc 意思就是系统自动合并修改的内容,但是其中有冲突,需要解决其中的冲突。

git冲突内容 其中Updated upstream 和=====之间的内容就是pull下来的内容,====和stashedchanges之间的内容就是本地修改的内容。碰到这种情况,git也不知道哪行内容是需要的。

解决完成之后,就可以正常的提交了。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13370095.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-23
下一篇 2023-07-23

发表评论

登录后才能评论

评论列表(0条)

保存