shellに続き、初心者が頑張って理解していくノート的記事です。
GitHubが常識と化してきた今日この頃、チャレンジしてみたものの、そもそもGitってなんなのかわからないと使いこなせない、っていうか挫折すると思います。私はしました。
なので、起き上がってまずGitについて本当に一から理解を試みました。
Gitって何?
Gitとは、**バージョン管理システム**のひとつです。
バージョン管理‥?
バージョンすなわち変更履歴の管理です。
例えばなにかファイルの書き換えをするとき、元データを失わないためにどのような工夫をするでしょうか。ほとんどの場合、保存用にコピーを作成しておくというのが定番の方法だと思います。
ですが、誰しもこんな経験があるのでは。
- 元データの保管が面倒
- 'meeting_3月.txt'、'meeting_最新.txt'といった名前のデータが複数できてしまう
- チームで触っていて、最後に書き換えたのが誰なのかわからない
- 先輩も同時に編集していたのに、知らずにタッチの差で上書きしてしまった
- 書き換えたよ~と言われても(あるいは自分でも)、どこを換えたかわからない
- 何回か前の更新状態の方が良かった、戻したい…
ある~~~!!
こんな事態を解消してくれるのがGitというバージョン管理システムです。
Gitを使えばこんなに便利。
上のあるあるを全部解決します。
- 更新履歴はGitに保存されるので、バックアップ用のファイルコピーが不要になる
- ファイルを「いつ」「誰が」「どこを変更したか」という情報も記録できる
- それにより、編集を重ねたファイルも過去のある状態に復元することができる
- どこを変更したか、差のあるところを表示することができる
- あるファイルを自分が開いたあとに誰かが編集をはさんでいた場合、
アップロード時に警告が出るので、知らないうちに上書きという事態を防ぐことができる
素晴らしいですね。最高です。
ちなみにGitHubは このGitの仕組みを利用したウェブサービスで、無料で自分のコードやデータなどを保存したり、世界に公開して、他の人と一緒に書き換えることができます。
分散型バージョン管理システム
Gitは 分散型バージョン管理という仕組みを利用しています。
ローカル環境(自分のPC等)に変更履歴を含む完全なリポジトリの複製が作成されるという仕組みです。言い換えれば、それぞれのローカル環境をリポジトリのサーバーに見立てているわけです。
そのためGitでは、ローカル環境にも変更履歴を保存できる、すなわちネットワークに接続していなくても更新作業を行う事が出来ます。
今までは集中型といって、サーバーにある一つのリポジトリを複数人で使用していたため、変更の整合やネットワークの問題もありました。分散型にはそのような心配はなく、近年GitおよびGitHubは開発者の重要なツールになっています。
この辺のしくみは今はさっと読みにして、最後まで読んでから再読頂いた方が理解しやすいかも。
リポジトリ?
リポジトリとその使いかたについて。
リポジトリとは
ファイルやディレクトリの状態を記録する場所です。変更履歴として保存されています。管理したいディレクトリをリポジトリの中に置くことで、そのディレクトリ内のファイルやディレクトリの変更履歴を記録することができます。
リモートリポジトリとローカルリポジトリの2種類に分けられます。
- リモートリポジトリ:サーバに配置して複数人で共有する用。
- ローカルリポジトリ:各人がそれぞれのPC上で使う用。
普段の作業はローカルリポジトリを使って全て手元のPCで行い、それを公開するときはリモートリポジトリにアップロードします。また、リモートリポジトリを通してほかの人の作業内容を取得することもできます。
要は自分の編集したファイルをみんなで見られる場所にアップロードするという流れですね。
用語いろいろ
用語がたくさん出てくるので、混乱してしまいますが、ここでクリアにしておかないと進めるごとに理解ができなくなってきます 。
逆に用語と流れさえクリアにできれば、最初は意味がわからなかった本やネット記事もグンと理解できるようになるので 、 最初のうちに理解しておくのが良いです。
用語の説明とGitの使いかたを並行して説明していきます。
前述の単語は斜体にしておくので、なんだっけと思ったら上を見てみてください。
ワーキングツリー
実際に作業しているディレクトリのことです。
インデックス
ワーキングツリーでの編集を終えたら、ローカルリポジトリへ保存したいですね。その際、一旦ここに登録します。リポジトリに追加するにはこのワンクッションを挟まないといけないのです。面倒なようですが、これを挟むことで、変更した差分だけを登録することができる等、のちの管理が明確になります。(かなりかいつまんで言うと。)
というわけで、インデックスに追加されただけの段階では、まだリポジトリには保存されておらず、「次にこれを保存したいです」という状態のままを保持しています。
コミット
インデックスに追加したファイルを自分のローカルリポジトリに登録します。すると、前回の更新から現在の状態の差分を記録したコミットと呼ばれるものが作成されます。
このコミットは、履歴としてリポジトリに格納されていくので、過去の変更履歴や変更した内容を知ることができるようになっています。イメージとしては上書きみたいなかんじです。
プッシュ
さあ、自分のローカルリポジトリの変更履歴をいよいよリモートリポジトリにアップロードして共有するぞ!そのために行うのがプッシュ(Push)という操作です。プッシュを実行すると、リモートリポジトリに自分の変更履歴がアップロードされて、リモートリポジトリ内の変更履歴がローカルリポジトリの変更履歴と同じ状態になります。
プル
リモートリポジトリを共有して複数人で作業していると、みんながリモートリポジトリにプッシュしていきますので、自分のローカルリポジトリに、ほかの人がプッシュした変更内容を取り込んで更新していく必要がありますね。それにはプル(Pull)という操作を行います。
プルを実行すると、リモートリポジトリから最新の変更履歴をダウンロードしてきて、自分のローカルリポジトリにその内容が取り込まれます。
クローン
リモートリポジトリを複製して自分の手元で作業をするために、クローン(Clone)という操作を行います。クローンすると、リモートリポジトリの内容をまるまるダウンロードしてきて、自分のところにローカルリポジトリとして作成できます。
例えばすでに進行中のプロジェクトに途中から参加する際などにクローンをします。
クローンしたリポジトリは変更履歴も複製されているので、元のリポジトリと全く同じように履歴の参照やコミットをすることができます。
たくさんの言葉が出てきますが、一つ一つを理解すれば複雑ではありません。
流れのおさらい
-
新規作成、もしくはリモートリポジトリからクローンして手元に自分のローカルリポジトリを作る。
-
それを編集し、ローカルリポジトリにインデックスを経てコミットを作成。
-
これまでの変更履歴をローカルリポジトリからリモートリポジトリにプッシュして、自分の変更をアウトプット。
-
他の人の変更をインプットするために、リモートリポジトリにプルをして変更履歴をダウンロード、自分のローカルリポジトリで編集を加え‥1へ戻る
っといった感じの流れになっております。
文中でも述べましたが、ここに書いたことだけでも理解できたら、色んな記事がぐんと理解しやすくなったので、頑張ればどんどん踏み込んでいけそうな気がしています 。
今回は流れを理解することに焦点を当てたのですが、実はまだまだいろんなことがあるようです。次回は実際に使用する観点で書いていきたいと思います。
何かありましたら、コメント頂けたら嬉しいです。