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