git diff 以及解决代码冲突

git diff 格式解读-》http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.html

我是使用一台电脑测试, 然后在本地电脑创建了两个工作目录。专门用来模拟两个人提交代码。假设a、b两个人。只使用一个master分支做测试, 没有建立其他的分支。 主要就是为了研究冲突的解决方式。感觉git pull总是强制覆盖。 

  1. 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 @@@  //正常情况下,修改的代码前后都各显示出三行用来作为上下文,除非不够三行.(@@@表示的就是上下文) -1,5 `-`表示修改前的 `+`表示修改后的  `-1,5` 表示修改前从第一行开始 连续的5行 `+1,9`表示修改后的第一行连续的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。

  1.  新的问题: a修改文件提交远程,此时b也修改了文件,解决冲突后也提交到远程, 这个时候 a 拉取远程代码,就会直接覆盖。不会提示你需要解决冲突啊什么的。(我的理解,这已经是一个新的版本了,如果本地的已经提交过,那线上的版本变动,本地拉取的时候也不会有冲突。)
  2. 测试二: a修改了文件,并且提交到远程,b也修改文件,并且已经commit。此时冲突的解决:和先pull再commit,感觉一样。都是解决冲突,然后add、commit。
  3. 测试:如果我只删除掉<<<<head ==== >>>>dfsegd3243(冲突的我不删除会怎么样?)不管你怎么修改的,反正只要你修改了冲突(哪怕只是删除了上面的提示,别的没动),然后add 、 commit,git就会认为你解决了冲突。git不管你怎么改的。
  4. 如果a修改了第5行,提交,而b修改了第7行,此时如果b直接提交 ,会不会有冲突?如果b拉取代码,会不会直接覆盖?(感觉会直接覆盖掉b的文件里之前第5行内容,那第7行的会不会受到影响,会不会也被覆盖?)
    会abort, 提示b 需要先commit 或者 stash。会显示有冲突,但是b commit之后,弹出一个提示框(里面只有注释,没有冲突内容,我想应该是因为本地分支修改的地方和远程分支修改的不是同一行,远程修改的那一行会直接覆盖本地的同一行)
  5.  又想到一个问题: 本地拉取线上一个分支,然后修改了一直没提交,而线上经历了好几个版本了。这个会有冲突(对的吧)本地拉取线上分支,修改之后提交了,线上更新了好几个版本,本地在拉取,就会直接拉取没冲突。 
  6. git diff 是查看工作区和暂存区的快照相比较有哪些修改的地方。(因为commit提交的是add的内容如果说你修改了,但是没有add到暂存区,commit是不会提交的,所以和暂存区比较是有意义的)
  7. git diff --cached 和 git diff --staged 查看暂存区和本地版本库之间的差异。就是这一次修改后add到暂存区,和上一次提交的进行比较。
  8. git diff head 工作区和本地版本库进行比较。
  9. git diff test.c 用来查看工作区和暂存区中test.c文件的区别。
  10. 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的改动,怎么办?

原文地址:https://www.cnblogs.com/bneglect/p/11385975.html