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的改動,怎么辦?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM