はじめに
Gitを使用していますが、コンクリフトやマージが怖くて使いこなせていない。VSCodeやXCodeでコミットをしているが、中で何が起こっているかわかっていない。
周りに有識者もおらず、流石にまずいだろと思って、Gitの基礎から学ぶことにしました。
Gitってなんですか?
分散型バージョン管理システム。
Linuxの開発を行っている際に、使用していたバージョン管理システムが、イケてないからCoolなのを作っちまおうぜってことで、
リーナス・トーバルズさんが作ったのが始まりだそうです。
GitHubとは何が違うの?
GitHubは、Gitのホスティングサービスの一つです。
(GitHub以外には、Bitbucketなどもあります。)
ざっくりいうと「Gitを利用した、開発者のためのWebサービス」のことです。
オープンソースの開発をもっと手軽にやりたいという目的で誕生したのがきっかけだそうです。
豆知識(GitHubの貢献)
GitHubがないときはオープンソースに関わるのがとてもハードルが高かったそうです。 オープンソースの集会?に顔を出して、開発者たちとコンタクトを取って、俺も仲間に入れてくれ〜ってしなくちゃいけなかったんですね。ネットがほとんど普及してないときのゲームサークルに入るみたいなもんか?(ほとんど想像で言ってます) でもGitHubが出てからは、一般人でも簡単にオープンソースに関われるようになり、今のオープンソース時代がやってきたわけですね。Gitの仕組み
Gitは、ファイルそのものをまるっとコピー(スナップショット)し、リポジトリに存在する、一つ前の状態と比較することで、バージョン管理を行っている。
これを実現するために、Gitには下記の3つの領域を持っています。
- ワーキングディレクトリ (作業ディレクトリ)
- ステージングエリア (一時変更履歴)
- ローカルリポジトリ (Gitディレクトリ)
上記の領域はすべてローカル環境なので、実はGitの作業は殆どローカルで完結していることになります。(私はこのことを理解しておらず、知ったときにびっくりしました。)
コマンドの裏で何が起きてるの?
基礎的なコマンドで一体何が起きているのかをまとめます。
git init
対象のディレクトリをGit管理下にするための初期設定をします。
このコマンドで「.gitディレクトリ」が作成されます。
ls -aコマンドとかで作成されているのが確認できると思います。
この「.gitディレクトリ」内でGitで行われている操作がすべて保持されています。
git add "ファイル名"
対象のファイルを「ステージングエリア」に追加します。
ざっくりというとステージングエリアは、変更予備軍です。(認識あってるか不安ですが...)
開発中は、変更内容すべてを反映させたいってことばかりではないはずです。作成途中で不要になる箇所とかって出ますよね?
そのため変更内容をステージングエリアで変更を一時的に保持しておき、後述の「git commit」で必要なものだけを「Gitディレクトリ」に格納します。
ちなみに「git add .」を実行するとカレントディレクトリ以下すべてが「ステージングエリア」に追加されます。
git commit
ステージングエリアにあるファイルを取得し、スナップショットを取ります。このスナップショットを「Gitディレクトリ」にバージョンとして保管します。
まとめ
Gitには、ワーキングディレクトリ、ステージングエリア、ローカルリポジトリの3つの領域がある。
変更をリポジトリに格納するには以下の流れになる。
- ワーキングディレクトリでの作業を行う
- addすることで変更内容をステージングエリアに追加
- commitでステージングエリア内のファイルを、バージョンとしてローカルリポジトリに格納
あとがき
今はとりあえずここまでですが、これからコンクリフトが起きたときの対処や、私が恐怖しているマージについても学んでいきたいと思っています。
Git勉強編はこれからも記事を作成していきます。
私がGitをかっこよく使いこなせるその時まで...
参考
Git - Gitの基本
いまさら聞けないGitとGitHubの違いって何? | in-Pocket インポケット
Gitのコミットの裏側で起こっていること - LIVESENSE ENGINEER BLOG