Git Reflogと履歴の復元
`git reflog`を使って失われたコミットやブランチを復元し、作業のセーフティネットとして活用します。
「Git Reflogと履歴の復元」はCoddyKit上の無料DevOps Bootcampレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDevOps Bootcamp学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 DevOps Bootcampコースには全4レッスンが含まれています。
Git Reflogとは
ブランチを誤って削除したり、間違ったコミットにリセットしたりしたことはありませんか。慌てる必要はありません。Gitには、Reflogという強力なセーフティネットがあります。
reflog(reference log、参照ログ)は、ローカルリポジトリ内でHEADとブランチポインターがこれまで指していた場所を記録したものです。
Reflogが履歴を追跡する仕組み
プロジェクトファイルへの変更を追跡するコミット履歴(git log)とは異なり、reflogはリポジトリの参照への変更を追跡します。
HEAD(現在のコミット)またはブランチポインターが移動するたびに、Gitはそのイベントをreflogに記録します。これには次の操作が含まれます。
- 変更のコミット
- ブランチの切り替え
- マージまたはリベース
- リセットの実行
- リポジトリのクローン
Reflogを表示する
reflogを確認するには、git reflogコマンドを使うだけです。その時点での操作とHEADの状態の一覧が表示されます。
いくつかの操作をシミュレートしてから、reflogを表示してみましょう。
git init my_repo
cd my_repo
echo "First line" > file.txt
git add file.txt
git commit -m "Initial commit"
echo "Second line" >> file.txt
git add file.txt
git commit -m "Add second line"
git reflogReflogエントリを読み解く
reflogの各エントリには、決まった形式があります。表示される可能性のある一般的なエントリを分解して見てみましょう。
a1b2c3d HEAD@{0}: commit: Add new feature
a1b2c3d:その時点でHEADが指していたコミットのSHA-1ハッシュです。HEAD@{0}:これは「reflogエントリポインター」です。@{0}は最新の状態、@{1}はその1つ前の状態を示し、以降も同様です。commit: Add new feature:HEADを移動させた操作の説明です。
これらのポインターは、復旧に欠かせません。
シナリオ:失われたコミットを復旧する
コミットを作成した後、誤ってgit reset --soft HEAD~1で取り消してしまったとします。そのコミットは現在のブランチ履歴には存在しなくなりますが、本当に消えたわけではありません。
reflogがそのコミットを覚えています。このよくあるミスをシミュレートしてみましょう。
git init my_project_recovery
cd my_project_recovery
echo "Initial content" > start.txt
git add start.txt
git commit -m "Initial commit"
echo "Important feature" > feature.txt
git add feature.txt
git commit -m "Added an important feature"
# Oops! Accidentally reset
git reset --soft HEAD~1
git reflogコミットを復元する
リセット後にgit reflogを実行すると、「Added an important feature」コミットのエントリが、おそらくHEAD@{1}などとして表示されます。
復旧するには、reflogのエントリを指定してgit resetを使います。たとえば、失われたコミットのハッシュがabcdefg、またはreflogのエントリがHEAD@{1}だった場合は、次のようにします。
# Assuming the lost commit was HEAD@{1} in the reflog
git reset --hard HEAD@{1}
# Or using the specific commit hash from reflog
# git reset --hard abcdefg
# Now, check your log. The commit is back!
git log --onelineシナリオ:削除したブランチを取得する
マージする前にブランチ全体を誤って削除してしまった場合や、もう必要ないと思って削除した場合はどうでしょうか。
ブランチは、コミットを指す単なるポインターです。ブランチを削除しても、そのブランチが指していたコミットがリポジトリからすぐに削除されるわけではありません。reflogには、そのブランチのHEADがどこを指していたかが残っています。
Reflogからブランチを復元する
feature-xという名前のブランチを作成して作業した後、git branch -D feature-xで削除したとします。
git reflogを実行すると、次のようなエントリが表示されることがあります。
1234567 HEAD@{5}: branch: Created branch feature-x またはabcdefg HEAD@{2}: checkout: moving from feature-x to master
ブランチがアクティブだったreflogエントリからコミットハッシュ(例:1234567またはabcdefg)を使って、ブランチを再作成できます。
# Assume 'feature-x' was deleted and its last commit was '1234567'
# Create a new branch pointing to that commit
git branch feature-x-recovered 1234567
# Now, check out your recovered branch
git checkout feature-x-recovered
# Verify its history
git log --onelineReflogエントリには有効期限がある
reflogは強力なセーフティネットですが、エントリが永久に残るわけではありません。Gitは一定期間が経過すると、古いreflogエントリを整理します。
- デフォルトでは、到達可能なエントリ(現在の
HEADからたどれるもの)は90日後に期限切れになります。 - 到達不能なエントリ(削除したブランチや、参照されなくなったコミットなど)は30日後に期限切れになります。
そのため、「失われた」作業は後回しにせず、できるだけ早く復旧するのが最善です。
Reflog復旧チャレンジ
新しい機能ブランチを作成し、複数のコミットを作成した後、マージせずに誤って削除したとします。git reflogを実行すると、次のエントリが表示されました。
...
c0ffee1 HEAD@{3}: commit: Implement new user profile page
bada55e HEAD@{4}: checkout: moving from feature/profile to main
...削除前にfeature/profileブランチが指していた最新のコミットを指すよう、ブランチを正しく再作成するコマンドの組み合わせはどれでしょうか。
Reflog:Gitのセーフティネット
ローカルGitリポジトリで「失われた」作業を復旧するための重要なツール、git reflogを使いこなせるようになりました。次の点を覚えておきましょう。
HEADとブランチポインターがどこを指していたかを追跡します。git reflogでこの履歴を表示できます。- reflogのエントリ(
HEAD@{n}またはコミットハッシュ)を指定して、git resetやgit branchでコミットやブランチを復旧できます。 - reflogエントリには有効期限があるため、何かを復旧する必要がある場合は早めに対応しましょう。
Gitの履歴は整理された状態に保ちつつ、緊急時にはreflogが役立つことを覚えておいてください。
よくある質問
「Git Reflogと履歴の復元」レッスンは無料ですか?
はい。「Git Reflogと履歴の復元」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、DevOps Bootcampコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 DevOps Bootcampコースには全4レッスンが含まれています。
「Git Reflogと履歴の復元」で何を学びますか?
`git reflog`を使って失われたコミットやブランチを復元し、作業のセーフティネットとして活用します。 ブラウザで直接実行するハンズオンコードでDevOps Bootcampを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
DevOps Bootcampを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのDevOps Bootcampは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「Git Reflogと履歴の復元」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このDevOps Bootcampレッスンでコードを書いて実行できますか?
はい。すべてのDevOps Bootcampレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Git Reflogと履歴の復元
- デバッグのためのGit Bisect
- リポジトリのメンテナンスと整理
- git filter-repo で履歴を書き換える