用 git 用着用着手殘了?沒事,還好 git 給咱們機會從新來過,這裏記錄了一些修改 git 的歷史提交記錄的方式,今後不再怕手殘~html
git amend
若是僅僅是在提交以後發現本身手殘了,用git commit --amend
就能夠修改剛纔的那一次提交。該命令在執行之後,會將剛剛的那一次提交從當前分支移除,把工做空間恢復到上次準備提交的狀態(同時混合了上次提交以後的更改),而後顯示出一個 vim 的界面讓你去修改上次的提交信息。在vim 中保存後,就會把當前的全部修改一併用新的提交信息提交了。git
該命令僅僅能夠修改最後一次提交,一個命令至關於執行了以下一系列動做:vim
$ORIG_HEAD=`git show`#保存當前的此次提交的 commit 號 $git reset --soft HEAD^#回到最後一次提交準備提交前的狀態 $...#作一些操做和修改 $git commit -c $ORIG_HEAD#表示用最後一次提交的提交信息來作爲提交信息,不過會調出編輯器界面
git rebase
前面的git commit --amend
僅僅能夠修改最後一次提交,可是當本身一時興起,手殘了一路時,這個命令就沒法拯救咱們了,這個時候咱們就要祭出git rebase -i
這個大殺器來幫咱們修改那些不堪回首的往事。編輯器
實際上,git rebase -i
並非一個專門用來修改歷史記錄的命令,而是一個讓咱們能夠交互式(就是一個個來) 進行衍合操做的命令,不過咱們能夠用這個命令來實現對於提交歷史的修改。spa
該命令的使用方法是git rebase -i <指定提交號>
,好比能夠用git rebase -i HEAD~3
來修改本次提交、上次提交、上上次提交共三次提交。指針
如圖,我若是向修改這三次提交,輸入git rebase -i HEAD~3
,就會出現以下的界面:code
這是一個 vim 編輯器的界面,這裏是讓咱們編輯這一段腳本,可使用的命令有下方註釋中的六個命令。當退出當前編輯其的頁面後,git 就會根據這個腳本一個個的針對提交執行對應的操做(從最先的那次提交開始執行)。htm
若是僅僅是想修改提交信息,就把全部的 pick 改爲 r ,而後:wq
保存,接下來 git 就會讓你一個個的從最先的提交信息開始修改。blog
剩餘的命令中, e 是會在修改對應提交時跳出 vim 編輯器,此時 HEAD 指針指向此次提交,此時能夠用git commit --amend
對此次提交進行各類修改,而後執行 git rebase --continue
就會繼續下一次操做;s 則是會在修改對應提交的時候把此次的提交和其父提交合併爲一次提交;f 是和s相似可是會忽略當前提交的信息,直接採用父提交的信息;x 是須要在 x 以後輸入命令而後在 HEAD 指向此次提交的時候執行。利用這些命令還能夠完成重排提交、拆分提交的動做。ip
git filter-branch
假如說咱們提交了 N 屢次之後,忽然發現咱們這些提交的郵箱都寫錯了(╯°□°)╯︵ ┻━┻,這個時候若是使用以前提到的命令,估計還沒改完就要累死了。這個時候咱們就可使用git filter-branch
來重寫分支,其能夠批量的對每一個提交執行咱們預設的操做。
git filter-branch
命令使用的基本使用格式是git filter-branch --<各類filer> '命令' <修改的範圍>
,不一樣的 filter 會提供給命令不一樣的輸入和輸出。好比,--msg-filter
表示修改提交信息,原提交信息從標準輸入讀入,新提交信息輸出到標準輸出;--tree-filter
表示修改文件列表等等。最後會有一個重寫的範圍。好比,git filter-branch --env-filter 'GIT_AUTHOR_EMAIL=john@example.com export GIT_AUTHOR_EMAIL' HEAD
就能夠用來重寫郵箱。建議在調用命令以前先啦出一個分支作嘗試再在本身要修改的分支上執行操做。