1. ホーム
  2. 記事一覧
  3. Gitコマンド「git reflog」とは?「HEAD」も併せて解説!

2024.06.02

Gitコマンド「git reflog」とは?「HEAD」も併せて解説!

アプリ開発において「Git」は必須スキルとなってきます。Gitの基本コマンドは知っているけど他のコマンドはよく知らない、Gitコマンドをもっと知って便利に使いたい!と思っている方、また 自分がこれまで遷移してきたコミットの情報を知りたい! という方向けに、この記事では「git reflog」コマンドについて解説します。

GitについてはエンベーダーのLinux応用コースで詳しく学ぶことができます。

https://envader.plus/course/5/scenario/1055

様々なGitコマンドを習得し、Gitマスターを目指しましょう!

「git reflog」でできること

git reflogはGitが保持する「reflog(リファレンスログ)」を表示するコマンドです。このログには、ローカルリポジトリの「HEAD」や「ブランチ」が過去に指していたコミットの履歴が記録されています。そのため、誤ったgit reset コマンドなどを実施した際に、git log コマンドでは表示がされず確認することができないコミットの情報を表示し、git reset コマンド実施前のコミットへ戻るなどの操作ができるようになります。

そもそも「HEAD」とは?

git reflogコマンドをより理解するには、まず「HEAD」という概念を理解する必要があります。「HEAD」とは、現在チェックアウトしているコミット、またはブランチを指すポインタのようなものです。基本的にはブランチにチェックアウトして作業をすることが多いため、通常「HEAD」はブランチを指しています。

デタッチドヘッドについて

開発をしていると、ブランチではなく個々のコミットにチェックアウトをすることがあります。その場合、「HEAD」はブランチではなく特定のコミットを直接指すことになりますが、このような状態を「デタッチドヘッド」と呼びます。

git switch コマンドを利用してチェックアウトをする場合、ブランチが関連していない特定のコミットに移動する(デタッチドヘッド状態にする)ためには--detachというオプションが必要になります。

git switch --detach 729141(コミットID)

開発現場での使用例

  • Gitの操作履歴を確認する 過去に「HEAD」が指していたコミットを確認できるため、自分が作業していたコミットの履歴や、どのような操作をしてブランチやコミットにチェックアウトしたか確認ができます。
  • ブランチの削除時 誤ってブランチを削除してしまった場合、git reflog でコミットIDを調べ、git branch <branch-name> <commit-id> コマンドで削除したブランチを復元することができます。

コマンドの使用方法

基本的な使い方

git reflog コマンドは、デフォルトで「HEAD」の変遷を表示します。つまり、何もブランチ名を指定せずに git reflog を実行すると、以下のようにHEADがどのコミットを指していたかの履歴が新しい順に表示されます。

git reflog

# 実行結果
582db06 (HEAD -> main) HEAD@{0}: reset: moving to 582db06559bab83a22e4e25e366d138b4cfd15d1
42d81e0 (origin/main) HEAD@{1}: checkout: moving from develop to main
af06ab4 (develop) HEAD@{2}: checkout: moving from main to develop

上記の実行結果において、1行目を例に取り出力結果の詳細を見てみましょう。

  • 「582db06」

    これはコミットに付与される一意なハッシュ値であるコミットIDを省略して、その先頭部分を表示しています。

  • 「(HEAD → main)」

    一番上の行は現在の「HEAD」に該当するコミットが来るため、まず「HEAD」であるということ、そしてそのコミットがブランチと関連している場合は今回の「main」のようにブランチ名が表示されます。もし先述のデタッチドヘッド状態の場合は「(HEAD)」とだけ表示されます。

  • 「HEAD@{0}」

    「@{0}」は現在の位置、「@{1}」は1つ前、「@{2}」は2つ前の位置を表します。そのため「HEAD@{n}」はnの数字が大きいほど過去のHEADの示します。HEADだけではなく、「main@{n}」のようにブランチの場合も同様です。

  • 「reset: moving to 582….」

    HEADがそのコミットに移動した際の操作の詳細が書かれています。今回の場合、「reset」と書かれているため、mainブランチにおいてgit reset コマンドを実施してHEADの位置が変わったことが読み取れます。

ブランチを指定

git reflog コマンドはデフォルトで「HEAD」の変遷を表示しますが、ブランチを指定することも可能です。その場合、以下のように使用します。実行結果の見方は「HEAD」の場合と同様です。

git reflog main

オプション

  • -n
  • --since

-n

このオプションの後に数字を入力することで、表示する結果の数を指定できます。また-n を省略して-数字 のような使い方もできます。

git reflog -n 2
# もしくは以下のように省略可能
git reflog -2

--since

このオプションはGitの他のコマンドでも使用されるためgit reflog コマンド特有のものではありませんが、特定の日付や時間で絞って結果を表示できるので、組み合わせると便利なオプションです。例えば2週間前からの結果のみを確認したい場合は以下の例のようになります。詳しくは、下記の記事で解説しているため参考にしてみてください。

https://envader.plus/article/359

git reflog --since="2 weeks ago"

まとめ

これまで見てきたように、git reflog コマンドは、「HEAD」やブランチの移動してきたコミットの履歴を表示するコマンドです。コミットIDを確認することで、過去のコミットの状態に戻ったり、誤った操作を取り消したりすることができます。開発現場では、そのようなトラブルシューティングをはじめ、様々な場面で git reflog が活用されています。この記事を参考に、ぜひ実際に使ってみてプロジェクトに役立ててください。

【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

IT未経験者必見 USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。

「フリーランスエンジニア」

近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。

「成功する人とそうでない人の違いは何か?」

私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。

比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。

多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、

note記事3000いいね超えの殿堂記事 今すぐ読む

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事