我是使用一台电脑测试, 然后在本地电脑创建了两个工作目录。专门用来模拟两个人提交代码。假设a、b两个人。只使用一个master分支做测试, 没有建立其他的分支。 主要就是为了研究冲突的解决方式。感觉git pull总是强制覆盖。
- a修改了代码并且提交master分支。
1) 测试一: 远程master分支已改变,然后b现在也修改了代码。不过b还没有提交,直接git pull ,不能拉取代码。报错提示:
error: Your local changes to the following files would be overwritten by merge: readme.txt Please commit your changes or stash them before you merge.
2) 先测试 b 选择commit的情况:b 修改代码后,commit 提交了代码。然后git pull,此时提示信息:
Auto-merging readme.txt CONFLICT (content): Merge conflict in readme.txt Automatic merge failed; fix conflicts and then commit the result.
3)现在来使用 git diff查看有哪些冲突:(截图在PHP文档里)
$ git diff diff --cc readme.txt index dc06fcb,e552df5..0000000 --- a/readme.txt //修改前文件 +++ b/readme.txt //修改后文件 @@@ -1,5 -1,5 +1,9 @@@ // <?php - +echo 111; echo 222; ++<<<<<<< HEAD //<<<<<<<head 是指你本地的分支的 +echo <D5><E2><CA><C7><D0>??<C4>?<D0>У<BB> ++======= + echo <D5><E2><CA><C7><D0>????<FE><D0>У<BB> //git pull 拉下来的内容 ++>>>>>>> 3776c60466b1e18c76018940d4a57d68b7d94353 ?>
4)git merge :会报错并提示:
error: Merging is not possible because you have unmerged files. hint: Fix them up in the work tree, and then use 'git add/rm <file>' //work tree 就是工作目录的那个要合并的文件, hint: as appropriate to mark resolution and make a commit. //需要你去文件里修改冲突。此时打开b修改的文件 fatal: Exiting because of an unresolved conflict. //就会看到哪里有冲突
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) You have unmerged paths. (fix conflicts and run "git commit") (use "git merge --abort" to abort the merge) Unmerged paths: (use "git add <file>..." to mark resolution) both modified: readme.txt no changes added to commit (use "git add" and/or "git commit -a") 对以上翻译: 你的分支和“起源/主人”有分歧, 分别有1个和1个不同的提交。 (使用“git pull”将远程分支合并到您的分支中) 您有未合并 的路径。 (修复冲突并运行“git commit”) (使用“git merge--abort”中止合并) 未合并的路径: (使用“git add<file>…” 标记分辨率) 两者都已修改:readme.txt 没有添加要提交的更改(请使用“git add”和/或“git commit-a”)。
6)git merge --abort 终止合并
7)当解决了冲突之后,直接使用git push 是不行的, 需要git add 然后 git commit的,在git push 就能提交到远程仓库了。建议不要使用git commit -a。
- 新的问题: a修改文件提交远程,此时b也修改了文件,解决冲突后也提交到远程, 这个时候 a 拉取远程代码,就会直接覆盖。不会提示你需要解决冲突啊什么的。(我的理解,这已经是一个新的版本了,如果本地的已经提交过,那线上的版本变动,本地拉取的时候也不会有冲突。)
- 测试二: a修改了文件,并且提交到远程,b也修改文件,并且已经commit。此时冲突的解决:和先pull再commit,感觉一样。都是解决冲突,然后add、commit。
- 测试:如果我只删除掉<<<<head ==== >>>>dfsegd3243(冲突的我不删除会怎么样?)不管你怎么修改的,反正只要你修改了冲突(哪怕只是删除了上面的提示,别的没动),然后add 、 commit,git就会认为你解决了冲突。git不管你怎么改的。
- 如果a修改了第5行,提交,而b修改了第7行,此时如果b直接提交 ,会不会有冲突?如果b拉取代码,会不会直接覆盖?(感觉会直接覆盖掉b的文件里之前第5行内容,那第7行的会不会受到影响,会不会也被覆盖?)
会abort, 提示b 需要先commit 或者 stash。会显示有冲突,但是b commit之后,弹出一个提示框(里面只有注释,没有冲突内容,我想应该是因为本地分支修改的地方和远程分支修改的不是同一行,远程修改的那一行会直接覆盖本地的同一行) - 又想到一个问题: 本地拉取线上一个分支,然后修改了一直没提交,而线上经历了好几个版本了。这个会有冲突(对的吧)本地拉取线上分支,修改之后提交了,线上更新了好几个版本,本地在拉取,就会直接拉取没冲突。
- git diff 是查看工作区和暂存区的快照相比较有哪些修改的地方。(因为commit提交的是add的内容如果说你修改了,但是没有add到暂存区,commit是不会提交的,所以和暂存区比较是有意义的)
- git diff --cached 和 git diff --staged 查看暂存区和本地版本库之间的差异。就是这一次修改后add到暂存区,和上一次提交的进行比较。
- git diff head 工作区和本地版本库进行比较。
- git diff test.c 用来查看工作区和暂存区中test.c文件的区别。
- git diff HEAD -- test.c 用来查看工作区和本地版本库中test.c文件的区别。
https://cloud.tencent.com/developer/ask/77395
12. https://www.cnblogs.com/lsgxeva/p/8540485.html 看最后面的和下一篇文章
13. 如果发生这种情况怎么办? a 修改了1.0版本的第5行, b 向在1.0版本基础上改第7行, 但是a 已经先提交了。b提交之前好像必须得拉取最新的代码吧?!那b不要a的改动,怎么办?