情況是這樣的,現在遠程有一個倉庫,分支就一個,是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 的情況就是為了應對多人合並開發的情況,
-
commit
是為了告訴 git 我這次提交改了哪些東西,不然你只是改了但是 git 不知道你改了,也就無從判斷比較; -
pull
是為了本地 commit 和遠程commit 的對比記錄,git 是按照文件的行數操作進行對比的,如果同時操作了某文件的同一行那么就會產生沖突,git 也會把這個沖突給標記出來,這個時候就需要先把和你沖突的那個人拉過來問問保留誰的代碼,然后在git add && git commit && git pull
這三連,再次 pull 一次是為了防止再你們協商的時候另一個人給又提交了一版東西,如果真發生了那流程重復一遍,通常沒有沖突的時候就直接給你合並了,不會把你的代碼給覆蓋掉 -
出現代碼覆蓋或者丟失的情況:比如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兩分支才會完全相同。