git rebase 命令
git rebase是一個(gè)非常有用的命令,但可能熟悉它的人比較少。下面介紹一下git rebase的常見用法像棘。
git rebase branch
我們?cè)谧鞣种Ш喜⒌臅r(shí)候最常用的就是merge操作,但是執(zhí)行merge之后壶冒,會(huì)產(chǎn)生一個(gè)新的commit缕题,例如:Merge branch 'branch-1'。這個(gè)commit把兩個(gè)branch合并到一起并作了一次新的提交胖腾。但是烟零,如果使用rebase的話就會(huì)避免這個(gè)問(wèn)題。我們來(lái)看一個(gè)例子咸作,下邊是我分別用merge和rebase之后的git log锨阿。
* 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創(chuàng)建進(jìn)行了兩次提交(commit 1记罚, commit 2)-> checkout新的分支branch 1 -> 在master上進(jìn)行兩次提交(commit 3墅诡, commit 4)-> 在branch 1上進(jìn)行兩次提交(commit 5, commit 6)-> checkout到master桐智,執(zhí)行g(shù)it merge branch-1书斜。然后merge完成后便產(chǎn)生了a1e3e91 Merge branch 'branch-1'
這個(gè)提交。
接著我們演示rebase酵使,checkout 新分支branch 2 -> 在master上進(jìn)行兩次提交(commit 7荐吉,commit 8)-> checkout到branch 2上,進(jìn)行兩次提交(commit 9, commit 10)-> checkout到master執(zhí)行g(shù)it rebase branch-2口渔。這時(shí)我們來(lái)看主干分支样屠,并沒(méi)有產(chǎn)生多余的提交。
git rebase branch-2命令執(zhí)行的時(shí)候會(huì)把"master"(即當(dāng)前分支)分支里的每個(gè)提交(commit)取消掉缺脉,并且把它們臨時(shí)保存為補(bǔ)丁patch(這些補(bǔ)丁放到".git/rebase"目錄中)痪欲,然后把"master"分支更新到最新的"branch-2"分支,最后把保存的這些補(bǔ)丁應(yīng)用到"master"分支上攻礼。這些新應(yīng)用的commit將會(huì)是新的commit业踢,commit號(hào)會(huì)變。上例中commit 7礁扮,commit 8的commit號(hào)已經(jīng)變了(原有的commit號(hào)分別是:cc4df2d知举,c86a6da)瞬沦。
git pull --rebase
當(dāng)我們從遠(yuǎn)程拉代碼的時(shí)候如果使用:git pull --rebase,則會(huì)以rebase的方式進(jìn)行更新雇锡,而不是默認(rèn)的merge逛钻。
git rebase --interactive
git rebase用來(lái)修復(fù)commit,比如修改某次提交锰提,修改commit message曙痘,squash。該命令可以簡(jiǎn)寫為git rebase -i立肘。執(zhí)行該命令之前需要當(dāng)前branch已經(jīng)設(shè)定過(guò)upstream边坤,使用git branch --set-upstream-to=<remote>/<branch>
可以設(shè)定upstream。執(zhí)行rebase -i命令后的交互如下谅年,我已經(jīng)針對(duì)commit做了修改:
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
下邊說(shuō)下幾個(gè)command的用處:
p:保留當(dāng)前commit茧痒,不做處理。
r:修改commit message踢故。
e:修改這個(gè)commit作的修改文黎。比如某個(gè)commit漏掉了什么配置惹苗,想要再提交新的文件; 或者刪除一些無(wú)用代碼殿较,等等都可以用這個(gè)命令。
s:保留這個(gè)commit的修改桩蓉,但是把它合并到前一個(gè)commit中淋纲。
d:刪除commit。
我們使用命令院究,只需要把命令放到mouge commit前邊保存退出既能生效洽瞬。
write on 2017-1-3