Tips

現在のHEADからN個前のコミットまでを対話的にリベース

`git rebase -i` は、Gitのコミット履歴を対話的に編集・整理するための強力なコマンドです。不要なコミットの削除、複数のコミットの結合、コミットメッセージの修正など、ブランチを綺麗に保つために役立ちます。特にプルリクエストを送る前や、マージする前に利用すると、より分かりやすい履歴を維持できます。

Git

git rebase -i は、Gitのコミット履歴を対話的に編集・整理するための強力なコマンドです。不要なコミットの削除、複数のコミットの結合、コミットメッセージの修正など、ブランチを綺麗に保つために役立ちます。特にプルリクエストを送る前や、マージする前に利用すると、より分かりやすい履歴を維持できます。

汚れたコミット履歴を整理する git rebase -i

開発中にテスト用のコミットや途中のコミットが積み重なってしまいがちです。git rebase -i を使うことで、これらのコミットを統合したり、順序を入れ替えたり、完全に削除したりして、最終的なコミット履歴をクリーンで分かりやすいものにすることができます。これにより、コードレビューがしやすくなり、将来の履歴追跡も容易になります。

# 現在のHEADからN個前のコミットまでを対話的にリベース
git rebase -i HEAD~N

上記のコマンドを実行すると、設定されているエディタが開き、対象となるコミットが一覧表示されます。各コミットの行の先頭にはデフォルトで pick が記述されており、これを以下のように変更することで様々な操作が可能です。

  • pick (p): コミットを使用する
  • reword (r): コミットを使用し、コミットメッセージを編集する
  • edit (e): コミットを使用し、一時停止してコミット内容を修正する
  • squash (s): コミットを使用し、前のコミットと結合する (メッセージは新しく作成)
  • fixup (f): コミットを使用し、前のコミットと結合する (メッセージは前のコミットのものを使用)
  • drop (d): コミットを削除する

変更を保存してエディタを閉じると、指定した操作が順次実行されます。

注意点・おすすめポイント

  • 公開済みブランチでの使用は避ける: git rebase -i はコミットのハッシュ値を変更するため、既にリモートリポジトリにプッシュされ、他の開発者が作業しているブランチに対して実行すると、履歴の不整合を引き起こし混乱の元となります。プライベートなブランチや、まだリモートにプッシュしていないコミットに対して利用しましょう。
  • 強制プッシュが必要になる場合: リベース後にリモートリポジトリへプッシュする際は、履歴が書き換わっているため git push --force-with-lease を使用する必要があります。--force ではなく --force-with-lease を使うことで、リモートの変更を上書きしてしまうリスクを低減できます。
  • 小まめなコミットと最後の整理: 開発中は意味のある単位で小まめにコミットし、プルリクエストを出す前など、適切なタイミングで git rebase -i を使ってコミットを整理するワークフローがおすすめです。これにより、作業中の履歴は柔軟に保ちつつ、最終的な履歴はクリーンに保つことができます。