なぜGitについて学ぼうと思ったのか
普段何気なく使っているGit。私はアプリの製作中GitHubデスクトップにてメインブランチを消去という暴挙をおかしてしまい、途方に暮れてしまいました。それを機にGitについて改めて勉強したので、アウトプット。
もしかしたら間違えているところもあるかもしれませんが、コメントで教えていただけると幸いです。
Gitとはバージョン管理ツールである
そもそもGitとは何かという根本的なことさえ頭に入ってなかったのですが、Gitはバージョン管理ツールのことです。
バージョン管理ツールのない世界を仮定する
AさんとBさんが共同であるアプリを作成した。ところが、修正箇所が見つかったので、Aさんが「アプリX」の名前を「アプリX 改訂版」として保存した。そして、このデータをBさんと共有した。するとまた修正したい箇所が見つかったので、Bさんはアプリを修正後、「アプリX 改訂版」という名前を、「アプリX 最新版」として保存した。かくしてAさんとBさんはこのようにアプリの修正を繰り返した結果、どれが最も最新版なのかわからなくなってしまった。
まあこれは極端な例ですが、例えばアプリを修正するたびに日付を追記するとか、工夫すればこの程度はクリアできそうですよね。ただ、時には逆もしたいわけです。修正したものの、やはり元に戻したい。でも、どのファイル名がどこまで修正したものかわかりづらい。こういうことはありそうですね。これが少人数での開発ならまだなんとかなるかもしれませんが、開発規模が大きくなるとそうはいきませんね。
また、同時に作業できないという欠点もあります。Aさんが問い合わせフォームを作っている間にBさんがトップページをつくる、といったことができないわけです。これではチームで開発する意義が薄いですし、非常に時間がかかります。なんとか同時に作業して、今までのアプリとの変更点の差分だけ取り出せないかということでバージョン管理ツールが輝くわけです。
バージョン管理ツールがある世界
かくしてバージョン管理ツールが使われることになるのですが、バージョン管理ツールの一つがGitです。(GitとGitHubは別物です。それも今になって知りました・・・)
Gitを使う際、母体となるデータはサーバに保存します。 そして母体のデータを自分のPCに落とし込み、作業をするわけですね。git cloneがそれに相当します。AさんもBさんもgit cloneしてそれぞれ作業をします。この時点でサーバではなくローカル環境で作業をすることになりますね。そして一定の作業が終わったとき、git addをします。そしてgit commitをすることで変更を保存します。(じゃあgit addとcommitってほぼ一緒じゃんと最初私は思ったのですが、もちろん違います。がここでは割愛します)。commitした内容、つまり変更点を母体に伝えることを、git pushといいます。変更点を押し出す!というイメージですかね。この時点で母体のデータには変更点が保存されることになります。そこでAさんはBさんに言うわけです。「Gitにpushしたよ」と。BさんはAさんによる変更点を自分のパソコンにも反映させたいと思いますよね。それがgit pullです。変更点を引いてくる!ということでしょうか。変更点をpushしたりpullできるということは、差分を保存しているということですから、いつ、何を変更したか確認できますし、必要なら過去にも遡ることができるわけです。
さて、ここで疑問。マージとかプルリクって何? ってことです。またAさんとBさんが作業していると仮定しましょう。ところがBさんはおっちょこちょいで、ついAさんの作成したお問合せフォームを消してpushしてしまったのです。そうすると困りますよね。いくら遡れるといっても毎回のようにおっちょこちょいを発動されてはたまったもんじゃありません。そこでAさんはBさんに言いました。「pushする前に確認させて!」ここでBさんが行うのがpull request 、プルリクです。「他の人がpullしてもいい状態にしますね、いいですか?」というお伺いをたてるわけです。そこでAさんが「よっしゃ、大丈夫やで」となって初めてmerge できます。責任者が変更点を確認してmergeすることで、母体のデータがめちゃくちゃになるのを防ぎます。
まだまだ深いよ、Gitの世界
長くなってきたので一旦書くのをやめますが、今回は2人での作業を仮定して書いています。これが大規模なプロジェクトになったり、クライアント目線で安全を担保したりするには、今書いていることだけでは到底実現できません。だからこそ先人の方や最前線に立つエンジニアの方が素晴らしいアイデアや技術を生み出し、それを私たち一般人が(まだまだ使いこなせていませんが)享受できているのですね。
アプリ製作を行なっていると、つい「動くと面白い!」が先行してしまい、原理原則や周辺知識が疎かになってしまっていました。これからは本質をつかむということを意識して学習していきたいと思います。それが自分の力になると信じています。