とりあえず勉強中なので、備忘録として。
以下の3つについて、それぞれ簡単な操作の流れを図示します。
①Subversion/CVS等(集中型リポジトリ)
②Git
③GitHub
私自身、現役の頃のソース管理はCVSでした。その後、Subversionをちょっと使った程度、つまり集中型リポジトリしか使った経験がありません。
分散リポジトリやGitというワードが出てきた時点で敬遠したい気持ちになりますが、そうも言っていられないので勉強してます。
勉強を始めるとまず、集中型リポジトリの操作は「commit」と「checkout」しかなかったのに、分散型では「pull」やら「add」、「commit」、「checkout」など入り乱れていてやる気を失います。
全体的にざっくり理解したいのですがネット上にもまとめた図がない。(見つからない)
というわけで、集中型リポジトリ経験者(私)が理解しやすいように図を作ってみました。ブランチ(履歴の枝分かれ)の概念を入れると理解し辛いので今回は触れません。(その方がざっくりは理解しやすいので。。。機会あったらまた記事作ります)
概ねブランチを無視した理解としては合っているはずですが、あくまで概要なのでやや適切でない記述については目を瞑ってください。もし間違いがあれば教えて頂けると助かります。
①Subversion/CVS等(集中型リポジトリ)
各自のマシンにあるファイルを、リポジトリに登録します。
操作も登録(更新)時の「commit」と取得時の「checkout」しかないので、非常に理解しやすい感じです。
ただこの場合、以下2点の問題があります。
・更新したファイルを共有のリポジトリに登録するので、一時的な(自分だけの)登録ができない
・ネットワーク(リポジトリのあるサーバー)に接続できないとcommitできない
Gitはこれらを解決します。
いよいよGitですが、前述の通りブランチの概念は無視してます。
上記の図ですが、まず「リモートリポジトリ」、「ローカルリポジトリ」、「インデックス」、「ワーキングツリー」の理解が必要です。
自分がマシン内で変更するファイルの場所が「ワーキングツリー」です。
これを「ローカルリポジトリ」に登録するのですが、その前段として「インデックス」に登録します。これによりリポジトリ登録前にワンクッション置いて、ファイル数など調整してからまとめてリポジトリにcommitできるようにしています。
で、AさんとBさんがそれぞれ「ローカルリポジトリ」を持っている事に注目して下さい。分散リポジトリと呼ばれる所以で、各自がそれぞれのリポジトリに登録できるようになっています。
皆で共有したい場合はサーバー上の「リモートリポジトリ」にファイルを登録する事になります。
上記から、Subversion等の集中型リポジトリが持つ問題を解決している事が分かるかと思います。
・更新したファイルを共有のリポジトリに登録するので、一時的な(自分だけの)登録ができない
→ローカルリポジトリに登録することで各自で管理可能
・ネットワーク(リポジトリのあるサーバー)に接続できないとcommitできない
→サーバー(リモートリポジトリ)にアクセスできなくても、ローカルリポジトリに登録可能
でもって、作業領域(ワーキングツリー)とかローカルリポジトリとか、管理場所がいっぱいあるので、それぞれの登録や取得操作の用語が違って、訳が分からんわけです。
さし当たって、以下を理解すれば多少見通しが良くなると思います。
——-ローカルで完結する操作———————————–
・add:「ワーキングツリー」→「インデックス」の登録
・commit:「インデックス」→「ローカルリポジトリ」の登録
・checkout:「ローカルリポジトリ」→「インデックス/ワーキングツリー」の取得
——-ローカル外を含む操作————————————-
・push:「ローカルリポジトリ」→「リモートリポジトリ」の登録
・clone:「リモートリポジトリ」→「ローカルリポジトリ」の取得
—————————————————————-
一応図には書いてますが、pullやfetch、resetなどは後でブランチの概念と合わせて理解すると良いと思います。
最後にGitHubです。Git≒GitHubや、Gitの発展したものがGitHubとか誤認すると混乱します。
まず、GitHubはGitを使ったサービスです。Googleの検索機能やDropBoxのクラウドストレージと同じく、単純にソース管理機能を提供してくれるWebサービスだと認識しましょう。
じゃあGitを普通に使うのと何が違うの、って言うと、GitHubユーザーはインターネット上にリモートリポジトリを作る事ができるようになります。
更に深く言うと、そもそも他人の作ったファイルを他の人が更新するような使い方を想定しています。特にオープンソースのように、見知らぬ誰かが作ったファイルを更新するような使い方を主眼においています。
よって、「②Git」に加えて、他人のリモートリポジトリから自分のリモートリポジトリにプロジェクトを取得したり、それを変更して自分のリモートリポジトリに登録し、相手に変更を通知する機能などを備えているわけです。
よって理解しておくべき用語は以下。
・fork:「他のリモートリポジトリ」→「自分のリモートリポジトリ」に取得
・pull request:「自分のリモートリポジトリ」→「他のリモートリポジトリ」に変更を通知
上記を理解すれば、Git/GitHubもややとっつきやすくなるのではないでしょうか。
ちなみにGitHubは無料アカウントだとリモートリポジトリの登録内容が公開されるので(プライベートなリポジトリは作れない)、その点はご注意を。