【Git版本控制】爲何要先commit,而後pull,最後再push?而不是commit而後直接push?

狀況是這樣的,如今遠程有一個倉庫,分支就一個,是master。而後我本地的倉庫是從遠程的master上clone下來的。你們都是clone下來,再在本身本地改好,再commit而後pull而後push,你們都是這麼作的。那麼如今問題來了:git

1,那我本地這個也算是個分支?仍是就是一個本地倉庫?code

答:本地和遠程的關係至關於兩個分支,你感受同樣是由於你git pull 的時候已經自動給綁定好對應關係了, set-upstream..balbala開發

2,若是我在遠程新建了個分支,而後我pull了下來,那我本地到底有分支這個說法嗎?我本地的分支是否是就是那個遠程新建的分支?it

答:你遠程新建了一個分支拉到本地的道理是同樣的,屬於複製了一份,可是本地分支和遠程分支已是兩個東西了ast

3,本地倉庫和本地分支有什麼區別?stream

答:本地分支屬於本地倉庫裏,是包含關係,一個倉庫裏能夠有不少分支推送

4,commit是提交到本地倉庫,而後push,這個push是把全部代碼推到遠程倉庫,仍是隻是把commit的地方推到遠程倉庫?文件

答:確定不會全量推送到遠程的,是經過對比 commit 的記錄,若是本地高於遠程就直接把多出來的commit 給懟上去,若是本地分支的最新版本和遠程的 commit 有衝突,就須要解決衝突。co

5,那爲何要先commit,而後pull,而後再push,我pull了,豈不是把本身改的代碼都給覆蓋掉了嘛,由於遠程沒有我改的代碼,我pull,豈不是覆蓋了我本地的改動好的地方了?那我還怎麼push?遠程

答:這個先 commit 再 pull 最後再push 的狀況就是爲了應對多人合併開發的狀況,

  1. commit 是爲了告訴 git 我此次提交改了哪些東西,否則你只是改了可是 git 不知道你改了,也就無從判斷比較;

  2. pull是爲了本地 commit 和遠程commit 的對比記錄,git 是按照文件的行數操做進行對比的,若是同時操做了某文件的同一行那麼就會產生衝突,git 也會把這個衝突給標記出來,這個時候就須要先把和你衝突的那我的拉過來問問保留誰的代碼,而後在 git add && git commit && git pull 這三連,再次 pull 一次是爲了防止再大家協商的時候另外一我的給又提交了一版東西,若是真發生了那流程重複一遍,一般沒有衝突的時候就直接給你合併了,不會把你的代碼給覆蓋掉

  3. 出現代碼覆蓋或者丟失的狀況:好比A B兩人的代碼pull 時候的版本都是1,A在本地提交了2,3而且推送到遠程了,B 進行修改的時候沒有commit 操做,他先本身寫了東西,而後 git pull 這個時候 B 本地版本已經到3了,B 在本地版本3的時候改了 A 寫過的代碼,再進行了git commit && git push 那麼在遠程版本中就是4,並且 A 的代碼被覆蓋了,因此說全部人都要先 commit 再 pull,否則真的會覆蓋代碼的

6,兩個分支A和B,A合併B和B合併A,有區別嗎?

答:兩個互相合並的惟一區別就是 A->B 的時候 B 分支上會產生一個 merge_commit ,被改變的分支是 B ;若是如今沒有發生任何改動執行 B->A ,則A和B兩分支纔會徹底相同。

相關文章
相關標籤/搜索