git裏面的rebase老是讓人以爲很難理解
特別是它的中文翻譯:變基
圖片來自廖雪峯
首先不認識rebase,先查查詞典好吧意思是:重定基準
因此這個翻譯仍是很是準確的。
若是仍是以爲很差理解,注意,前方高能。
按照下面的步驟,咱們換一個容易理解的詞:java
好了通過上面的步驟,咱們成功的將git
咱們的標題從git rebase 什麼是變基 變爲 git rebase 什麼是換爹。翻譯
咱們知道git中的commit也是有父子關係的。3d
因此到這裏相信你已經明白了:變基變基,就是某個commit-B不想要commit-A這個爹了。要換個別的commit-C作本身的爹。指針
說到這裏換爹都知道是幹啥的,那麼咱們爲何要換爹呢?何時要用到換爹呢?code
下面介紹一下須要換爹的場景:blog
這個過程沒有換爹,使用rebase 命令的目的是能夠經過這個操做修改commit message圖片
咱們想要把topic分支合併到master。
在topic分支 執行這兩個命令任意一個it
git rebase master git rebase master topic
能夠達到下圖的效果。
ast
這裏咱們發現,topic從master分支分出去以後的全部commit:A、B、C,做用在了master的最後一個commit G以後。
每當rebase操做分支的時候 老是有些難以理解。這裏咱們說其實rebase命令本質上一直都是換爹。
分支名咱們能夠認爲是執行相應分支最新commit的指針
分支名topic表明的是topic從master分出去以後的全部的commit
而分支名master表明的master分支上最新的commit。
爲了驗證以上的說法,能夠執行如下命令
git rebase commit_F_id topic
執行後獲得如下分支圖
咱們能夠再驗證一次,執行
git rebase commit_G_id commit_C_id
執行後獲得如下分支圖
咱們注意到該命令與 git rebase master topic 類似。可是注意此時master 和 topic分支的指針的位置。commit G後面的幾個commit是不在任何分支上的。屬於比較危險的行爲。
咱們能夠再驗證一次,執行
git rebase commit_G_id commit_A_id
執行後獲得如下分支圖
也是比較危險的行爲。
rebase是一個強大的命令。在以上常見的場景中的確是很方便。
其本質就是給某個commit 換一個父 commit
不建議在複雜的場景中使用!rebase有風險。
還有一條必須遵照:rebase 不能用來操做與他人協做的分支 好比topic是你本身的分支,git rebase master topic 沒有問題,可是git rebase topic master就會給你的同事帶來麻煩。