https://qiita.com/inukai-masanori/items/82eb0626fd75f3eb0922

私は最近エンジニアに復帰し、現場で便利に思ったことを今後記事にできたらと思っています。 そして1発目は、gitのオプションについて記事を書いてみようと思います。

--fixup はどんな時に使えるの?

Pull Requestなどで、軽微な指摘や後から気付いた修正など、本来の機能のコミットとは別に修正コミットを残すのは少し嫌な時がありますよね。 コミットが一つ手前であれば、直前のコミットを修正してくれる git commit --amendなどで対応できますが、3つ前のコミットに修正を混ぜ込みたい時などは、少し大変。 そんな時に便利なのが、この git commit --fixupです。

例えば、下記のコミットの状況で、Fix article pageのコミットに対して、追加の修正をしたいとする。

❯ git log --oneline
1131338365 (HEAD -> edit_article_page) Fix settings page
9c57cb3e7a Fix article page
ab6a6bef9d Add column
cgbaeef9d3 (master) Initial commit

追加の修正をし、追加のコミットをする際に、--fixup <引数> を使います。 引数には まとめたいコミットのハッシュ値を指定します。

まとめたいコミットメッセージの頭に fixup! の文字がついたコミットが出来上がります。

❯ git log --oneline
26a2dc16a8 (HEAD -> edit_article_page) fixup! Fix article page
1131338365 Fix settings page
9c57cb3e7a Fix article page
ab6a6bef9d Add column
cgbaeef9d3 (origin/master, master) Initial commit

これでコミットをまとめる下準備が完了。

最後に、git rebase -i --autosquash <引数> を実行します。 ※autosquashは、fixup! で始まるコミットメッセージ名のコミットをまとめます。

どのコミット以降に対してautosquashを実行するかを引数に指定する必要があるので、HEAD~4を指定します。

❯ git rebase -i --autosquash ab6a6bef9d
pick ab6a6bef9d Add column
pick 9c57cb3e7a Fix article page
fixup 26a2dc16a8 fixup! Fix article page
pick 1131338365 Fix settings page

# Rebase 671ca6fcee..f235308862 onto 671ca6fcee (4 commands)
## Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup [-C | -c] <commit> = like "squash" but keep only the previous

autosquashを実行後にエディタが立ち上がり、上記のような画面になります。 まとめたいコミットの下にfixupが付与されたコミットが来ていれば想定通りです。

あとはエディタを閉じれば、コミットがまとめられます。

❯ git log --oneline
1131338365 (HEAD -> edit_article_page) Fix settings page
9c5a2d3e7a Fix article page
ab6a6bef9d Add column
cgbaeef9d3 (origin/master, master) Initial commit

今回はgit commit --fixupの使い方を簡単に紹介しました。 一見すると登場するコマンドがやや難解そうですが、使ってみると簡単かつ便利です。 知らなかったというみなさんもぜひ使ってみてください。

(私は今の現場に来る前は、修正コミットなども残していたので、fixupを知ったのは、本当につい最近です)