ヽ(´・肉・`)ノログ

How do we fighting without fighting?

EmacsのGitクライアントMagitでfixupを使いN個前のコミットを修正する

Emacs の Git クライアント Magit を利用して N 個前のコミットを 3 ステップで修正する方法.

Gitのfixupとは

git commit –fixup とは何か - 詩と創作・思索のひろば

Git には fixup という機能があることを知った.

git commit --fixup=HEAD~1 などとすると, fixup! [2つ前のコミットメッセージ] というコミットが自動的になされる.

git commit --amend との違いは, amend は 1 つ前のコミットにしか適用できないが, fixup は 2 つ以上前のコミットにも適用できる点だ.

これだけだと fixup! [2つ前のコミットメッセージ] という, あまり役に立たなそうなコミットが残ってしまい邪魔だ.

しかし git rebase する際に --autosquash というオプションを加えると, fixup! [2つ前のコミットメッセージ] というコミットメッセージを自動的に検出し, 2 つ前のコミットと合体させてくれる.

つまり fixup して rebase すると, 特にコミットメッセージを書かないで N 個前のコミットを修正できる.

ここまでは Git 単体の話だ.

Magitでfixupする

Magit でも以下のように fixup できる.

まずはファイルを変更して,通常のコミットと同じようにステージングして,c を押す.

./001.png

通常だとここでも c を押してコミットメッセージの入力をするところだが,今回は f を押す.

./002.png

すると,ログの中から fixup 対象を選ぶ画面になるのでカーソルを移動して C-c C-c を押す.

./003.png

すると選択したコミットに対する fixup コミットが作成される.

./004.png

Magitでfixupとautosquashを一度に行う

悪くはないが,fixup! コミットは最終的には squash するので,自動的にやってほしい. Magit には fixup と squash を同時に行ってくれるコマンド Instant Fixup がある. 素晴しい.

まずはファイルを変更して,通常のコミットと同じようにステージングして,c を押す.

./001.png

ここで先程は f を押したが,今回は大文字の F を押す.

./005.png

先程と同じように,ログの中から fixup 対象を選ぶ画面になるのでカーソルを移動して C-c C-c を押す.

./003.png

すると,前回とは異なり fixup コミットは残っておらず fixup 後にさらに git rebase -i --squash した結果が得られる.

./006.png

まとめ

Magit で N 個前のコミットを修正するには

  1. Magit で修正を staging して c を押す
  2. F を押す
  3. 対象となるコミットをカーソルで選んで C-c C-c を押す

で行える.