git ready

learn git one commit at a time
by Nick Quaranto, O-Show(@oshow)

the staging area

committed 18 Jan 2009

ステージングエリアこそが Git の本質たるコンセプトだ。ステージングエリアは作業のやり方を根本的に変えてしまう。もちろん、良い方向にだ。では、それがどういう仕組みなのか、使うにあたって何を知っておくべきなのかを復習しよう。

他の多くのバージョン管理システムでは、データを保管する場所は2箇所ある。ワーキングコピー(ファイルシステム上の今まさに触っているファイルとディレクトリ)と、バージョン管理システムがそれぞれのやり方で変更履歴を保存する場所、の2つだ。Git では、第三の選択肢がある。ステージングエリア(インデックス)だ。要するにこれは、どの変更を「送り出す」かを決めるための発送センターと言える。

ワーキングディレクトリと Git のコミット保管先はきちんと分離されているので、ステージングエリアのおかげで開発者は事前にコミットを組み上げることが出来る。いかに望もうとも、他 VCS がデフォルトでは備えていなかったテイストだ。Git がデータを保存するまでにレイヤーが一つ挟まることで、より柔軟なコントロールが可能になる。

ステージングエリアは git addgit commit だけで使える非常に簡単なものだ。つまりファイルをステージングエリアへ add して、変更の状態に満足したならばそれを commit する。

ひとたびリポジトリにコミットされたなら、それをリモートリポジトリへ push したり他のブランチへ merge したり、色々できる。ステージングエリア自身へ直接作用するコマンドも存在し、例えば 変更を stash する などだ。

ステージングエリアを使った簡単な例を見てみよう。以下は、いくつかファイルを変更したところだとする。

$ git status
  On branch master
  Changed but not updated:
    (use "git add <file>..." to update what will be committed)
 
      modified:   README.md
      modified:   about.html
 
  Untracked files:
    (use "git add <file>..." to include in what will be committed)
 
      help.txt
  no changes added to commit (use "git add" and/or "git commit -a")

この例では Git が把握しているファイルを2ついじっており、1つのファイルがまだ登録されていない(help.txt)。 git add . を使えば、変更した全てのファイルと、まだ登録されていない全てのファイルをステージングエリアへ追加できる。 add コマンドはデータをまだ保存はしないが、次に git commit する時のための準備として発送センターにデータを置かせてくれる。

$ git add .
$ git status
  On branch master
  Changes to be committed:
    (use "git reset HEAD <file>..." to unstage)
 
      modified:   README.md
      modified:   about.html
      new file:   help.txt

プロンプトが言うように git reset HEAD <file> でステージングエリアから変更を戻すことが出来る(なお、ファイル名とブランチ名が被っている場合は git reset <file> のように HEAD を省略してしまうとうまくいかない。HEAD を省略したい場合は git reset -- <file> とする)。このように、自分がしたいようにコミットする事が可能だ。 ファイル中の指定した行だけをコミットすることすら出来る。 ファイルの変更を捨てる方法が知りたいなら それ専用のまとめ TIPS 記事もある。

さてここまで来たら、 git commit を使うことで指定した全てのファイルを Git のデータ保管場所へ保存できる。以上だ。

$ git commit -m "Adding stuff"
  Created commit e793200: Adding stuff
   2 files changed, 3 insertions(+), 0 deletions(-)
   create mode 100644 help.txt

ステージングエリアに関する情報がもっと知りたいなら、以下の素晴らしい記事をチェックしてみよう。

  1. The Thing About Git
  2. Git Book – The Git Index

ステージングエリアを解説した他の情報源を知っているなら、是非コメントで知らせて欲しい!