1. 程式人生 > >git pull和git pull -- rebase

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