如果拉取时,遇到冲突怎么处理?
如前所诉,git pull
相当于 git fetch
跟着一个 git merge
。所以拉取遇到冲突的处理,和合并冲突处理是一样的。
拉取实际上可以看做是把远程分支集成到本地当前分支,类似分支之间的集成,除了合并还可以使用rebase。拉取时使用rebase,可使用命令:git pull --rebase
或git pull -r
。如果遇到冲突,与前面章节介绍过的rebase冲突一样处理。
正如在rebase一节中详细介绍的,保持一个干净的线性历史记录是有好处的,每次使用git pull
时推荐使用git pull -r
。
总之,拉取时遇到冲突,与merge/rebase时的处理是一样的。
例子
引入冲突
引入冲突步骤:
- 修改远程仓库(github)上,master分支下的
test1.txt
文件中第一行文字,提交。 - 修改本地仓库上,master分支下的
test1.txt
文件中第一行文字,内容与远程仓库的修改不同,提交,不推送。 - 执行
git fetch
,以便可以使用git status
查看冲突之处。
$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
nothing to commit, working tree clean
可以看到,本地master
分支与远程origin/master
分支分叉了。
拉取并解决冲突
这里我们尝试使用git pull -r
,使用rebase来集成远程分支。
Kevin@qikegu MINGW64 /g/project/git-demo (master)
$ git pull -r
First, rewinding head to replay your work on top of it...
Applying: add 'abcde' to test1.txt
Applying: add 'fghij' to test1.txt
Applying: add test2.txt
Applying: change 1st line of test1.txt: 'file type is txt'
Using index info to reconstruct a base tree...
M test1.txt
Falling back to patching base and 3-way merge...
Auto-merging test1.txt
CONFLICT (content): Merge conflict in test1.txt
error: Failed to merge in the changes.
hint: Use 'git am --show-current-patch' to see the failed patch
Patch failed at 0004 change 1st line of test1.txt: 'file type is txt'
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
提示test1.txt
有冲突,需要手动解决冲突。编辑test1.txt
文件,确定要保留的内容,删除git添加的特殊内容,保存文件。
然后把文件添加到暂存区,然后继续rebase,执行命令git rebase --continue
:
Kevin@qikegu MINGW64 /g/project/git-demo (master|REBASE 4/7)
$ git add test1.txt
Kevin@qikegu MINGW64 /g/project/git-demo (master|REBASE 4/7)
$ git rebase --continue
Applying: change 1st line of test1.txt: 'file type is txt'
Applying: change 1st line of test1.txt: 'file name is test1.txt'
Using index info to reconstruct a base tree...
M test1.txt
Falling back to patching base and 3-way merge...
Auto-merging test1.txt
Applying: add 'klmno' to test1.txt
Applying: modified: test1.txt
Using index info to reconstruct a base tree...
M test1.txt
Falling back to patching base and 3-way merge...
Auto-merging test1.txt