git squash! fixup! についてメモ
git でコミットをまとめる,編集するといった事をするには git rebase -i
を使用する
- そもそも
rebase
とは- 自分のブランチの根元を継ぎ変える認識
詳細は別で
- 自分のブランチの根元を継ぎ変える認識
自分の開発環境では
- ある程度作業する
- 作業修正 / 追記で amend commit を繰り返す
- rebase で綺麗にして Marge Request をだす
といった感じで進めていた
しかし,amend commit を繰り返すと自分がどこを修正したのかわからなくなるのと,
どういった段階を踏んで作ったのがわからなくなるので,よくないのではと思い,
コミットメッセージをまとめる squash!
と fixup!
について調べてみた
端的にまとめるとコミットログの頭に squash!
fixup!
が付いていると git rebase -i
の際に一々指定しなくていいよっていう程度の事
git commit --(squash|fixup)=hash
- コミット時に squash | fixup を選んでコミットする
- squash はメッセージを含むと統合されるコミットに追記される形になる
- fixup はメッセージを含まずにコミットをまとめる
squash と fixup 同時にやったらめんどくさいことになったので squash だけのテスト
touch 1st 2nd 3rd 4th git init git add 1st git commit -m "first commit" git checkout master -b sub git add 2nd git commit -m "2nd" git add 3rd git commit -m "3rd" --squash=HEAD
そしてできるのが以下
% git log --oneline --graph * f1ad210 squash! 2nd * e80be23 2nd * bf67bb1 (master) first commit
この状態で git rebase -i --autosquash
を実行すると下記の様に自動的にコマンドに置き換わる
pick e80be23 2nd squash f1ad210 squash! 2nd
あとは interactive でログの編集をするなどして remote に push するとかする
ちなみに git rebase
に関する設定で autosquash
と autostash
の二つがあり,
前者は --autosquash
のオプションを自動的に付加するもの
後者は rebase 実行時に自動的に stash に入れて,rebase が完了したら取り出してくれる設定
なので,個人的には日頃からソース更新などする際は git pull
ではなく git rebase --autostash
の方が勝手がいいのかなという感じ