git分支学习笔记2-解决合并的冲突

作者

git中合并冲突是在不同的分支中同一个文件的内容不同导致的,如果进行合并就会冲突。文件可能是新增的文件,比如在两个分支中都新建了同一个文件,但是他们的内容不同,或是在两个分支中都更新了同一个文件,但是更新的内容不同。最终导致同一文件在不同的分支中内容不同。如果需要进行合并,就必须人工解决冲突,或者撤销合并。

"创建一个有冲突的合并"

git解决冲突示例
git解决冲突示例

初始化一个仓库,然后创建一个 dev分支,分支里添加一个文件 master-dev.txt,然后提交到 dev分支。切换到 master分支,同样的操作也是提交了同一个文件master-dev.txt,同样提交到master 分支中,但是这两个文件的内容是不同的。如果想把 dev的分支提交到master中,代码就会有冲突。

创建“冲突”

echo "测试-代码提交冲突" > README
git init .
git add .
git commit -m 'init'
# 创建一个 dev 分支,并切换到dev分支
git checkout -b dev

# 当前的分支 dev
git branch
#* dev
#  master
echo "dev" >  master-dev.txt

# 在dev分支中提交
git commit -m '[dev branch ]add file master-dev.txt'


git checkout master
echo "master" >  master-dev.txt
git add .
git commit -m '[master branch ]add file master-dev.txt'

把dev分支的代码合并的master中,看看什么情况。

# 把 dev分支的代码合并到当前的分支,也就是 master 分支中
git merge dev

#自动的合并文件 master-dev.txt
Auto-merging master-dev.txt

# 提示了冲突, 合并冲突在  master-dev.txt
CONFLICT (add/add): Merge conflict in master-dev.txt

# 自动合并失败, 修改一个冲突,然后提交结果
Automatic merge failed; fix conflicts and then commit the result.

出现了冲突,这是时候 master-dev.txt 的内容会被修改,会把两个分支中的文件内容都 汇集 master-dev.txt 文件中。

 cat master-dev.txt
<<<<<<< HEAD
master
=======
dev
>>>>>>> dev

需要注意的地方是,产生了冲突,并且当前的文件 master-dev.txt被修改了。这个时候,只能是先解决冲突。再进行下一步操作。比如想看一下 dev分支中的文件 master-dev.txt 的内容是否也被修改了,这个时候看不了,因为要先解决冲突。事实上,出现冲突的时候,是不能切换分支的。这样有个好处就是,就是防止有问题的代码污染了其他的分支。

git checkout dev
master-dev.txt: needs merge
# 必须先解决当前的索引区的冲突
error: you need to resolve your current index first

解决代码合并中的冲突

git使用 7个左键箭头 + 当前分支,7个等号和7个右箭头 + 当前分支 来表示冲突的代码,一共是三行。解决冲突就是修改代码后,并删除这三行。比如本次的修改就是删除这三行。

cat master-dev.txt
master
dev

修改后看下当前的状态

git status
On branch master
# 存在没有合并成功的部分
You have unmerged paths.
# 修正错误,并提提交
  (fix conflicts and run "git commit")
# 使用  git merge --about 终止合并
  (use "git merge --abort" to abort the merge)

# 没有合并的文件
Unmerged paths:
  (use "git add <file>..." to mark resolution)
        both added:      master-dev.txt

修改了冲突的文件,冲突并没有得到解决 ,因为文件并没有提交。没有继续合并,或者撤销合并。所以依然不能切换分支的。

git checkout dev
master-dev.txt: needs merge
error: you need to resolve your current index first

这里进行提交一下看看结果。

git add master-dev.txt
git commit -m 'both commit'

# 当前的分支是 master
cat master-dev.txt
master
dev

# 切换到dev分支
cat master-dev.txt
dev
# 可以看到dev分支的内容换是原来的内容,并没有改变。

这样就合并了有冲突的分支, 现在有一个问题,就是 dev分支的内容和 master分支的内容是不同的。如何同步能?


# 在dev分支中,更新master中的内容 git rebase master #First, rewinding head to replay your work on top of it... #Fast-forwarded dev to master. # 这个表明,现在 dev分支的内容和master分支的内容是一致的。 cat master-dev.txt master dev

可以思考几个问题:
1. 如果两个分支里添加了一个 一模一样的文件算是冲突吗?
2. 如果两个文件,内容相同,名字不同呢?
3. 如果提交的文件,部分冲突呢?

回复

电子邮件地址不会被公开。