Gitとは何なのか整理する試み

### 記事を書こうと思った動機

チーム開発をする機会があったのですが、その時にGitをうまく使いこなせず、私だけコードをコピペして共有するという形で開発をしていたので、これから、Gitを使って個人開発をしていくためにGitについて整理しておきたいと思いました。

### この記事の対象者

- Gitって名前だけは聞いたことある
- Gitって何なのかを知りたい
- 失敗が怖くて、なかなか開発に踏み出せない


# 分散型バージョン管理システムとは？

Gitとは分散型バージョン管理システムです。

バージョン管理とは、「システムの変更をバージョンとして記録していつでも変更前に戻せるようにしようよ」という考え方です。

例えば、１と２があり、二つを足して３にするとします。しかし、元の１と２の状態に戻したくなりました。そこで、バージョン管理ができると３の状態を１と２を足す前の状態に戻せるというわけです。便利さは伝わりましたでしょうか？~~引き算を使えば良いじゃんというツッコミは無しでお願いします。~~


続いて、『分散型とはなんのこっちゃ』と最初は思われるかもしれませんが、分散型バージョン管理システムの利点は、集中型バージョン管理システムと比較するとわかりやすいです。

- ### 集中型バージョン管理システム
    - 利点
    - 管理者がバージョン管理を一箇所にまとめられるため、誰が何をしているのか分かりやすい
    - 欠点
    - 管理者がバージョン管理をしている「一箇所」に不慮の事故が起きると全体が機能しなくなる
    - 個人単位で管理ができない

- ### 分散型バージョン管理システム
    - 利点
    - ローカルに個人でバージョン管理ができる
    - 簡単に自分の作業履歴を確認できる
    - サーバが故障した時に復元率が高い

分散型バージョン管理の方が後発だそうで、だいぶ優遇（？）されていますね。

今挙げた以上にGitの利点はまだまだあると思います。が、なぜこんなにも色々な事が可能なのでしょうか？

# Gitはシステムをスナップショット（その時点の状態）のまま切り出す事ができるため

『日本語で、OK!』という方、自分もそう思っているので安心してください笑

バージョン管理システムは「システムの変更をバージョンとして記録する」ので『Gitは、変更部分だけ保存するのかな？』と思いきや、「その時点のそのままの状態を切り出す」というなんとも大胆な事をしています。

そのまま切り出したものは、ブランチ(枝)と呼ばれています。このブランチは、1つだけでなく、2つ、3つと分ける事ができます。作業の状態をそのまま切り取って、分岐させることでGitは柔軟なバージョン管理を可能にしています。

# GitをGitたらしめる4つの領域

Gitには、大きく分けて4つの領域が存在します。

- ワークツリー
    - 作業をする場所

- インデックス
    - 作業の記録を登録する場所

- ローカルリポジトリ
    - 作業の記録が実際に反映される場所

- リモートリポジトリ
    - ネットワーク上に存在するリポジトリ


Gitには、git addというコマンドがあります。これは、インデックスという領域に「その時点のシステムの状態」を登録するコマンドです。ちなみに、「その時点のシステムの状態』がある領域が、ワークツリーです。

そして、git commitというコマンドもあります。これは、インデックスにある「その時点のシステムの状態」をローカルリポジトリに「作業結果として確定する」コマンドです。

# なぜワークツリーからローカルリポジトリに直接commitせずに、インデックスが必要なのか？

ここまで聞いてくださった方には、こんな疑問を抱いた方もいるのではないでしょうか。

バージョン管理システムでは、『1つのコミットの中には、対応したい問題に関連する修正だけが含まれていること』が推奨されています。

もしインデックスが無くなり、commitだけになってしまうと「新機能の追加」も「不具合の修正」も同じcommitとして扱わなければならず、後から差分を見たときにどこからが「新機能の追加」で「不具合の修正」なのかが分からなくなってしまいます。

インデックスがあれば、「次にコミットしたい内容だけをインデックスに登録する」という使い方ができ、二つの別の修正を違うcommitとして扱う事ができるようになります。インデックスがあるおかげでコミットの単位を自由に操作する事ができ、柔軟な作業が可能になるというわけですね。

# リモートリポジトリって？

ここまでがワークツリーからローカルリポジトリまでの話です。自分のPC内にあるのがローカルリポジトリですが、

リモートリポジトリはインターネット上にあります。リポジトリがインターネット上にある事で以下のようなメリットがあります。

- 自分のローカルリポジトリをリモートリポジトリに送る事ができる
- リモートリポジトリからリポジトリをローカルリポジトリに送ることもできる
- 他の人のリモートリポジトリも公開されていれば、見る事ができる

これにより、端末が変わってもログインさえできれば、自分のリモートリポジトリからリポジトリを持ってこれたり、他の人のリモートリポジトリからリポジトリを持ってくるといった事が可能になります。

リモートリポジトリは、もはやチーム開発の要と言っても過言ではないでしょう。

# リモートリポジトリの利用にはGitHubのアカウント登録が必要

ログインさえできれば、という言葉が引っかかった方もいるのではないでしょうか。リモートリポジトリがインターネット上に存在するということで、GitHubという専用のウェブサービスを利用します。
https://github.co.jp/
↑こちらのリンクからアカウント登録ができると思います。フリーメール（Googleなど）で捨て垢を作ったら、Gitライフのスタートです。

# まとめ

- Gitとは分散型のバージョン管理システムであり、システムの「その時点の状態」を切り出している

- Gitはシステムの「その時点の状態」を切り取り、「ワークツリー」、「インデックス」、「ローカルリポジトリ」、「リモートリポジトリ」の4つの領域が互いに機能し合って、柔軟なバージョン管理を可能にしている

- リモートリポジトリは、チーム開発の要であり、利用にはGitHubのアカウント登録が必要になる

Gitが使えれば、失敗を恐れることなく開発作業を行えます。「Gitをマスターした」と言えるのは、何年後か分かりませんが、この記事でGitがなんなのかを整理できたことでもっとGitを使いこなしたくなりました。

この記事が皆さんのGitライフのきっかけになると幸いです。

# 参考　

https://git-scm.com/book/en/v2

https://techtoge.com/summary-what-is-git/

https://wa3.i-3-i.info/word14388.html

https://www.amazon.co.jp/%E6%96%B0%E3%81%97%E3%81%84Linux%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E4%B8%89%E5%AE%85-%E8%8B%B1%E6%98%8E/dp/4797380942/ref=sr_1_1?adgrpid=113196705062&gclid=CjwKCAjwwo-WBhAMEiwAV4dybWZgFEcXCCe2U1E8O7JEYqN4-NNE2drXEkXoHDxJQH0NPbxsZyOz6RoC6acQAvD_BwE&hvadid=489559881279&hvdev=c&hvlocphy=1009333&hvnetw=g&hvqmt=e&hvrand=14130257457950727794&hvtargid=kwd-1152146940662&hydadcr=21814_10996132&jp-ad-ap=0&keywords=%E6%96%B0%E3%81%97%E3%81%84linux%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8&qid=1657057971&sr=8-1