1. 程式人生 > >為什麼要先commit,然後pull,最後再push?而不是commit然後直接push?

為什麼要先commit,然後pull,最後再push?而不是commit然後直接push?

問題分析如下:

現在遠端有一個倉庫,分支就一個,是master。本地的倉庫是從遠端的master上clone下來的,再在自己本地改好,再commit → pull → push。

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

本地和遠端的關係相當於兩個分支,你感覺一樣是因為你git pull 的時候已經自動給繫結好對應關係了

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

你遠端新建了一個分支拉到本地的道理是一樣的,屬於複製了一份,但是本地分支和遠端分支已經是兩個東西了

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

本地分支屬於本地倉庫裡,是包含關係,一個倉庫裡可以有很多分支, 如果是 tag 的話可以分離出獨立的倉庫

4,commit是提交到本地倉庫,然後push,這個push是把所有程式碼推到遠端倉庫,還是隻是把commit的地方推到遠端倉庫?

肯定不會全量推送到遠端的,是通過對比 commit 的記錄,如果本地高於遠端就直接把多出來的commit 給懟上去,如果本地的這幾個 commit 和遠端的 commit 有衝突的部分就merge,然後根據提交時間排序再新建一個merge 的 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 是合併狀態而 A 未合併狀態,如果現在沒有發生任何改動執行 B->A 就直接切換過去了,連 merge_commit 都不會生成了