派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

第19話 detached HEAD 状態って何?ブランチがない状態を解決する方法 【連載】マンガでわかるGit~コマンド編~

f:id:itstaffing:20201221130037j:plain

Webサービスやアプリ開発の現場では必須のバージョン管理システム「Git(ギット)」。Gitは、専用のソフトを使えばクリックで直感的に操作することもできますが、いざというときにコマンドが使えると便利です。 

前回の第18話では、コミットにタグをつける「git tag」を学びました。

・タグをつける

$ git tag タグ名

・タグを共有する

$ git push origin タグ名


今回の第19話では、detached HEAD 状態になってしまった場合の解決方法を学びます。このマンガを通して、わかばちゃんと一緒にGitの知識を身につけていきましょう!

【筆者】湊川 あいさん
【筆者】湊川 あいさん
フリーランスのWebデザイナー・漫画家・イラストレーター。マンガと図解で、技術をわかりやすく伝えることが好き。 著書『わかばちゃんと学ぶ Git使い方入門』『わかばちゃんと学ぶ Googleアナリティクス』『わかばちゃんと学ぶ Webサイト制作の基本』『運用ちゃんと学ぶ システム運用の基本』が発売中のほか、マンガでわかるGit・マンガでわかるDocker・マンガでわかるRuby・マンガでわかるScrapbox・マンガでわかるLINE Clova開発・マンガでわかる衛星データ活用といった分野横断的なコンテンツを展開している。

・Amazon著者ページ
・Twitterアカウント

  detached HEAD = ブランチがない状態!    

f:id:itstaffing:20201221125948j:plain
f:id:itstaffing:20201221125951j:plain
f:id:itstaffing:20201221125954j:plain

  detached HEADになってはダメ!でもなんで?

会社の先輩に「Gitを使うときは、detached HEAD にならないようにしてね」と注意されてしまった……!そのときこんな疑問が浮かびませんでしたか?

「detached HEAD ってなんのこと?その状態って必ず悪いものなの?」
「どういう段階を踏んだら detached HEAD になるの?」

そもそも detached HEAD が何なのかわからない状態で「ダメだよ」とだけ言われても、また気づかないうちに detached HEAD にしてしまうかもしれないですよね。

この記事では detached HEAD を深く理解するために

・そもそも detached HEAD とは何か?
・なぜdetached HEADがダメなのか?
・detached HEAD 状態を解消する方法

について、順に解説します。

  そもそもdetached HEADとは何か?   

detached HEADとは「ブランチがない状態」です。もう少し詳しく言うと「HEAD がコミットIDを直接指し示している状態」です。

第2話 ブランチとは?ポインタってどういう意味? で学んだとおり、実はブランチはコミットIDを指し示しているだけなんです。

f:id:itstaffing:20201221125957j:plain

そして、ブランチをさらに指差しているのが「HEAD」です。わかりやすく言うと、HEADは「現在地」です。今自分がチェックアウトしている場所を示します。

f:id:itstaffing:20201221130059j:plain

HEADはいつもひとつです。複数存在することはありません。そして、HEADはブランチを通してコミットIDを指し示しているのが正常な状態です。

f:id:itstaffing:20190617145541j:plain
Gitは、「自分が今チェックアウトしているコミット」をHEADという印をつけて判断しているというわけだ。
▼正常な状態
f:id:itstaffing:20201221130102j:plain

対して、detached HEADな状態は次のようになります。

▼detached HEADな状態
f:id:itstaffing:20201221130104j:plain

HEADがブランチではなく、コミットIDを直接指し示してしまっています。これは危険な状態です。

  なぜ detached HEAD はダメなのか?    

f:id:itstaffing:20190617145538j:plain
「HEADが直接、コミットIDを指し示している」のが危険な状態? それがなんでダメなの?
f:id:itstaffing:20190617145541j:plain
「ブランチがない」状態だからだ。
f:id:itstaffing:20190617145538j:plain
ブランチがなくてもコミットはできるよ?
f:id:itstaffing:20190617145541j:plain
ところが、それだと別のブランチに移動した瞬間、積み上げたコミットがたどれなくなってしまうんだ。
f:id:itstaffing:20201221130107j:plain

  detached HEAD 状態を解消する方法   

f:id:itstaffing:20190617145538j:plain
じゃあどうすればいいの?
f:id:itstaffing:20190617145541j:plain
簡単だ。ブランチがない状態ならブランチがある状態にすればいいのだ。

detached HEAD 状態を抜け出すには、そのまま、今チェックアウトしているコミット上でブランチを作ります。

$ git branch 任意のブランチ名

こうすることで、ポインタが

コミットオブジェクト←コミットID←ブランチ←HEAD

という正常な状態に戻り、detached HEAD 状態を抜け出せます!

f:id:itstaffing:20201221130110j:plain
f:id:itstaffing:20190617145538j:plain
やった~! detached HEAD、怖くなかった!

  まとめ 

今回は、detached HEAD について学びました。

■detached HEADとは

ブランチがない状態のこと。もっと詳しく言うと、HEADがコミットIDを直接指し示してしまっている状態のこと。

■detached HEAD状態はなぜだめか

そのままコミットを積み上げることもできるが、別のブランチにチェックアウトした瞬間、積み上げたコミットをたどれなくなるため。なぜならブランチがないから。

■detached HEAD状態を抜け出すには

そのまま、今チェックアウトしているコミット上でブランチを作る。

$ git branch 任意のブランチ名

このように detached HEAD は、ちゃんと理解すれば恐れることのない現象です。ブランチがない状態ならブランチがある状態にすればいいのです。これで、detached HEAD 状態になっても慌てず対処できますね。

『マンガでわかるGit ~コマンド編~』はこれにて最終回となります。 次回作のテーマは機械学習です。お楽しみに!

▼登場キャラクター紹介
f:id:itstaffing:20200122103525j:plain

▼わかばちゃんが登場する書籍

▼ これまでの「マンガでわかるGit」