實在想不明白,網路上也沒有講這個的明確說法。
情況是這樣的,現在遠端有一個倉庫,分支就一個,是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,有差別嗎?
滿天的星座2017-05-25 15:10:32
1.本地算一個clone體。
2.是得,如果遠端有一個分支 dev,那麼pull origin dev,本地就會有一個dev分支。
3.倉庫是整個項目,分支算其中一個生產線。就跟阿里巴巴集團不是只有一個淘寶一樣
4.push會進行分析,當然不是所有,你可以自己測試,弄一些大文件,第一次新建項目的push會很慢,如果你加一個幾k的文本,那這次傳輸很快
5.commit是防止遠端直接覆蓋你本地,只要有修改都會讓你commit,提示你pull原因是因為你遠程當中有最新的東西和你本地不一致,git知道,遠程分支的東西不能丟掉,所以讓你pull下來存到本地,讓本地變成最新的最後push上去,難麼同理的方式你本地就是最新,便會去修改遠程的。
回答完畢,麼麼噠
ringa_lee2017-05-25 15:10:32
首先
pull
不会把你本地代码覆盖掉,而是提醒merge
冲突,需要你手动merge
一下;為什麼要
pull
?因为对你来说你本地可能有个分支,你在这个分支上面工作,那么也有可能存在其他人和你一样的做法,也许你们的代码有依赖又或是有冲突,你肯定不能在master
裡面測試,你要確保自己分支是最新程式碼;本地分支代碼不一定和本地倉庫是一致的,你把本地代碼提交了才會存到本地倉庫中,就相當於本地分支是你開發的一個平台,但是最後開發的產出存放地址是本地倉庫
兩種都可以,只不過大部分人選擇先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過程有點不一樣,這個得視情況而定,不過大致上都差不多
曾经蜡笔没有小新2017-05-25 15:10:32
本地和遠端的關係相當於兩個分支,你感覺一樣是因為你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 進行修改的時候沒有commit
操作,他先自己写了东西,然后 git pull
这个时候 B 本地版本已经到3了,B 在本地版本3的时候改了 A 写过的代码,再进行了git commit && git push
操作,他先自己寫了東西,然後
git commit && git push
那麼在遠端版本中就是4,而且A 的程式碼被覆蓋了,所以說所有人都要先commit 再pull,不然真的會覆蓋代碼的