typoとか1行程度の変更とかすごい軽い修正を見つけた時、以前の変更にくっつけたい(fix,squash)時がある。
直前のコミットを修正したいならgit commit --amend
で良いのだが、直前ではない何個か前のコミットを修正したい場合少し面倒。
一般的な流れは
git add
git commit
git stash
git rebase -i abcd12e^
# fix とか squash
git stash pop
参考:
How can I easily fixup a past commit?
git: squash/fixup earlier commit
git commit --fixup
とかgit rebase -i --autosquash
などの手がかりはあるが、人それぞれいろいろなやり方でやってるし、コマンド1回でちゃんと動くやつがうまく見つからなかった。
git fixup
まだ、長い期間試してないが、数回試みて動いた一例
git fixup (Gist)
git-fixup
というファイルを~/bin/
などに作成して、実行権限を与える(chmod)
git add
git fixup abcd12e
# OR
git fixup HEAD^
CONFLICTが起きた場合どうなるかは未確認
スクリプト内のGIT_SEQUENCE_EDITOR
の変数が不要に見えたが、どうやらこれがrebaseを自動的に先に進める役割を果たしている模様(これを消すといつものrebaseのコミット履歴変更を尋ねる画面になる)
Issues
元ネタを試したらエラーになるケースがあったので、AUTOSQUASHのオプションのケースだけに削ったら思い通りに動いた。
あと、git stash --include-untracked
のオプションが付いていたが、これはけっこう危険(なので外した)
include-untracked
の良い点としてはrebase時の追加/削除されたファイルによるCONFLICTが起こりにくくなる点だが、悪い点としてはignoreされているファイルが消えてしまうという問題がある。