GitはLinuxの生みの親であるリーナス・トーバルズによって開発されたバージョン管理のツールで、数々のバージョン管理システムのなかで最も有名なものとなっています。しかし、Gitの考え方の中には初めて利用するという人にとっては分かりにくいものも存在します。エンジニアのレイチェル・M・カルメナさんが、Gitの基本的な概念について図を用いてまとめています。

How to teach Git | Rachel M. Carmena

https://rachelcarmena.github.io/2018/12/12/how-to-teach-git.html

カルメナさんが解説を書こうと思ったのはGitを使い始めた同僚のモニターに下の画像のようなポストイットが貼られていたことがきっかけだそうです。ポストイットには「add」「commit」「push」のコマンドが書かれていますが、その同僚は3つのステップの理由を分かっておらず、何かと問題が起きていたとのこと。



解説を書くにあたり、カルメナさんは語彙(ごい)を教えることに重点を置いています。というのも、Gitで使われる言葉が分からなければGitで表示されるメッセージの意味を読み解くことができないからです。そうした言葉を学ぶためには図を用いるのが良い方法だとカルメナさんは述べています。

さて、Gitには4つの領域があります。手元のPCに存在する「作業ディレクトリ」「ステージングエリア」「ローカルリポジトリ」という3つの領域と、ネットワーク越しに存在するサーバーの「リモートリポジトリ」です。



「git clone <url>」というコマンドを使うと、リモートリポジトリのデータがローカルリポジトリと作業ディレクトリにコピーされます。



作業ディレクトリにあるファイルは2種類に分けられます。Gitが存在を認知している「tracked」なものと、認知していない「untracked」なものです。例えば新たに作成したファイルなどがuntrackedになります。



作業ディレクトリで変更したい点に関しての作業を終えたら、次は「add」コマンドを使って変更したファイルをステージングエリアに加えます。その後「commit」コマンドを使うとステージングエリアのファイルを元にコミットを作成でき、作成されたコミットがローカルリポジトリに加えられます。ローカルリポジトリに加えられたコミットをリモートリポジトリに送るには「push」コマンドを使います。



ファイルの変更点を一覧できる「diff」というコマンドがありますが、このコマンドを「git diff」のようにオプションや引数を付けずに使用すると作業ディレクトリ内での変更点が表示されます。「git diff --staged」のように--stagedオプションを付けるとステージングエリアにある変更点を表示でき、「git diff <コミットハッシュ>」のようにすればローカルリポジトリの当該コミットと作業ディレクトリとで異なっている部分を表示できます。



ローカル環境をアップデートするためのコマンドには「fetch」と「pull」という2つが存在します。fetchコマンドを使うとリモートリポジトリのデータをローカルリポジトリにコピーすることができます。



もう一つの「pull」はfetchの動作に加え、リモートリポジトリのデータを作業ディレクトリにmergeします。



mergeが行われるとmergeコミットのログが残りますが、コミットログを汚したくない場合は「git pull --rebase」とするとmergeではなくrebaseを行うことができます。



カルメナさんはさまざまなバージョン管理システムを使用してきたそうですが、「どんなシステムでも知識不足は良くない。ツールの選択だけではなくツールの使い方の習得にも力を入れるべきだ」とコメントしています。