アプリ開発において「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を学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2024.06.29
Gitのコミット履歴を検索するgit rev-listコマンドを解説!
この記事を読むことで、`git rev-list`の使い方の基本を学べます!さまざまなGitコマンドを習得して、Gitマスターを目指しましょう!
- git
2023.11.26
gitのコミット履歴を整理するためにsquashを使いこなそう
Squashは、複数のコミットを1つのコミットにまとめる操作です。Squashを使用すると、コミットの履歴を整理したり、コミットのメッセージや変更内容を変更したりすることができます。
- インフラエンジニア
- git
2024.06.02
Gitコマンドgit ls-treeとは?使い方を徹底解説!
開発者がレビューを行う前に、特定のブランチやコミットに含まれるディレクトリ構造を確認するために使用します。レビュー対象の範囲を把握し、開発者が効率よく効果的にレビューを行うことができます。
- git