gitの導入
今後のプログラミング学習においては、個人開発でもGitを使っていこうと考えています。
とりあえずgitをインストールして使ってみることは簡単かもしれませんが、一旦落ち着いて、具体的な仕組みをきちんと理解していきたいと思います。
gitとは
gitとはソースコードのバージョン管理ツール
ファイルを編集した際に、編集前の状態をとっておいて、いつでも元に戻せるようにしたいと思ったらどうすればよいでしょうか?
例えばそのファイルをコピーして、ファイル名にバージョン名を加えて管理することが考えられると思います。
しかし、その方法では管理が煩雑ですし、間違いも起きやすく、ファイル名だけではそのバージョンがどういう内容なのかもわかりにくいです。
さらにチームで編集しているファイルなどでは、同時に編集したことによって他の人の作業内容が失われてしまうことも起こり得ます。
こういったバージョン管理による問題を解消することができるのがgitです。
gitでは、好きな時にファイルの状況を更新履歴として保存しておき、いつでも当時の状況に戻すことができます。
さらに、古いバージョンのファイルで、新しいファイルを編集しようとすると警告が表示され、他人の作業を勝手に消してしまわないようになっています。
gitの仕組み
gitの構造は次のようになっています。
(1)ワークツリー(実際に作業をする場所)
↓add
(2)インデックス(gitに上げる必要があるもの置場)
↓commit
(3)ローカルリポジトリ(ローカル環境/分散)
↓push
--------------------------------------------------------- ↑ローカル/ ↓共有
↑pull
(4)リモートリポジトリ(GitHub)
(1)ワークツリー
ワークツリーは開発者が実際に作業を行うディレクトリのことです。
ここで作業した変更履歴のうち、gitを使って管理したい部分だけをインデックスにaddします。
(2)インデックス
ワークツリーからaddされた変更履歴が集積されている場所。
全ての作業内容をgitで管理するのはかえって煩雑なため、必要な内容だけをインデックスに一旦addして管理する。
最終的にインデックスに記述された変更履歴をコミットすることでローカルリポジトリに渡して開発者個人の編集履歴を管理します。
(3)ローカルリポジトリ
ローカルリポジトリは開発者の手元の環境において「git init」したディレクトリのことです。
開発は全てこのディレクトリ配下で行うことになり、編集されたファイルがaddされたインデックスをコミットすることで、その時点での編集履歴を保存します。
コミット
コミットをすると、前回のコミットと今回のコミットの変更履歴の差分を記録したリビジョンと呼ばれるものが作成されます。この差分が時系列順に保存されているようなイメージです。
この変更の差分を辿っていくことで、任意の地点の変更内容を知ることができます。
ローカルリポジトリに保存された変更履歴は、あくまでその開発者個人の分のみです。
リモートリポジトリにプッシュされて初めて他の開発者と共有することができ、またリモートリポジトリからプルすることによって、その変更内容をローカルリポジトリに適用することが可能です。
(4)リモートリポジトリ
リモートリポジトリは手元の作業環境ではなく、各種開発者がそれぞれ自身の変更履歴をプッシュして共有するためのリポジトリで、GitHubなどの外部にあります。
各開発者はこれらのバージョン情報をプルすることで、ローカル環境にその変更内容を取り込むことができます。
また、リモートリポジトリをそのままクローンすることで、全く同じ内容をローカルリポジトリに写すこともできます。
マージと競合の解決
最後にリモートリポジトリからプルした後、次にプッシュをしようとした時に、先に他の人がプッシュしてリモートリポジトリの内容が書き換わっていた場合、自分もさらにプッシュしてしまうと誰かの変更履歴を上書きして消してしまう可能性がある。
そのため、先にプッシュしている人がいた場合、その人の変更内容を「マージ」という機能によって一旦ローカルリポジトリに取り込んでから、プッシュする必要がある。
この時の変更履歴の適用は、基本的にgitが自動でやってくれます。
ただし、リモートリポジトリに上がっている最新の変更と、ローカルリポジトリで自分が加えた変更が同じ箇所だった場合、どちらが正しいかgitには判断できないので、手動で修正する必要があります。
このようにして、バージョン変更を時系列順に管理し、即座に過去の状態を再現できるようにしながら、他の人と変更内容を共有し、さらには誤って他の人の作業を消してしまうことが内容にしているのがGitです。
次回からはGitの具体的な使用方法についてまとめてみたいと思います。