git权威指南总结七:git merge冲突解决
发布于2017-11-19 16:47:52
git pull拉回操作中的合并
在前面一个博客,我们将到了非快进式推送的非强制性的另一种解决办法,那就是先拉回在提交,这里的拉回其实包含了两个操作:获取远程仓库的数据,将本地数据进行合并。可以这样写:git pull = git fetch + git merge
git merge命令用于合并分支,它的命令行格式为:git merge [options...] <commit>...
大多数情况下的合并我们只需要提供一个commit分支就可以了,默认将指定分支合并到当前分支中。合并后的提交以当前分支的提交作为第一个父提交,以为第二个父提交,合并操作也支持多个与当前工作分支进行合并
默认情况下,合并后的结果会自动提交,我们可以通过设置选项来指定手动提交,通过命令:git merge --no-commit <commit>...
模式可以指定合并先将结果放入暂存区,让用户手动对合并结果进行检查、更改,然后手动提交
合并操作并非总会成功,下面将详细介绍
合并一:自动合并
这一类合并不会报错,不需要用户来处理相应的错误,主要分为三种
修改不同的文件
如果两个(或者多个,这里只介绍两个)用户user1/user2各自的本地提交中修改的是不同的文件,那么第二次进行合并推送的提交将能正确合并并提交,不会遇到任何麻烦
修改相同文件的不同区域
首先需要说明的是,文件的修改是分区域的,可以具体到修改哪一行,通过命令cat > fileName.suffix
进行逐行修改
当user1用户修改了index.txt文件的第一行第二行并进行提交与上游推送,然后user2用户同样修改了index.txt文件,不过修改的是第三行和第四行,然后在进行git pull
命令,同样能正常合并,不会遇到任何麻烦
同时更改文件名和文件内容
如果user1用户将index.txt文件移动到了index2.txt文件并删除index.txt(重命名的操作),并且进行了提交与上游推送,此时user2用户使用命令git pull
获取并合并信息之后,会发现它同样也能正常合并,然后我们进行推送:git push origin master
然后成功推送,接着我们查看一下远程仓库的内容,会发现git对这种情况的处理方式是:user2用户最终修改的是user1用户对应重命名后的文件
这种情况下的自动合并其实是有逻辑冲突的,就C语言编程我们来举一个例子:我们在main.c文件中调用了一个头文件head.h文件,然后另一个用户将该文件该名成head2.h文件,最终我们使用main.c文件将会编译错误:找不到head.h头文件。所以在这种情况下,我们要慎重合并,或者在本次提交操作上添加一些重要的注释
合并二:冲突解决
当两个用户同时修改同一个文件的相同区域的内容时,就会发生冲突事件了。看如下例子:
首先为了保证两个用户的本地版本库和远程版本库一直,分别进行命令:git pull
然后先将user1用户修改文件hello.txt成如下内容并进行提交: