Git -- Rebase

solenovex發表於2018-03-22

git rebase: 這個命令可以把一個分支上commit的變化放到另一個分支上重新上演一遍.

簡單的Rebase例子.

首先準備好一個git專案.

做一個feature分支, 然後做幾個commits.

回到master分支, 再做幾個commits. 然後 rebase.

最後使之達到這個效果:

現在我想讓master分支rebase到my-feature分支上:

回到my-feature分支, rebase一下master上發生的變化:

在我想要rebase進去的分支上執行命令: git rebase 源分支名.

git rebase master

注意發生的變化, log裡面沒有分叉了.

再做一個變化,

然後commit.

現在在my-feature分支上的動作結束了, 該回到master分支了.

檢視之前在master分支修改的內容, 發現沒有了. 回到了最初沒修改時的狀態.

然後執行fast-forward merge即可:

最後刪除my-feature分支即可.

 

衝突.

做一些修改, 然後commit.

再建立一個分支 trouble, 然後切換到該分支.

做一些修改, 再commit.

然後再回到master分支, 然後再做一些衝突的修改.

切換到trouble分支.

然後用視覺化工具進行diff:

有兩處衝突.

然後嘗試rebase:

不出所料, 有衝突發生, 當前處於rebase暫停階段.

這時可以放棄rebase (abort):

git rebase --abort.

檢視log:

可以看到沒發生變化.

 

解決衝突:

再次嘗試rebase:

由於有衝突, 所以停留在了rebase的衝突階段.

然後使用視覺化merge工具:

解決好所有的衝突之後, 儲存. 

檢視狀態:

然後執行git rebase --continue.

檢視log:

 

然後再做一個修改, 還是修改同一個檔案. 然後commit.

當前領先master兩個commits.

然後整合變化到master.

又是一個fast forward merge.

檢視log:

沒有分叉了.

 

Rebasing 遠端分支(Github).

先執行git pull origin master, 然後 git push origin master.

然後修改某個檔案.

然後我再github上面修改該檔案(需要造成衝突), commit.

然後檢視狀態:

這裡顯示的是: 我當前的分支領先於origin/master 兩個commit.

這時就需要更新引用(把可以代表歷史的東西都帶下來), 需要使用 git fetch 這個命令.

git fetch origin master

現在所有的引用都已經更新了.

這時檢視狀態:

可以看到遠端和本地分支有分歧.

這次我想做的是, 想讓我本地的commits合併後放在遠端分支的前邊.

這時可以使用git pull, 但是需要加一個引數, 使得rebase可以發生:

git pull --rebase origin master.

git pull --rebase origin master

 

由於有衝突, 所以要進行merge,

 

merge結束後, 繼續rebase:

然後跳過這次commit:

git rebase --skip.

OK

 

相關文章