戦えプログラマン

いつだって戦いなのだ

過去のコミットの中身を修正したい

「うわっ・・・私のコード、初歩的なミスしすぎ・・・?」
って思った時にでも。
仕方ない、人間だもの。

今回の手順は、
1, 直したソースをコミットしておく
2, rebaseでコミットの順番を入れ替え
3, rebaseの「fixup」でコミットを合成する
4, 強制push
こんな感じ。


1, 直したソースをコミットしておく
まぁこれはお好きなgitクライアントで。SourceTreeとか。

2, rebaseでコミットの順番を入れ替え

# あのころへ戻るんだ
$ git log -5 --oneline
4aae642 忸怩たる修正 Section 2   ←コレを
7876496 doing Section 3-6
4db9387 done Section 2         ←ココに合成したい
7016584 done Section 1
4555d25 1st commitだぜ

# なので、「fixup」(コミットを合成してくれるすごいやつ)のために、コミットログを入れ替える。
$ git rebase -i HEAD~5

# ddpで行入れ替え。やっぱvimerって変態だわ。
--------------------------------------
pick 4555d25 1st commitだぜ
pick 7016584 done Section 1
pick 4db9387 done Section 2
pick 7876496 doing Section 3-6
pick 5d345e1 忸怩たる修正 Section 2
(以下コマンドヘルプなので省略)

↓

pick 4555d25 1st commitだぜ
pick 7016584 done Section 1
pick 4db9387 done Section 2
pick 5d345e1 忸怩たる修正 Section 2
pick 7876496 doing Section 3-6
(以下略)
--------------------------------------

Successfully rebased and updated refs/heads/master.

# コミットログの順番が変わっていることを確認。
$ git log -5 --oneline
bcedab1 doing Section 3-6
6a83e20 忸怩たる修正 Section 2
4db9387 done Section 2
7016584 done Section 1
4555d25 1st commitだぜ

3, rebaseの「fixup」でコミットを合成する

$ git rebase -i HEAD~4

# 合成させたいコミットを「fixup」に
--------------------------------------
pick 7016584 done Section 1
pick 4db9387 done Section 2
pick 6a83e20 忸怩たる修正 Section 2
pick bcedab1 doing Section 3-6
(以下略)

↓

pick 7016584 done Section 1
pick 4db9387 done Section 2
f 6a83e20 忸怩たる修正 Section 2   # fixupの略
pick bcedab1 doing Section 3-6
(以下略)
--------------------------------------

...

Successfully rebased and updated refs/heads/master.

# 「fixup」にしたコミットが消えていることを確認。
$ git log -5 --oneline
0709772 doing Section 3-6
8d9e267 done Section 2
7016584 done Section 1
4555d25 1st commitだぜ
defb09e upgrade UTFlute to 0.5.0-sp9

4, 強制push

$ git push -f origin master

やったぜ。


用語メモ。
rebase時のコマンドヘルプより。

#  s, squash = use commit, but meld into previous commit<br>
#  f, fixup = like "squash", but discard this commit's log message<br>

fixup は squash の簡易版。
合成で消えるコミットのコメントも使いたいとかなら squash。
合成で消えるコミットは不要なら fixup。
こんな感じで使い分けかな。

まとめ。
チマチマこんなことするくらいなら、その時間でコード書いた方がいいと思った。 '`,、('∀`) '`,、