Gitの教え方
Gitを使い始めて12年が経ちます。8年前、オープンソースプロジェクトを立ち上げる予定のパートナー会社にGit(そしてGitHub)のトレーニングセッションを行うことになりました。今回は、そのときにどのように教えたかについてお話しします。ちなみに、その後、同じようなアプローチを使用した社内トレーニングセッションを立ち上げました。ただし、私が何かを発明したわけではありません。これは、他の人が書いたもの、特にPro Gitの本に大きく影響を受けていますが、順序が異なることがあって、それが違いを生むと思うのです。
この投稿を書いている理由は、長年にわたり、人々が実際にGitを_使用して_いるのを見てきたからですが、彼らが何をしているのか本当に理解していないようでした。彼らは、たとえばオープンソースプロジェクトが使用しているような別のワークフローに適応できず、何かが思ったように動作しない、またはGitコマンドの実行中に間違いを犯した場合に完全に迷ってしまう人たちです。Julia Evansが再びGitに興味を持っていることに触発されて、彼女が時々ソーシャルネットワークでコメントを求める際に書き留めることにしました。
私の目的は実際にはGitについて教えることではなく、私のGit教育のアプローチを共有することです。つまり、他の教える立場の人が触発を受けるためにです。ですから、もしあなたがGitを学んでいるなら、この記事はあなたのために書いたわけではありません(残念ながら)、そしてそのためには自己完結していないかもしれませんが、リンクされた他の学習リソースが十分に空白を埋めて、それでも有用な学習リソースになることを願っています。もしビジュアル学習者なら、それらの外部学習リソースにはイラストが含まれているかも知れませんし、ビジュアル学習に向けられているかもしれません。
メンタルモデル
VCS(バージョン管理システム)を使用する理由が明確になったら(つまり、変更を_commits_の中で記録する、別の言い方をすると、私たちは変更を履歴に_commit_します;この用語については多少なじみがあると仮定しています)、もう少し具体的にGitについて見ていきましょう。
Gitを理解するためには、その背後にある概念の正確なメンタルモデルを持つことが重要です。
まず、あまり重要ではありませんが、Gitは実際には_変更_を記録するのではなく(少なくとも概念的には)ファイルの_スナップショット_を記録し、必要に応じて差分(diffs)を生成します(実際には、効率的に物事を保存するために_packfiles_を使用し、場合によっては_変更_ –差分– を実際に保存します)。これは時々、いくつかのコマンドの結果にも現れます(ファイルが削除された別のファイルが追加されたように見えるコマンドもあれば、ファイルがリネームされたように見えるコマンドもある)。
さあ、Gitのいくつかの概念についてもう少し詳しく見ていきましょう、あるいは一般的なVCS概念をGitがどのように実装しているかについてです。
コミット
Gitの_commit_は以下を含むものです:
- 1つ以上の親コミット、または最初のコミット(root)にはなし
- コミットメッセージ
- 著者と著者の日付(実際にはタイムゾーンオフセット付きのタイムスタンプ)
- コミッターとコミット日付
- 私たちのファイル:リポジトリルートからの相対パス、その_mode_(UNIXファイルシステムの権限)、そしてその内容
各コミットは、この情報のSHA1ハッシュを計算することで識別子が与えられます。コンマを変えると、異なるSHA1、異なる_commit object_が得られます。(ちなみに、GitはSHA-256への移行をゆっくりと進めています)。
余談:SHA1はどのように計算されるのか?
Gitのストレージは_content-adressed_であり、つまり各_object_はそのコンテンツから直接派生する名前(SHA1ハッシュの形)で保存されます。
歴史的に、Gitはすべてをファイルに保存していましたが、私たちはまだそのように考えるかもしれません。ファイルの内容は_blob_として保存され、ディレクトリは_Tree_(ディレクトリ内のファイルをその名前、モード、およびblobを表すコンテンツのSHA1とともに、サブディレクトリをその名前とtreeのSHA1とともにリストするテキストファイル)として保存されます[eof]
こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/tbroyer/how-i-teach-git-3nj3