實在想不明白,網路上也沒有講這個的明確說法。
情況是這樣的,現在遠端有一個倉庫,分支就一個,是master。然後我本地的倉庫是從遠端的master上clone下來的。大家都是clone下來,再在自己本地改好,再commit然後pull然後push,大家都是這麼做的。那麼現在問題來了:
1,那我本地這個也算是分支?還是就是一個本地倉庫?
2,如果我在遠端新建了個分支,然後我pull了下來,那我本地到底有分支這個說法嗎?我本地的分支是不是就是那個遠端新建的分支?
3,本地倉庫和本地分公司有什麼差別?
4,commit是提交到本地倉庫,然後push,這個push是把所有程式碼推到遠端倉庫,還是只是把commit的地方推到遠端倉庫?
5,那為什麼要先commit,然後pull,然後再push,我pull了,豈不是把自己改的程式碼都給覆蓋掉了嘛,因為遠端沒有我改的程式碼,我pull,豈不是覆蓋了我本地的改動好的地方了?那我還怎麼push?
6,兩個分支,A和B,A合併B和B合併A,有差別嗎?
見解
1.本地算一個clone體。
2.是得,如果遠端有一個分支 dev,那麼pull origin dev,本地就會有一個dev分支。
3.倉庫是整個項目,分支算其中一個生產線。就跟阿里巴巴集團不是只有一個淘寶一樣
4.push會進行分析,當然不是所有,你可以自己測試,弄一些大文件,第一次新建項目的push會很慢,如果你加一個幾k的文本,那這次傳輸很快
5.commit是防止遠端直接覆蓋你本地,只要有修改都會讓你commit,提示你pull原因是因為你遠程當中有最新的東西和你本地不一致,git知道,遠程分支的東西不能丟掉,所以讓你pull下來存到本地,讓本地變成最新的最後push上去,難麼同理的方式你本地就是最新,便會去修改遠程的。
回答完畢,麼麼噠
兩種都可以,只不過大部分人選擇先
pull
,因为你没提交你的代码,别人提交了,这时候git
会自动merge
,而如果你提交了,有时候git
自动merge
会报冲突,选择先pull
就是图一个方便和省事,当然也有人选择先push
在pull
,這樣可以了解其他夥伴對程式碼的改動通俗的說就例如原來
master
的代码快照是1,你的同伴改了提交了是2,你的提交代码是3,如果你先pull
,那么就是3和1merge
,而3包含1,git
选择最新代码3覆盖1,不存在冲突关系,而你先push
在pull
,那就是2和3merge
,这是git
自动merge
就會出錯,因為他不知道哪些需要哪些不需要merge問題
a和b合併 和 b和a合併 最後產生的代碼是一樣的,都是把兩個分支需要的代碼保留,集成一個大家都認可的代碼
唯一不同的可能merge過程有點不一樣,這個得視情況而定,不過大致上都差不多
本地和遠端的關係相當於兩個分支,你感覺一樣是因為你
git pull
的時候已經自動給綁定好對應關係了, set-upstream..balbala你遠端新建了一個分支拉到本地的道理是一樣的,屬於複製了一份,但是本地分支和遠端分支已經是兩個東西了
本地分支屬於本地倉庫裡,是包含關係,一個倉庫裡可以有很多分支, 如果是 tag 的話可以分離出獨立的倉庫
肯定不會全量推送到遠端的,是透過對比 commit 的記錄,如果本地高於遠端就直接把多出來的
commit
给怼上去,如果本地的这几个commit
和远程的commit
有冲突的部分就merge
,然後根據提交時間排序再新建一個merge 的 commit 記錄再懟上去這個先 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 進行修改的時候沒有
這個時候B 本地版本已經到3了,B 在本地版本3的時候改了A 寫過的代碼,再進行了commit
操作,他先自己写了东西,然后git pull
这个时候 B 本地版本已经到3了,B 在本地版本3的时候改了 A 写过的代码,再进行了git commit && git push
操作,他先自己寫了東西,然後git commit && git push
那麼在遠端版本中就是4,而且A 的程式碼被覆蓋了,所以說所有人都要先commit 再pull,不然真的會覆蓋代碼的