學習 Git Rebase

有問題爲何不問問神奇的 man 呢?git

rebase 也算是我比較經常使用的一個指令了,可是很長時間以來,對這個指令的認識仍是不夠深入,因而就找了個時間認真地讀了一下 git rebase 的文檔。這份文檔不須要在網絡上查找,在本身的電腦上直接使用 man git-rebase 就能夠查看了。在這份文檔中,被提到的最重要的幾個 rebase 參數就是 newbaseupstreambranch。除此以外,-i 也是一個可以極大的提高使用體驗的選項,容許咱們交互式的選取須要操做的提交。網絡

git rebase [-i | --interactive] [<options>] [--exec <cmd>] [--onto <newbase>]
        [<upstream> [<branch>]]

三個參數

在執行 git rebase 的以前,若是咱們指定了 branch 這個參數,那麼 git 會在開始 rebase 操做以前簽出到 branchcode

接着,git 會把全部在當前分支但不在 upstream 分支的提交保存到一個臨時區域。若是想要在 rebase 開始以前瞭解哪些提交會被移到臨時區域,可使用 git log <upstream>..<branch> 查看。文檔

而後,若是咱們設置了 newbase,那麼 git 會把當前分支重置到 newbase ,不然,就重置到 upstream ,這裏的效果就至關於 git reset <newbase>cmd

接下來,git 會將以前存放到臨時區域內的提交逐個按順序地從新做用到當前分支上。hash

根據上面介紹的執行過程,咱們能夠總結出如下幾個知識點:it

  1. branch 分支或者執行 git rebase 的當前分支,最終會被移動到 upstream 或者 newbase 分支上io

  2. branch 與 upstream 構成了一個選擇器,能夠經過這兩個參數來把 branch..upstream 之間的提交移動跟隨 branch 移動到新的地方ast

這樣看來,rebase 作的事實際上是使用 upstream 以及 branch 選取一段提交,而後在把這段提交從原先的分支上剪下來,而後嫁接到 upstream 或者 newbase 上去。stream

接着結合一個簡單的例子來熟悉一下 rebase 中這三個參數的做用,例如,咱們有這樣一個倉庫:

A---B<start>---C---D<feature><HEAD>
 /
E---F---G<master>

咱們目前位於 feature 分支,如今咱們須要使用 rebase 將 feature 分支上的 C、D 兩個提交移植到 master 上面。由於最終的目的地是 master 分支,因此能夠肯定 newbase 參數的值是 master;爲了選中 C、D 兩個提交,咱們可使用 feature 分支做爲 branch 參數,使用 start 分支做爲 upstream 參數。最終,咱們須要執行的指令就是:

git rebase --onto master start feature

由於,咱們目前就在 feature 上面,因此 branch 參數能夠省略掉:

git rebase --onto master start

最終咱們獲得的結果以下所示:

C'---D'<feature><HEAD>
         /
E---F---G
 \
  A---B<start>

交互式操做後可能會遇到的問題

在交互式 rebase 中,咱們能夠選取須要操做的提交,但這種可選擇的操做有時候可能會給 git 新手形成一種使人慌亂的局面。例如,咱們有這樣一個倉庫:

A---B---C---D<feature><HEAD>
 /
D---E---F<master>

而後,咱們執行下面的命令:

git rebase -i master

假設只有 B、C 被選取了,那麼這個倉庫接下來就會變成:

B'---C'<feature>
         /
D---E---F<master>

如今,你可能已經發現了一個問題,A 與 D 這兩個提交「消失」了,這時候先不要慌,能夠先想一想辦法研究出時光機器回到過去阻止本身。固然,這只是一個玩笑。這兩個提交併無真正的消失,他們只是沒有被某個分支引用而已。要讓它們從新回到分支樹上,咱們須要先查詢這兩個提交的 hash :

git reflog feature

reflog 能夠幫助咱們查看指定分支的操做歷史,包括 commit、rebase 等操做。

查詢到 hash 以後,只要在這些被歷史遺忘的 commit 上建立新的分支,咱們就能夠在 git log 中從新見到他們了。

相關文章
相關標籤/搜索