Git merge时遇到的坑

来源:互联网 发布:php彩票开奖源码 编辑:程序博客网 时间:2024/05/16 23:50

之前有了一次凌乱的git提交经历,虽然最后还是将代码成功合并了,但是最后还是踩了一个坑。
历史commit中被下掉的代码居然出现在了最终的commit中。。

猜想可能是下面的流程:
- 之前提交mr的时候把原本要下掉的代码提交到远程分支,
- 后来觉得代码有问题,本地reset到上个commit,然后把老代码下掉,增加新代码
- 再次提交时,由于两次修改的地方不一样,因此git判断没有冲突
- 最终提交后,git保留了两次修改的部分。。。

为了验证,我们可以做一个小实验:
新建一个git仓库

mkdir git-testcd git-testgit init

新增一个文件README.md,输入以下内容:

start

line

end

将此作为一个提交:

git add .git commit -m "git init"

初始化完成,我们先增加一行代码,将README.md修改为

start
add line #这是第一次修改的内容
line

end

提交

git add .git commit -m "version a"

这个过程相当于之前的老代码提交到远程分支的过程

之后我们checkout一个分支,当作我们的本地分支

git checkout -b local

此时我们要回退到上个版本,并将老代码下掉,增加新代码

git reset HEAD^ --hard

编辑README.md

start

line
add line 这是第二次修改的内容
end

提交

git add .git commit -m "version b"

这个时候回到master分支,merge一下local分支,相当于之前第二次提交代码到远程分支的过程

git checkout mastergit merge local

此时未提示冲突,直接合并。。。
最终README.md内容如下:

start
add line #这是第一次修改的内容
line
add line 这是第二次修改的内容
end

推测正确,这种情况git不会判断为冲突。

Git 在merge过程中判定冲突的方法如下:
undefined
当A分支要merge B分支时,Git会首先计算出两者最近的共同祖先C。
然后分别算出A与C的变更,以及B与C的变更。
在这两份变更中,如果更改了同一部分内容,且更改不相同,则会判定为有冲突。
否则,若改动的内容不是同一部分,或者改了同一部分内容但是更改后的内容也一样,则不会产生冲突。

为了避免以上我踩过的坑,记住一个原则。
已经merge到其它分支上的commit,不要再回退,直接在原commit上改动即可。否则你会产生各种诡异的现象。

原创粉丝点击