対象
Gitを使ったことがあるけどなんかよくわかんないという人
Gitは色々なオプションがあるけど、最低限知りたいという人
前提
・何かしらのファイルがgit管理されている(されていない場合はセットアップについての記事をあとで書きますので、そちらをご確認ください)
・Macを使っている
※今回の記事にはGitHubについての操作は出てきません。次に書く記事で操作の順を追って説明したいと思います。
Gitとは?
コンピュータの中にあるファイルなどに発生した変更を記録し、その記録履歴を管理するための「バージョン管理ツール」です。
なので、別にプログラムだけではなく、ただのテキストファイル、wordファイル、excelファイルだって管理できます。
なんか黒い画面でいじるイメージがあるので「全てエンジニアのもの」みたいな雰囲気がありますが、そんなことはありません。(まあエンジニアしか使わないのかもしれないけど。。。)
リポジトリとは?
Gitを触っていく上で大事な用語がいくつかあります。
そのうちの一つがリポジトリです。
リポジトリとは、簡単にいうとファイルやフォルダの状態を記録する場所です。
リポジトリに保存された状態は、内容の変更履歴として格納されています。
変更履歴を管理したいフォルダをリポジトリの管理下に置くことで、そのフォルダ内のファイルやフォルダの変更履歴を記録することができます。
「リポジトリ」があることで、ファイルやフォルダの変更履歴を追跡できるようになり
・この時点までファイルを戻したい!
・ここで変更した内容ってなんだっけ?
・この変更って誰がしたの?
みたいなことがちゃんと管理できるようになります。
変な変更がされていたらとりあえず前の状態に戻して、お茶を飲んで落ち着く
ということもできます。リポジトリに感謝。
ローカルリポジトリとリモートリポジトリ
次に、「ローカルリポジトリ」と「リモートリポジトリ」について説明します。
急に謎な概念が現れた気がしますが、そんなに構えないでください。
ものすごいざっくりいうと
ローカルリポジトリ=あなたの目の前のパソコン上にある、Gitを使う時に便利な保存場所
リモートリポジトリ=外の世界にある、Gitを使う時に便利な保存場所
みたいな感じです。
結局、リポジトリはこの2つしか存在しません。
たった2つです。
この2つのリポジトリを行き来して、ファイルの変更や保存などを行なっていきます。ちゃんと設定ができていれば
Gitは目の前のパソコンから、目には見えない便利な保存場所を使えるようになる素敵なもの
というわけです。
なんとなく理解が進んできましたでしょうか?
次にいってみましょう。
どうやって「便利な場所」に保存をするのか?
自分のパソコンから、とある「変更履歴とかを管理できる便利な場所」を使えるようになる。
ということがここまでで分かったかと思います。
しかし、「どうやってやるんだ!」という問題がまだ残っていますね。
まずは手順をみてみましょう。
ここで初めてterminalを開きます(teminalの使い方はここで)
※あくまで保存の方法だけを説明しているので、下記のコマンドを叩いても動かないと思いますが、コマンドを載せます。
$ git add .
$ git commit -m "hogehoge"
$ git push origin master
はい、ものすごく簡潔にいうと、この手順で保存ができます。
「おいおい、いきなり何いってんじゃコラァァァ!!!」
という声が聞こえるので、ちゃんと説明します。
このコマンドの説明の前に、もう少しだけ用語を覚えましょう。
パソコンの中身
さて、先ほどローカルリポジトリはあなたの目の前のパソコンの中にあると言いました。
このパソコンの中は、少しだけ枝分かれしています。
パソコンの中身は
ワーキングツリー
インデックス(ステージングともいう)
ローカルリポジトリ
この3つに別れています。
ワーキングツリー:今現在変更・修正しているファイルのある場所
インデックス(ステージングともいう):あとでリポジトリにコミットをする時にファイルを保存しておく場所
ローカルリポジトリ:リモートリポジトリに向けて送るファイルたちの待機場所
という風に考えましょう。
コミット、という言葉が出てきましたが、さっきの謎のコマンド
$ git commit -m "hogehoge"
これのことです。(コミットについてはまたあとで詳しく説明します)
つまりワーキングツリーとインデックスにおいては
・ワーキングツリーでファイルの編集をする(要は自分のPCでファイルの編集をする)
・それをコミットする準備のためにインデックスに上げる(これはさっきの手順でいうとgit add .)
・コミットする(さっきの手順でいうと git commit -m "hogehoge")
という作業を行います。
さて、色々と用語も出てきてわからなくなってきたと思いますので、ここまでの話をざっと整理するために、図にしてみました。
まずはそれぞれの場所の役割と位置関係はこうです。

