协作开发必然会遇到冲突的情况(仓库上版本与本地版本不一致),导致合并(merge)、提交(commit)、推送(push)失败,所以学会解决冲突尤为重要。
目录:
一、冲突说明
二、命令方式实践
三、TortoiseGit 工具相关功能简介
一、冲突说明
如下场景。本地代码为在仓库版本为E 时克隆至本地的,之后仓库上代码与本地版代码有提交,导致仓库上代码最新版本为C,而本地的最新版本为G。
此时,若直接拉取(pull,相当于fetch + merge),Git 会提示:error:...would be overwriten by merge.
pull 失败后,本地代码的状态是不会改变的,即并未合并。为了能合并最新仓库代码,有两种方式:
(一)、先将本地代码的所有改变另存后还原到E 版本,之后再执行pull 命令;
(二)、将本地代码的改变贮藏(git stash),即另存,这时本地代码也会回到E 版本。
之后拉取合并成功后,再将本地代码先前的改变应用上去即可。对于方式一,可手动修改,对方式二,执行git stash pop 或git stash apply 命令。之后再整理冲突,完成后提交并推送。
最终,合并的结果如图:
二、命令方式实践
仍然是上一笔记的项目,为了模拟协作开发,首先直接在码云上将文件进行编辑,使其版本高于本地上一次合并时的版本。
之后,修改本地的该文件内容为:本地添加的内容
之后,文字描述实践步骤为:
1、提交前拉取:
git pull origin HEAD
结果:提示:error:Your local changes to the following files would by overwriten by merge.
因为pull 相当于fetch + merge,fetch 成功,但merge 失败,本地文件不变。
2、采用stash 命令,将本地改变贮藏:
git stash
git stash list
git stash list 只是查看贮藏的文件列表。
随后,可git status 看下本地项目状态,发现未提示任何变化,保持与“版本E”完全一致。
3、重新拉取
git pull origin HEAD
结果:成功,更新到了仓库的最新版本。
对应此演示项目,myFile.txt文件内容变为:
4、将本地变化应用到仓库最新版本上,即使用贮藏的文件
git stash apply/pop
区别:apply 仅应用贮藏文件(貌似可以多次应用),不会将其从贮藏列表移除,而pop 会移除贮藏列表。
结果:合并成功。myFile.txt内容变为:
5、解决冲突
应用贮藏文件后的文件为最新文件,根据需要修改文件内容。此处不做修改。
6、使文件变为staged 状态(git add),以便commit 时该文件能使版本更新
git add myFile.txt
7、提交
git commit -m "注释"
8、推送到远端,此处即码云上
9、查看码云上项目,结果推送成功。
三、TortoiseGit 贮藏功能简介