git rebase 命令
git rebase是一個很是有用的命令,但可能熟悉它的人比較少。下面介紹一下git rebase的常見用法。git
咱們在做分支合併的時候最經常使用的就是merge操做,可是執行merge以後,會產生一個新的commit,例如:Merge branch 'branch-1'。這個commit把兩個branch合併到一塊兒並做了一次新的提交。可是,若是使用rebase的話就會避免這個問題。咱們來看一個例子,下邊是我分別用merge和rebase以後的git log。shell
* 5eaa8f8 (HEAD -> master) commit 8 * fdadab0 commit 7 * 690e761 (branch-2) commit 10 * f8bcb41 commit 9 * a1e3e91 Merge branch 'branch-1' |\ | * da2448e (branch-1) commit 6 | * c4ef94a commit 5 * | c70cc70 commit 4 * | 31fde3f commit 3 |/ * faf3890 commit 2 * 0f1f7a8 commit 1
個人操做歷史以下:首先,在master建立進行了兩次提交(commit 1, commit 2)-> checkout新的分支branch 1 -> 在master上進行兩次提交(commit 3, commit 4)-> 在branch 1上進行兩次提交(commit 5, commit 6)-> checkout到master,執行git merge branch-1。而後merge完成後便產生了a1e3e91 Merge branch 'branch-1'
這個提交。this
接着咱們演示rebase,checkout 新分支branch 2 -> 在master上進行兩次提交(commit 7,commit 8)-> checkout到branch 2上,進行兩次提交(commit 9, commit 10)-> checkout到master執行git rebase branch-2。這時咱們來看主幹分支,並無產生多餘的提交。rest
git rebase branch-2命令執行的時候會把"master"(即當前分支)分支裏的每一個提交(commit)取消掉,而且把它們臨時保存爲補丁patch(這些補丁放到".git/rebase"目錄中),而後把"master"分支更新到最新的"branch-2"分支,最後把保存的這些補丁應用到"master"分支上。這些新應用的commit將會是新的commit,commit號會變。上例中commit 7,commit 8的commit號已經變了(原有的commit號分別是:cc4df2d,c86a6da)。code
當咱們從遠程拉代碼的時候若是使用:git pull --rebase,則會以rebase的方式進行更新,而不是默認的merge。rem
git rebase用來修復commit,好比修改某次提交,修改commit message,squash。該命令能夠簡寫爲git rebase -i。執行該命令以前須要當前branch已經設定過upstream,使用git branch --set-upstream-to=<remote>/<branch>
能夠設定upstream。執行rebase -i命令後的交互以下,我已經針對commit作了修改:it
GNU nano 2.5.3 File: /home/focusj/3stone/diamond/.git/rebase-merge/git-rebase-todo pick c4a4b5d test squash c4a4b6d test drop c4a4b7d test # Rebase 0df8fd7..c4a4b5d onto 0df8fd7 (1 command(s)) # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # d, drop = remove commit # [ Read 20 lines ] ^G Get Help ^O Write Out ^W Where Is ^K Cut Text ^J Justify ^C Cur Pos ^Y Prev Page M-\ First Line M-W WhereIs Next ^X Exit ^R Read File ^\ Replace ^U Uncut Text ^T To Spell ^_ Go To Line ^V Next Page M-/ Last Line M-] To Bracket
下邊說下幾個command的用處:
p:保留當前commit,不作處理。
r:修改commit message。
e:修改這個commit做的修改。好比某個commit漏掉了什麼配置,想要再提交新的文件; 或者刪除一些無用代碼,等等均可以用這個命令。
s:保留這個commit的修改,可是把它合併到前一個commit中。
d:刪除commit。
咱們使用命令,只須要把命令放到mouge commit前邊保存退出既能生效。io
write on 2017-1-3ast