git pull和git pull -- rebase
在開始對比這兩條命令之前,請大家思考三個問題:
1 工作區不乾淨(沒有git add .)可以git pull或者git pull - -rebase程式碼嗎?
結果是不可以,如果你沒有將修改提交到暫存區,那麼無論是pull還是pull –rebase都是不可以拉下來程式碼的
接下來我們再多思考下:
2 如果工作區修改提交到暫存區但是沒有commit可以呼叫git pull和git pull - -rebase命令嗎?
綜上所述我們的結論是:
工作區不commit是無法pull程式碼的
接下來看push命令:
3 如果工作區修改沒有add可以呼叫git push命令嗎?
4 如果工作區修改沒有commit可以呼叫git push命令嗎?
綜上所述我們的結論是:
工作區不commit是無法push程式碼的
根據上面的結論我們知道必須commit才可以push和pull程式碼(也就是說必須有結點才可以pull/push程式碼)看圖我們來分析git pull和git pull - -rebase的區別:
1 遠端分支為dev分支,本地分支叫work,當我們從dev分支1拉取到本地的時候,兩個分支的起始狀態都是1
2 這個時候我們本地分支修改了3,而dev分支其他人推送了2,這個時候就出現了一個問題,我們該如何拉取程式碼呢?
思路:
1 假如dev分支沒有更改,本地分支上一個結點就是dev分支最新結點
那麼pull下來的程式碼最新的結點還是2結點,所以push上去的時候dev最新的結點是2結點
2 假如dev分支有了更改,本地分支上一個結點不再是dev分支最新結點
那麼本地分支會新產生一個結點(內部新commit了一個結點,就是我們經常看到的Merge branch**,這個時候本地分支的結點就是1-3-4,push上去的時候dev分支就是1-2-4),這個結點是2和3 merge之後的結果
rebase=re+base,我把他翻譯成“重新定義基點,簡稱重定基”,本地分支最新的結點本來是3,但是我使用git pull –rebase的時候把3修改先隱藏,讓本地分支的最新結點變成遠端的2結點,再在2結點的基礎上增加3結點,這樣push的時候dev分支就是3結點而不是merge結點了,這樣就可以讓我們的所有提交保持成一條線而不是很多merge
confilct處理:
無論是pull還是rebase,當同一個檔案被其他人改動之後就會出現衝突,rebase只能做到不出現merge結點但是和pull一樣遇到衝突需要自行解決
git pull遇到衝突
這個時候遇到的衝突比較常見,我們一般是手動修改衝突之後再add,commit,push沒有什麼好講的了
git pull –rebase遇到衝突
先進入衝突的檔案,解決之後使用 add 或者 rm<檔案>,之後直接 git rebase –continue即可(注意不用commit,使用add <檔名>而不是add .)
最後如何把讓我們使用git pull做git pull –rebase的操作呢?
配置
如果想要把 rebase 當做 git pull 的預設值,可以在 .git/config 加上
[branch “master”]
remote = origin
merge = refs/heads/master
rebase = true
也可以直接加到 ~/.gitconfig 讓所有的 tracked branches 都自動套用這個設定:
[branch]
autosetuprebase = always