#はじめに
gitはコミットを残すことによって、projectの履歴管理ができる素晴らしいシステムです。コミットをするためには先ずgit addというコマンドを使ってステージングする必要があります。何故、すぐに変更履歴をコミットしないでgit addでステージングする必要があるかについてずっと疑問だったので、その理由について調べてみました。
#目次
- gitの構成
- ワークツリー(working Tree)とは
- ステージング(staging)とは
- リポジトリ(repository)とは
- git addをする理由
- 参考サイト
gitの構成
gitは大きく3つの段階に構成されています。ワークツリー、ステージ、リポジトリ。図で表すと以下のようになります。ワークツリーからリポジトリに段階が進むに連れて、星の形が出来ていく感じです。ワークツリーからステージに到達するには「git add」コマンドが、ステージからリポジトリに行くには「git commit」コマンドが必要になります。
#ワークツリー(working Tree)とは
ワークツリーは簡単に言って自分が今作業しているファイルやフォルダーのことです。一つのprojectの中にいろいろなフォルダーがあり、階層構造になっていますよね。それをツリー(tree)に例えて表しているだけです。
#ステージング(staging)とは
ステージング(staging)とはワークツリー(自分の作業場)からステージ(stage)という臨時的な保存場所(実際は少し違います)に移す作業です。ステージ(stage)は日本語でいうと舞台ですよね。つまり、コミットの前段階であってコミットするファイルを舞台に乗せるという意味になります。git addコマンドによって実行されます。
リポジトリ(repository)とは
リポジトリは簡単にいうとコミットした履歴を保存する場所です。コミットするには「git commit」というコマンドを入力します。履歴を残すことでバグが起こったりして元の状態に戻す必要がある時に、このリポジトリに残っている履歴を辿って過去のある時点(コミットした履歴)に戻すことが出来ます。gitでproject管理をする主な理由でもありますね。
#git addをする理由
本題に入りまして、そもそもなぜ「git add」をするのでしょうか。ステージという段階はなぜ必要なのか、その理由について疑問に思ったりしませんか? 履歴を残すだけだったらワークツリーからリポジトリに直接コミットすればいいのであって、ステージなんか要らないですね。しかし、ステージングをする理由はちゃんとあります。例えば、掲示板の投稿機能を実装する場合、その機能に関係あるファイルを修正すればいいんですが全く関係のないところいじったりした経験はありませんか?例えば、掲示板の投稿機能を実装していたら、メイン画面の配置が気になったので修正し(index.htmlなどを修正)、それから掲示板の投稿機能に関するファイルを触ったとか。そういうことってありますよね。そんな時にもしステージングが無かったとしたら、全く関係のない内容まで履歴として残してしまうんですね。そういうのを防ぐために、掲示板の投稿機能に関係あるファイルだけを選んでステージング(舞台に乗せて)してコミットする。その後にメイン画面の修正は別のステージに乗せて、コミットすれば履歴(過去に戻る時点)がキレイになる。だから、git addコマンドで選別作業をするというわけですね。
※git add ファイル名を実行すると指定したファイルだけをステージング出来ます。
#参考サイト