背景
在使用git提交代碼的時(shí)候,可能會(huì)出現(xiàn)message寫(xiě)錯(cuò)的情況,
如果此時(shí)commit已經(jīng)push到遠(yuǎn)程服務(wù)器了贰盗,
修改起來(lái)就比較麻煩了筒繁。
下面整理了一下噩凹,修改歷史中某幾次commit的message的通用辦法。
命令
以下修復(fù)方式中毡咏,總共涉及這些命令驮宴,
$ git log
$ git rebase -i HEAD~5
$ git commit --amend
$ git rebase --continue
$ git push -f
注:
在修復(fù)歷史commit message的時(shí)候,請(qǐng)確保當(dāng)前分支是最新代碼呕缭,
且已經(jīng)提交了所有本地修改堵泽。
步驟
1. 使用git log
命令查看歷史記錄
$ git log
如圖,提交記錄會(huì)按時(shí)間倒序展示恢总,
2. 使用git rebase -i HEAD~5
確定要修改哪些commit
$ git rebase -i HEAD~5
其中迎罗,HEAD~5
表示最近的5個(gè),后面的5
可以改成其他數(shù)字片仿。
本例中我們只顯示最近的5個(gè)佳谦。
我們看到上面顯示了5行,
pick 1d316b0 1
pick f429786 2
pick 880cfbc 3
pick c55cf56 4
pick d10fd07 5
左邊第一列表示命令(command)滋戳,中間一列表示commit id钻蔑,
最右邊一列是我們之前提交的message。
這里的展示順序奸鸯,是按事件順序排列的咪笑。
即,第一行是最早提交的信息娄涩。
假設(shè)我們需要修改第2條和第4條commit的message窗怒,
則需要將它們的命令(command),由pick
改為edit
蓄拣,
其它地方保持不變(此時(shí)還不用修改message)扬虚。
修改完成之后,保存修改球恤。
pick 1d316b0 1
edit f429786 2 <- 注意本行第一列的pick改為edit了
pick 880cfbc 3
edit c55cf56 4 <- 注意本行第一列的pick改為edit了
pick d10fd07 5
3. 輪流使用git commit --amend
和git rebase --continue
修改每個(gè)edit的commit
保存完了之后辜昵,git的分支就會(huì)發(fā)生改變,
從原來(lái)的master改成了我們第一個(gè)edit的commit id咽斧,
$ test-rebase git:(master) >
$ test-rebase git:(f429786) >
下面我們?cè)谶@個(gè)commit id所示的分支上堪置,執(zhí)行躬存,
$ git commit --amend
此時(shí)就可以修改message了,我們可以改成2a
舀锨,
2a
# Please enter the commit message for your changes. Lines starting
...
對(duì)修改進(jìn)行保存岭洲,然后執(zhí)行,
$ git rebase --continue
現(xiàn)在分支號(hào)又發(fā)生了改變坎匿,表示我們要對(duì)第二個(gè)標(biāo)記為edit的commit進(jìn)行修改盾剩,
值得注意的是,這里的分支號(hào)和需要edit的commit id并不相同替蔬。
$ test-rebase git:(be83ef5) >
接著再重復(fù)上面的操作彪腔,
先用git commit --amend
修改message,然后保存进栽,
再執(zhí)行德挣,git rebase --continue
。
我們標(biāo)記了幾個(gè)edit快毛,這個(gè)過(guò)程就需要重復(fù)執(zhí)行幾次格嗅。
全部修改完成后,會(huì)提示唠帝,
> Successfully rebased and updated refs/heads/master.
4. 使用git push -f
強(qiáng)制更新遠(yuǎn)程服務(wù)器
$ git push -f
切記一定要加-f
屯掖,否則我們edit的commit會(huì)添加到commit后面,
而不是更新原commit襟衰。
更新完之后贴铜,我們來(lái)看看git log
。
第2條和第4條commit message已經(jīng)被我們成功修改了瀑晒。