Gitの3つのエリア
このページで分かること
- ワークツリー・ステージ・リポジトリの3つのエリアの役割が分かる
git addとgit commitがそれぞれどのエリアへ移す操作かが分かるgit statusの出力から、ファイルが今どのエリアにあるかを読める- ステージに載せた変更を降ろせる
このページの目次10 items
第2部の07で、練習用のフォルダをリポジトリにしました。ここからファイルを記録していきますが、その前に、Git を使ううえで最も重要な仕組みを押さえます。Git の中では、変更は3つの場所を順番に通って記録されます。
3つのエリア#

左から右へ進むと記録に近づきます。上の矢印が進む操作、下の矢印が戻す操作です。
- ワークツリー(working tree):ふだん目にしているフォルダそのものです。エディタでファイルを編集する場所で、ここでの変更はまだ何も記録されていません
- ステージ(staging area):次のコミットに入れる変更を置いておく場所です。
git addでここに載せます。Git の内部ではインデックス(index)と呼ばれ、資料やエラーメッセージでもこの名前が出てきます - リポジトリ:第2部の07で見た
.gitフォルダです。git commitで、ステージに載っている変更がまとめて1つのコミットとして記録されます
3つとも自分のPCの中にあります。ネット接続も、どこかへの送信も関係ありません。
なぜ「ステージ」を挟むのか#
ファイルを直接コミットできれば手順は1つ減ります。それでもステージがあるのは、コミットに入れるものを選ぶためです。
たとえば、作業中に2つの別々の修正をしたとします。ステージがあれば、片方だけを載せて先にコミットし、もう片方を次のコミットにできます。1つのコミットに1つの意味を持たせられるので、あとから履歴を読む人(未来の自分を含みます)が「この記録は何のためか」を理解できます。選び方は第2部の09で扱います。
実際に移してみる#
練習用フォルダ ~/git-practice で、ファイルを1つ作ります。
cd ~/git-practice
echo "牛乳を買う" > memo.txtecho "…" > ファイル名 は、文字を書き込んだファイルを作るコマンドです。エディタで同じ内容のファイルを作っても構いません。
ワークツリーにある状態#
git status
# 出力:
# On branch main
#
# No commits yet
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
# memo.txt
#
# nothing added to commit but untracked files present (use "git add" to track)Untracked files は「Git がまだ一度も記録の対象にしていないファイル」です。ファイルはワークツリーにありますが、Git はまだ見ているだけです。
ステージに載せる#
git add memo.txt
git status
# 出力:
# On branch main
#
# No commits yet
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
# new file: memo.txtChanges to be committed(次にコミットされる変更)の下に移りました。これがステージに載っている状態です。
リポジトリに記録する#
git commit -m "買い物メモを作成"
# 出力:
# [main (root-commit) d9110b5] 買い物メモを作成
# 1 file changed, 1 insertion(+)
# create mode 100644 memo.txt-m の後ろがコミットメッセージです。d9110b5 の部分は記録ごとに違う値になります。
git status
# 出力:
# On branch main
# nothing to commit, working tree cleanworking tree clean は「ワークツリーとリポジトリの記録に差がない」という意味です。3つのエリアがすべて同じ内容で揃った状態で、ここが作業の出発点になります。
ステージから降ろす#
記録したあとのファイルを変更して、ステージとの間を往復してみます。
echo "卵を買う" >> memo.txt
git add memo.txt
git status
# 出力:
# On branch main
# Changes to be committed:
# (use "git restore --staged <file>..." to unstage)
# modified: memo.txt>> は、ファイルの末尾に1行書き足す指定です。ステージに載せましたが、やはりこの変更は次のコミットに入れたくない、というときは git restore --staged で降ろします。
git restore --staged memo.txt
git status
# 出力:
# On branch main
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git restore <file>..." to discard changes in working directory)
# modified: memo.txt
#
# no changes added to commit (use "git add" and/or "git commit -a")Changes not staged for commit(ステージに載っていない変更)に戻りました。降ろしても、ファイルの中身はそのままです。cat memo.txt で確かめると、「卵を買う」の行は残っています。ステージから降ろすことと、変更を捨てることは別の操作です。
よくある疑問#
Q. git add したあとにファイルをさらに編集したら、どうなりますか?
A. ステージに載っているのは、git add した時点の内容です。その後の編集はワークツリーにだけあり、もう一度 git add するまでコミットに入りません。git status では、同じファイルが「Changes to be committed」と「Changes not staged for commit」の両方に表示されます。
まとめ#
- Git の変更は、ワークツリー → ステージ → リポジトリの順に進んで記録される
- ステージはインデックスとも呼ばれ、次のコミットに入れるものを選ぶための場所
git addでステージに載せ、git commitでリポジトリに記録するgit restore --stagedはステージから降ろすだけで、ファイルの中身は変えない- 3つのエリアはすべて自分のPCの中にあり、ネット接続とは関係がない
次のページ#
09. add と commit ── 変更をどう選び、どんな単位とメッセージで記録すると、あとから読める履歴になるのかを見ます。