概要としては、git rebase -iを使い、特定のコミットに戻した後、interactiveにコミットを操作する。
以下、手順。
1) 状態確認
git logで、状態を確認する。
$ git log --oneline 68af727 Write CCC →でも他のコミットをしてしまった 719560b Write BBB (Retry) →間違いに気づいてまたコミットした 92746af Write BBB →ここでコミットしちゃったんだけど 585c5d6 Write AAA 84041cf Created initial files.
「Write BBB」で誤って、「Write BBB (Retry)」で修正をして、コミットしたのを、「Write BBB」に統合する。(Retry)の時点でうっかりamendを忘れた感じ。
2) rebase -iで「Write AAA」の時点に戻す
git rebase -iをすると、指定したコミットから後の処理をeditorで指定してリプレイできる。
$ git rebase -i 585c5d6
エディタが開くので、(Retry)の「pick」の部分を「f」に変更する。
pick 585c5d6 Write AAA pick 92746af Write BBB「f」でなく、「s」にすると、コミットログを修正できる。pickf 719560b Write BBB (Retry) ←修正 pick 68af727 Write CCC # Rebase 84041cf..68af727 onto 84041cf # # 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 ←fはfixup # # If you remove a line here THAT COMMIT WILL BE LOST. # However, if you remove everything, the rebase will be aborted. #
保存してエディタを終了すると、修正される。
[detached HEAD a7fb63f] Write BBB 1 files changed, 1 insertions(+), 1 deletions(-) Successfully rebased and updated detached HEAD.
3) 確認
くっついている。
$ git log --oneline d519a6c Write CCC a7fb63f Write BBB 585c5d6 Write AAA 84041cf Created initial files.
git本当に難しい...