はじめまして、17新卒で Diverse にてiOSエンジニアをしている@imaizume です。
try! Swift の熱気も冷めやらぬ内ではありますが、今回はiOSではなくgitに関する勉強会の登壇レポートになります。
先月2月6日にサポーターズさん主催の元、「detached HEADを理解して脱Git初心者を目指す方のためのGit入門勉強会」というタイトルの勉強会を開催し、私が講師を担当させていただきました。
当日の資料を公開しておりますので気になる方はぜひご覧ください。
内容としては、主にGitの初学者がつまづきやすい概念の一つである branch と HEAD を1から丁寧に解説し、最終的に detached HEAD の意味を正しく理解するというものになります。
deateched HEAD 状態とは、HEAD が branch を向いていない状態のことで、言い換えれば HEAD が直接 commit を指している状態のことです。
この状態になると、コンソール上には "You are in detached HEAD state" というメッセージが表示されます。
しかし、gitの学び始めではメッセージの意図が理解できず、状態の理解や復帰の方法が分からず戸惑いがちです。
かくいう自分も、かつてはそんな中の一人でした。
そこで今回は、まずbranchとHEADの正体を内部構造的側面から説明し、わかりやすいように図説を交えて丁寧に解説致しました。
例えば、 git を学び始めたすぐは git branch を直訳的に「枝 = 連続するcommit群」と認識して学習を進めてしまいがちで、ネット上でもそういった解説をされている記事が散見されます。
しかし正確には git branch は特定の commit を指すポインタに過ぎません。
つまり、 branch は別の commit へ付け替えることが可能ですし、任意の commit から自由に作成することが可能です。
branch をポインタとして理解しているかどうかで、git を通じた操作の自由度が大きく変わります。
またgit の学習初期ではあまり意識されない HEAD についても改めて解説を行いました。
HEAD もまた branch や commit を指すポインタで、こちらは「自分自身」を表しています。
そのためHEADが branch を checkout している場合、 add や commit といった操作は、HEAD が参照する branch が指す commit に対して行われていることになります。
そして最後に detached HEAD が 「HEADがbranchを指していない状態」であり、エラーでないということを確認しました。
いきなり detached HEAD 状態を理解するのは難しいですが、このように branch や HEAD を正しく理解できていれば理解の助けとなるはずです。
また実際の開発現場で detached HEAD になる必要があるケースについても紹介しました。
例えばモバイル開発では、ある段階でビルドがエラーになった場合、そのエラーが入り込んだと疑われる commit を一時的にcheckoutし、エラーが出ないことを確認した後、必要に応じてブランチを強制的に戻す、または新規にbranchを作成するといった作業をすることがあります。
また過去に作ったローカルブランチをリモートへpushしないまま消してしまった場合、 git reflog というコマンドでHEADの移動履歴を参照し checkout することで復活させられるといったテクニックも紹介しました。
終了後には参加された方から「図解があることでとても解りやすかった」「疑問に思っていたことが解消できた」などの好評をいただきました。
Diverse では、ソースコード管理を Git で行っており、普段から業務で使用する機会も多いため、今後も知見を共有する場を設けていきたいと思っております。
また Diverse の所属するミクシィグループでは、学生向けに git challenge というイベントを不定期で開催しています。
自身も第1回 git challenge の参加経験者であり、今回の勉強会を開催したのもこのイベントで得た知見を外部にも共有したいと思ったことが最初のキッカケでした。
次回の git challenge 開催は未定ですが、決まり次第ミクシィグループ採用ページにて告知する予定です。
もし興味を持って頂けたら、ぜひミクシィグループ採用ページもチェックしてみてください!
もちろん Diverse では iOS, Android, サーバーサイドエンジニアも大絶賛募集中です!!
ご興味ある方は @imaizume または他の弊社エンジニアへお気軽にお声がけください。