这篇文章是,对于最近遇到的 Git 冲突问题 做的一个总结:
git push 冲突处理 :
- git push 时出现冲突 :
git push 时出现冲突 :
[rejected] master -> master (fetch first) error: failed to push some refs to 'git@github.com:pipilove/GitTest.git' hint: Updates were rejected because the remote contains work that you do not have locally. This is usually caused by another repository pushing to the same ref. You may want to first integrate the remote changes (e.g., 'git pull ...') before pushing again.
或者出错 :
Updates were rejected because the tip of your current branch is behind hint: its remote counterpart.
在 git push 后出现错误可能是因为其他人提交了代码,而使你的本地代码库版本不是最新。这时你需要先 git pull 代码后,检查是否有文件冲突并手动解决一下。没有文件冲突的话需要重新走一遍代码提交流程 add —> commit —> push。
- git push冲突使用git pull解决后的冲突文件 :
如某人A git clone 远程文件到本地,然后修改了 file1.txt 文件为: 1 pipi's computer;然后另一个人B同样 clone 项目后,修改了 file1.txt 文件为:1 jiajia's computer,并 push 到远程 github 仓库中。这样你 git push 时就会报冲突,因为远程比你多 commit 了一次,提前了。这时你必须先 git pull 一下。
From github.com:pipilove/GitTest 9d7c4a2..9d052ea master -> origin/master Auto-merging file1.txt CONFLICT (content): Merge conflict in file1.txt Automatic merge failed; fix conflicts and then commit the result.
这样远程的 file1.txt 会和你本地的修改会合并,冲突文件冲突的地方会有如下提示 :
1 <<<<<<< HEAD 2 pipi's computer 3 ======= 4 jiajia's computer 5 >>>>>>> 9d052eac234b0eafd79233cea62b6db06a2f6086 冲突标记<<<<<<< (7个<)与=======之间的内容是A的修改,=======与>>>>>>>之间的内容是B的修改。
此时,还没有任何其它垃圾文件产生。你需要把代码冲突处理好后重新走一遍代码提交流程就好了:git add .; git commit -m ''; git push。这样远程就是 A 修改的内容了 pipi's computer 了。如果没有冲突,则自动合并并完成。
- git push --force选项 :
如果远程主机的版本比本地版本更新,推送时 Git 会报错,要求先在本地做 git pull 合并差异,然后再推送到远程主机。这时,如果你一定要推送,可以使用 --force 选项。$ git push --force origin,命令使用 --force 选项,结果导致远程主机上更新的版本被覆盖。除非你很确定要这样做,否则应该尽量避免使用 --force 选项。
如上面的示例中 git push 出错,这时直接 :
$git push --force To git@github.com: /GitTest.git + cddb790...56e21f3 master -> master (forced update)
这样远程 github 上直接变成了:pipi's computer。
git pull冲突解决 :
不是每次 git pull 都会产生冲突文件。git2.0 以上的 git pull 规则好像是这样的:如果远程的文件比本地新(修改时间),则会与本地合并,生成 <=== 标记的冲突文件,需要 手动解决(pull 后直接输入命令 git mergetool);如果远程文件比本地旧,则本地文件并不会改变,仍和远程不一样,没有冲突文件。
- 在commit本地代码后,git pull远程代码产生冲突的解决 :
手动解决 git 冲突的可视化解决方案 :
对于 git push 冲突,要先 git pull,从而产生的冲突文件(合并后的),我们可以直接用 vi 或者其它文本编辑器打开再手动删除冲突,但是我们有更好的选择,如可以使用 git mergetool 可视化合并工具。
$git pull 后输入 $git mergetool 就会出现下面的可视化冲突解决工具 meld。Git高级教程:让git diff调用meld图形化差异比较工具;
- 在不commit本地代码的情况下,git pull远程代码,git pull文件时与本地文件冲突的解决 :
问题:甲修改了文件 A 并且 push 到了git server上,这时乙也在修改文件 A,他想看一下甲修改了什么,于是从 git server上 pull 下来,但是会遇到这样的提示:
error: Your local changes to the following files would be overwritten by merge: 文件A Please, commit your changes or stash them before you can merge.
这里乙可以 commit 本地文件修改再 pull ;
可是乙不想把他未完成的修改 commit,这个时候就可以先把文件 A 暂存起来,不 commit,再 pull 。Error pulling origin: error: Your local changes to the following files would be overwritten by merge
解决:
- git stash #先将本地修改存储起来;
- git pull #暂存了本地修改之后,就可以 pull 了;
- git stash pop #还原暂存的内容;
解决文件中冲突的的部分 :
同 git push 冲突,冲突的文件中 Updated upstream 和 ===== 之间的内容就是 pull 下来的内容,==== 和 stashed changes 之间的内容就是本地修改的内容。碰到这种情况,git 也不知道哪行内容是需要的,所以要自行确定需要的内容。
解决完成之后,就可以正常的提交了。或者也可以使用 git diff -w +文件名 来确认代码自动合并的情况。