だいぶ前にもGitについてこのブログArrownでも触れたことがあったのですが、2021年9月は久しぶりにGit月間と題して、しっかりとGitについてのさまざまな内容をブログにしていきたいと思います!
というのも、私恥ずかしながら本当に物覚えが悪く…Gitについても「あれ、なんだっけこれ?」この場面はどうするのが正解だっけ」という状況に陥ることが多々あるのです。
なので、このブログは自分のために書いているといっても過言ではありません!
さて、今回の記事で取り上げるのはgit rebase -iについてです。僕みたいなgit rebase恐怖症の人も安心してgit rebase使えるように(というか自分)頑張ってまとめてみたいと思います!
なお、interactiveモード以外の使い方もしっかり取り上げる予定です!
目次
git rebase -iとは?
gitって本当すごい仕組みだよな…といまだに思います。そんな素晴らしいバージョン管理システムであるgitですが、時にはコミット履歴が複雑になってしまうことがあります。
gitを使い立てのときにありがちなのが、以下のようなことです。
- 無駄なコミット履歴を残してしまう
- 誤った操作を行なってコミットメッセージ記入途中でコミットしてしまう
後者については直近のコミットであればgit commit –amendなどで修正可能ですが、複数のコミット履歴をまとめて修正したいというときやコミットを統合したいときにgit rebase -i (interactive)コマンドを使用すると便利です!
簡単にいうと、お掃除したり、ログとログをまとめたりすることができるわけですね!
git rebase -iの基本的な使い方
まずは、試しに最新のコミットから4つ分の履歴をrebaseによる修正対象としたい場合を例にしてみたいと思います!
git rebase -i HEAD~4 コマンドを実行してみます。
git rebase -i HEAD~4
は、最新の履歴から4つ分をrebaseコマンドで表示させるという意味になります!数字の部分を変更すれば、表示される履歴の数が変わるわけですね!
そして、表示された履歴をみてみると、履歴行の左側に「pick」という文字がついているのがわかりますね!
この部分が、対象とする履歴行の内容をコミット履歴上でどう扱うか、という意味になります!よくオプションと表現される部分です。
git rebase -iのオプションについて
git rebase -iのオプションで指定できる内容には以下のようなものがあります!
- pick(p)・・・・現在のまま。当該コミット履歴を採用。
- squash(s)・・・・直前のコミットに当該コミットを統合する。当該コミットのメッセージは残る。
- fixup(f)・・・・直前のコミットに当該コミットを統合し、当該コミットメッセージは破棄される
- reword(r)・・・当該コミット履歴を採用するが、コミットメッセージを変更(過去の特定コミットのメッセージを変更したい時に便利)
- edit(e)・・・当該コミット履歴を採用するが、ファイルを変更・修正する
注意すべきなのが、どのオプションであったとしても、実行後はrebaseしたもの以降のコミットIDは全て変更されるということです。
プッシュ済の内容をrebaseしてしまうなどすると、リモートブランチとの不整合が生まれて操作がややこしくなるので、今回紹介する内容は基本的に「プッシュ前」に行うようにしましょう!
git rebase -iの使用例
では、git rebase -iの使用例について見ていきましょう!
1. コミットを統合する
先ほど紹介したgit rebase -iのオプションであるsquashやfixupを使用することによって、コミット履歴を簡潔にすることができます!
例えば、最新のコミット履歴2つ分が全く同じ目的な場合、コミットを統合することで「同じ目的のコミットを1つにまとめる」ことができるようになります!
pick <commit1>
fixup <commit2>
上記例の場合、commit1にcommit2が統合され、コミットメッセージとしてはcommit1に書かれたものが残ることになります。
2. コミットメッセージを修正する
最新のコミットであればgit commit –amendでコミットメッセージを修正することができますが、いくつか過去のコミットについてのメッセージを変更したい場合は、git rebase -iを行ったあとに対象となるコミットに対してrewardを行頭につけることで、当該コミットのメッセージを変更することができるようになります。
reward <commit1>
pick <commit2>
pick <commit3>
上記例のようにすることで、commit1のメッセージ内容を修正することができます。どう修正するかは、rewardを実行した次の段階で決めていくことになります!
3. コミットを削除する
仮に不要なコミットが混ざってしまった場合は、そのコミット自体を削除することもできます。
drop <commit1>
pick <commit2>
pick <commit3>
dropを指定したコミットが削除されることになります。上記事例であればcommit1が削除に相当するわけですね。
まとめ
ということで、今回はgit rebase -i (interactive)で、コミット履歴をきれいにするというテーマでブログ記事を書いてみました!
git rebase -iコマンドを使用することで、コミット履歴を簡潔にすることができます。
また、コミットを統合・コミットメッセージを修正・不要なコミットを削除することで、よりきれいなコミット履歴を作成することができます。このようなテクニックを活用して、プロジェクトの管理をより効率的に行いましょう。