CH 08 / 75第2部 Gitの基礎 ── 手元で完結する操作

Gitの3つのエリア

このページで分かること

  • ワークツリー・ステージ・リポジトリの3つのエリアの役割が分かる
  • git add と git commit がそれぞれどのエリアへ移す操作かが分かる
  • git status の出力から、ファイルが今どのエリアにあるかを読める
  • ステージに載せた変更を降ろせる
このページの目次10 items

第2部の07で、練習用のフォルダをリポジトリにしました。ここからファイルを記録していきますが、その前に、Git を使ううえで最も重要な仕組みを押さえます。Git の中では、変更は3つの場所を順番に通って記録されます。

3つのエリア#

ワークツリー・ステージ・リポジトリの3つのエリアと、git add・git commit で進み、git restore –staged でステージから降ろす流れ

左から右へ進むと記録に近づきます。上の矢印が進む操作、下の矢印が戻す操作です。

  • ワークツリー(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つ作ります。

text2 lines
cd ~/git-practice
echo "牛乳を買う" > memo.txt

echo "…" > ファイル名 は、文字を書き込んだファイルを作るコマンドです。エディタで同じ内容のファイルを作っても構いません。

ワークツリーにある状態#

text12 lines
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 はまだ見ているだけです。

ステージに載せる#

text11 lines
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.txt

Changes to be committed(次にコミットされる変更)の下に移りました。これがステージに載っている状態です。

リポジトリに記録する#

text6 lines
git commit -m "買い物メモを作成"

# 出力:
# [main (root-commit) d9110b5] 買い物メモを作成
#  1 file changed, 1 insertion(+)
#  create mode 100644 memo.txt

-m の後ろがコミットメッセージです。d9110b5 の部分は記録ごとに違う値になります。

text5 lines
git status

# 出力:
# On branch main
# nothing to commit, working tree clean

working tree clean は「ワークツリーとリポジトリの記録に差がない」という意味です。3つのエリアがすべて同じ内容で揃った状態で、ここが作業の出発点になります。

ステージから降ろす#

記録したあとのファイルを変更して、ステージとの間を往復してみます。

text9 lines
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 で降ろします。

text11 lines
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 ── 変更をどう選び、どんな単位とメッセージで記録すると、あとから読める履歴になるのかを見ます。