git rebase 什麼是變基

git裏面的rebase老是讓人以爲很難理解
特別是它的中文翻譯:變基
圖片來自廖雪峯
變基哈哈哈 圖片來自廖雪峯
首先不認識rebase,先查查詞典好吧意思是:重定基準
因此這個翻譯仍是很是準確的。
若是仍是以爲很差理解,注意,前方高能
按照下面的步驟,咱們換一個容易理解的詞:java

  1. java裏面的基類咱們也能夠說是父類因此 表達式(基==父)爲true
  2. 變換變換 。變字和換字應該差很少。 咱們就認爲表達式 (變==換)爲true 。
  3. 等價代換一下 (變基==換父) 也爲 true。
  4. 換父? 不就是: 換爹 !!!!!!

好了通過上面的步驟,咱們成功的將git

咱們的標題從git rebase 什麼是變基 變爲 git rebase 什麼是換爹翻譯

咱們知道git中的commit也是有父子關係的。3d

因此到這裏相信你已經明白了:變基變基,就是某個commit-B不想要commit-A這個爹了。要換個別的commit-C作本身的爹。指針

說到這裏換爹都知道是幹啥的,那麼咱們爲何要換爹呢?何時要用到換爹呢?code

下面介紹一下須要換爹的場景:blog

合併多個commit

  1. 一個分支上依次有A - F ,一共6個commit。這個分支 每個commit 都是獨苗,也很頑強的這麼多代都沒有斷了香火。從commit_B到commit_E這麼多代人就幹了一件事兒就是蓋了個房子。史書上(log)以爲不用分紅這麼多commit,想要合併一下。合併連續commit
  2. commit_A在房子的門口種了一棵樹,到了commit_F的時候又在門口種了棵樹。史書以爲都是種樹,乾脆把commit_A和commit_F合併了吧。合併不是連續的commit

修改commit message(好久以前的commit message)

這個過程沒有換爹,使用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就會給你的同事帶來麻煩。

相關文章
相關標籤/搜索