[Git] 2個以上前のプッシュしていないコミットを修正したくなった場合

rebaseしてsquashすればいい

% git log                                                                 [20:52:42]
commit afed1fc70e8c890d310505f71569a8c568ecf50a (HEAD -> master)
Author: author <author@example.com>
Date:   Wed Mar 6 20:52:42 2019 +0900

    modify first commit

commit 809ab76dcc79192a570fc169f1267ab09cf464f2
Author: author <author@example.com>
Date:   Wed Mar 6 20:52:15 2019 +0900

    third commit

commit bc9c9b4e7c967152b220c5aa211ea23894fd92b1
Author: author <author@example.com>
Date:   Wed Mar 6 20:52:03 2019 +0900

    second commit

commit 84895f112b31929f3c9fc2d19abf85c0dbf773f8
Author: author <author@example.com>
Date:   Wed Mar 6 20:51:52 2019 +0900

    first commit

上記のようなコミットログで、third commitまでしたところでfirst commitのタイポを見つけてmodify first commitでそれを修正したとする。このままだと、first commitに関するコミットが2箇所に別れることになりプルリクを確認する人がつらい。

まだpushしていないこと前提だが、以下の方法で修正できる。

まずgit rebase HEAD~4を実行。4の部分は対象とするコミットの範囲。今回は4個前のコミットを弄る必要があるので4

すると以下のような感じに表示される。

pick 84895f1 first commit
pick bc9c9b4 second commit
pick 809ab76 third commit
pick afed1fc modify first commit

modify first commitfirst commitの下の行に持ってきて、picksquashに変更。(ddで行切り取り、pで貼り付けできる)

pick 84895f1 first commit
squash afed1fc modify first commit
pick bc9c9b4 second commit
pick 809ab76 third commit

これで:wqすれば、次は以下のような画面になる。

# ~~~~~~~~
# ~~~~~~~~

first commit

# ~~~~~~~~

modify first commit

これは新しいコメントを入力する画面。コメント行以外の内容が新しいコメントとして登録される。

とりあえずmodify first commitはいらないので、modify first commitの行でdd

これで:wqすればfirst commitmodify first commitが統合される。