2019-3-6
[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 commitをfirst commitの下の行に持ってきて、pickをsquashに変更。(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 commitにmodify first commitが統合される。