【Git版本控制】為什么要先commit,然后pull,最后再push?而不是commit然后直接push?


情況是這樣的,現在遠程有一個倉庫,分支就一個,是master。然后我本地的倉庫是從遠程的master上clone下來的。大家都是clone下來,再在自己本地改好,再commit然后pull然后push,大家都是這么做的。那么現在問題來了:

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

答:本地和遠程的關系相當於兩個分支,你感覺一樣是因為你git pull 的時候已經自動給綁定好對應關系了, set-upstream..balbala

2,如果我在遠程新建了個分支,然后我pull了下來,那我本地到底有分支這個說法嗎?我本地的分支是不是就是那個遠程新建的分支?

答:你遠程新建了一個分支拉到本地的道理是一樣的,屬於復制了一份,但是本地分支和遠程分支已經是兩個東西了

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

答:本地分支屬於本地倉庫里,是包含關系,一個倉庫里可以有很多分支

4,commit是提交到本地倉庫,然后push,這個push是把所有代碼推到遠程倉庫,還是只是把commit的地方推到遠程倉庫?

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

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兩分支才會完全相同。


免責聲明!

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



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