【Git備忘録】コミット履歴を自由自在に操る!log, reset, revert, rebaseを徹底解説

ALL

こんにちは、Tech Samuraiです!
Gitの基本的な操作(add, commit, push, pull)に慣れてくると、次に知りたくなってくるのが「コミット履歴」の管理方法ではないでしょうか。「あ、このコミットやっぱり修正したい」「複数のコミットを一つにまとめたい」「間違えてプッシュしちゃったコミットを取り消したい」…など、開発の現場では様々な状況が発生します。

コミット履歴は、プロジェクトがどのように進化してきたかを物語る、非常に重要な「開発日誌」です。この日誌を綺麗に、そして安全に管理するための強力なコマンド、log, reset, revert, rebaseの使い方を探検しましょう。

【重要】
この記事では、歴史を「書き換える」可能性のある危険なコマンドも紹介します。チーム開発における大原則は、**「他の人と共有した履歴は、決して書き換えない」**ことです。そのための安全な使い分けについても、詳しく解説していきます。


1. 過去を旅する:`git log`

履歴管理の第一歩は、過去のコミットを確認することです。git logは、これまでのコミット履歴を一覧表示する、最も基本的なコマンドです。

# 基本的なログ表示
git log

しかし、そのままでは情報が多すぎることがあります。以下のオプションを付けると、格段に見やすくなります。

  • --oneline: 各コミットを1行で簡潔に表示します。
  • --graph: ブランチの分岐やマージの様子を、線で視覚的に表示します。
  • --all: 現在のブランチだけでなく、すべてのブランチの履歴を表示します。

おすすめの組み合わせ:

# 全てのブランチの履歴を、グラフ付きで、1行で表示する
git log --all --graph --oneline

このコマンドは、プロジェクト全体の流れを把握するのに非常に役立ちます。


2. コミットを取り消す(共有前):`git reset`

git reset`は、**まだプッシュしていない、ローカルリポジトリだけのコミット**を取り消したいときに使います。ブランチの指し示す位置を、過去の特定のコミットに強制的に移動させる、タイムマシン(巻き戻し)のようなコマンドです。

【注意!】
このコマンドはコミット履歴を「消去」するため、**すでにチームに共有(プッシュ)したコミットに対しては絶対に使ってはいけません。**

git resetには3つのモードがあります。

  • --soft: コミットだけを取り消し、変更内容はステージングエリア(git addした後の状態)に残します。「コミットメッセージを間違えたから、もう一度コミットし直したい」といった場合に便利です。 git reset --soft HEAD~1 # 1つ前のコミットを取り消す
  • --mixed (デフォルト): コミットとステージングを取り消し、変更内容はワーキングディレクトリ(ファイルが編集された状態)に残します。
  • --hard (危険!): コミット、ステージング、そしてファイルへの変更内容のすべてを完全に消し去ります。使う前には、本当にその変更が不要かよく確認してください。

3. コミットを打ち消す(共有後):`git revert`

では、「すでにプッシュしてしまったコミット」を安全に取り消したい場合はどうするのでしょうか? その答えがgit revertです。

git revert`は、履歴を消去するのではなく、**指定したコミットの変更内容を、すべて元に戻すような新しいコミットを自動で作成**します。

例えるなら… reset`が「帳簿のページを破り捨てる」行為なら、revert`は「『先のページの記載は誤りでした』という訂正記録を、新しいページに追記する」行為です。これにより、何が起こったかの履歴を全て残したまま、安全に変更を打ち消すことができます。

# 取り消したいコミットのIDを指定して実行
git revert <commit-id>

4. 履歴を美しく整える:`git rebase -i`

git rebase`は非常に多機能ですが、ここでは特に便利な**インタラクティブリベース(-i)**を紹介します。これも、まだプッシュしていないローカルのコミット**に対してのみ使う、歴史の編集ツールです。

例えば、「WIP(作業中)」のような細かすぎるコミットを、機能が完成した後に一つにまとめたい、といった場面で使います。

# 直近3つのコミットを編集対象にする
git rebase -i HEAD~3

このコマンドを実行すると、編集画面が開き、各コミットに対して以下のような指示を出せます。

  • pick (p): そのまま使用する
  • reword (r): コミットメッセージを修正する
  • squash (s): 一つ前のコミットに統合する(コミットをまとめる)
  • drop (d): そのコミットを削除する

不要なコミットを整理し、コミットメッセージを分かりやすく修正することで、後から誰が見ても理解しやすい、美しい開発日誌を作成できます。


まとめ

やりたいこと共有済み?使うコマンド履歴の扱い
履歴を見るgit log変更なし
ローカルのコミットを取り消す共有前git reset履歴を消去(危険)
共有済みのコミットを打ち消す共有後git revert打ち消しコミットを追加(安全)
ローカルのコミットを整理する共有前git rebase -i履歴を書き換える(危険)

Gitの履歴管理は、強力な分、注意が必要なコマンドも多いです。特に、「共有済みの履歴は書き換えない(resetrebaseをしない)」という黄金律を守ることが、チーム開発を円滑に進めるための鍵となります。

これらのコマンドを適切に使い分け、あなたのプロジェクトの物語を、より美しく、より分かりやすく記録していきましょう!

【Git】”大変更”をどう伝える?Conventional CommitsでのBreaking Change表現法

コメント

タイトルとURLをコピーしました