以下のGitコマンド、よく出てきますよね。
$ git add
$ git commit
$ git push
このコマンドを打つことで、ソースコードを書き換えてGithubを更新してくれる。プロフィールに草が生えるからうれしい。今日のプログラミングはおしまい。
しかしここで、**「git addとcommitの関係は? git pushってどういう意味?」**と聞かれると、すらすらと答えられない人も多いのではないでしょうか。草が生えて喜んでるのにそんなこと聞くなよ、と。プログラミングを始めたころは、私もなんとなくこのコマンドを使っていました。
今日は、git addとcommit、pushの関係をわかりやすく解説していこうと思います。
##リモートリポジトリとローカルリポジトリって?
Gitコマンドを理解するためには、まず**「リモートリポジトリローカルリポジトリの関係」**を理解する必要があります。
リポジトリとは、ファイルやディレクトリの履歴を管理する場所のことです。
自分のパソコン内でバージョン管理するために作成したリポジトリをローカルリポジトリといいます。リモートリポジトリはネット(主にGithub)にファイルをアップロードした状態でファイル管理するものです。
画像引用:https://backlog.com/ja/git-tutorial/intro/02/
チーム開発の場合、個人がローカルリポジトリで開発を進めて、リモートリポジトリで開発したコードを共有する、という流れです。リモートリポジトリはネット上でファイルが共有されているので、プルリクエストという、自分のソースコードに対するレビューをもらったりして、開発を進めていきます。
図にあるように、ローカルリポジトリの内容をリモートリポジトリに送信(アップロード)することを**「push」**と呼びます。
$ git push
これでgit pushの意味が分かりましたね。
##git add とgit commitのちがいとは?
git addとcommitはローカルリポジトリ内で使用するコマンドです。
ソースコードを書き換える流れを、図に表すと以下のようになります。
画像引用:https://backlog.com/ja/git-tutorial/intro/04/
ワークツリーとは、実際に作業している場所(ディレクトリ)のことを指します。ここでああでもあい、こうでもないと試行錯誤して開発を進めるわけですね。
そのあとソースコードが完成したら、リポジトリに更新する必要があります。このソースコードの更新作業を**「commit」**と呼びます。
ここでワークツリーとリポジトリの間には、インデックスというスペースがあります。これはコミットするファイルを準備するところです。ワークツリーからインデックスに登録することを**「add」**と呼びます。
※ちなみに、なんでインデックスが必要なの?いきなりワークツリーからリポジトリにコミットで良くない?と思った方もおられるかもしれません。
インデックスの役割としては、変更点をいきなりコミットすると更新されてほしくない箇所も更新する恐れがあるからです。色々変更を加えたけど、ファイルAとBを変更したとき、Aだけコミットしたいことがあります。インデックスにAだけを登録することで、変更して欲しいファイルだけコミットすることができるんですね。
コミットに含めたい変更を選別する作業を行うのがインデックスの役割です。
これで、git add とgit commitの違いがわかったかと思います。このあとpushコマンドを使って、ローカルリポジトリの内容をリモートリポジトリに送信(アップロード)する流れになります。
##まとめ
git addとcommit、pushの関係をまとめると
1.git addコマンドで、インデックスにコミットしたいファイルを登録する。
2.git commitコマンドで、インデックスにあるファイルを更新する。
3.git pushコマンドで、ローカルリポジトリの内容をリモートリポジトリに送信する
この3つを押さえておきましょう。
そのほかにもpull、fetch、mergeコマンドなど、良く出てくるGitコマンドがあるのですが、それは次回の記事で解説したいと思います。
追記:【Gitコマンド解説②】はこちら↓↓↓
git fetchとmerge、pullの関係をわかりやすく説明する【Gitコマンド解説②】
この記事の説明がわかりやすかった!ここ間違ってるよ!次こんな記事を書いて欲しい!などあればコメント、DMよろしくお願いします。LGTMもぜひ。
Twitterもやってますので、フォローしていただけたらうれしいです。
卓球、心理学、哲学、Webサービス、好きな音楽、カメラ、登山、ランニング、読んだ本などなんでもつぶやいてます。
[https://twitter.com/atsushi101011]