そこにgitコマンドを当てはめてみます。

これで
git add
git commit
git push
の役割がなんとなくわかったのではないでしょうか。
・git addは作業中のファイルをインデックスにあげるためのコマンド
・git commitはそのファイルをローカルリポジトリにあげるためのコマンド
・git pushはそのファイルをローカルリポジトリからリモートリポジトリにあげるためのコマンド
というイメージです。
ここまでで、下記のことがわかったかと思います。
・リポジトリとは、簡単にいうとファイルやフォルダの状態を記録する場所
・ローカルリポジトリの中身はワーキングツリーとインデックスに分かれている
・ローカルリポジトリはこちらの世界、リモートリポジトリは外の世界
・そこの世界を行ったり来たりするのに必要な魔法がGit
・git addは作業中のファイルをインデックスにあげるためのコマンド
・git commitはそのファイルをローカルリポジトリにあげるためのコマンド
・git pushはそのファイルをローカルリポジトリからリモートリポジトリにあげるためのコマンド
Gitには他にも色々なコマンドがありますが、この基本原則が崩れることはありません。
では、いよいよ先ほど出てきた超基本コマンドを解説していきます。
また、いくつか開発の中で使いそうな(自分が過去に使ったことがある)オプションを紹介します。
git add
自分のPCで作業をしている内容をインデックスにあげるためのコマンドです。
よくあるgit addの使い方
$ git add .
これで、変更した全てのファイルをインデックスにあげることができます。
$ git add hogehoge.html
(ファイル名を指定)
これをやると、変更したファイルの中で、hogehoge.htmlのみをインデックスにあげることができます。
git commit
git commitは作業したファイルをローカルリポジトリにあげるためのコマンドです。
よくあるgit commitの使い方
$ git commit -m "hogehoge"
こちらはファイルをローカルリポジトリにあげる時に「hogehoge」というメッセージ付きであげるためのコマンドです。
メッセージをつける理由としては主に「何をどう変更したのか」ということを他の作業者にもわかりやすいようにするためです。
なので"hogehoge"とか書いてコミットするのはよくないです。
$ git commit -m "index.htmlのインデントがずれている箇所を修正"
$ git commit -m "titleタグの中身が違っていたので変更"
とか、作業した内容とかファイルがわかるほうが望ましいです。
$ git commit
としてメッセージなしでコミットすることもできます。
$ git commit -a
これをやると、先ほどのgit addの工程を飛ばして、ワーキングツリーで変更した(削除も含む)ファイルを一気にローカルリポジトリに反映します。
僕はあんまり使わないですが、git addがめんどくさい時には使ってみてもいいかもしれません。
git push
ローカルリポジトリの内容をリモートリポジトリに反映するためのコマンドです。
よくあるgit pushの使い方
$ git push
このコマンドでローカルリポジトリに保存されているファイルをリモートリポジトリに反映します。
ただし、この書き方をすると、Gitの設定で定められているリモートリポジトリに反映することになりますので、注意が必要です。
$ git push origin master
のように、反映する先の場所を指定してあげることが多いです。
この場合は、
origin:リポジトリの場所の別名
master:ブランチの名前(ブランチは作業場のように捉えていてもらえればいいです)
originっていう名前のリポジトリの、masterっていう名前の作業場所にpushするよ!ということですね。
記事書いた雑感
ここまでで、開発で絶対に使うコマンド3つを説明しました。
他にもたくさん現場で使うコマンドはあるのですが、それについてはまた今度書きます。