第0章 レッスン08

Gitを使う(add・commit・やり直し)

このレッスンでできるようになること: git status の結果を3つのブロックで読み分けられる。ファイルの4つの状態(未追跡・変更済み・ステージ済み・コミット済み)を区別できる。作業ディレクトリ → add → commit で記録し、間違えても取り消せる。 所要時間: 60〜80分

再開する人へ: ①ターミナルを開く → ②cd ~/fde-dojo(レッスン03で受け取った教材フォルダ)→ ③前回の続きから。うまくいかない・エラーが出たら、レッスン07で入れた doctor に「このエラーを診てください」と貼れば助けてくれます。

レッスン03で、Git の全体像をイメージでつかみ、Git をインストールして、この教材を clone で手元に受け取りました。今回は、その手元の教材フォルダの中で、実際に Git を使って記録します。やることは3つです。

  1. いまどうなっているかを git status で読む
  2. 変更を add → commit で記録する
  3. 間違えたときに、安全に取り消す

すべて普通のターミナルで打ちます。Claude Code に頼むこともできますが、今回は仕組みを体で覚えるため、自分の手で動かします。

おさらいとゴール(受け取ったのは「コピー」)

大事な前提を1つ、先に共有します。あなたが clone で受け取ったこの教材リポジトリは、あなた専用のコピーです。ここであなたが刻むコミット(記録)は、あなたのパソコンの中だけに残ります。共有の本家に送る(push する)権限はあなたには無いので、もし push を試すと Permission denied(拒否されました)と返ってきます。これは故障ではなく、正常な反応です。手元で好きなだけ練習して大丈夫です。共有へ送るときに必要になる「認証」という関門は、第3章で体験します。

ステップ1: git status を読む

まず、fde-dojo の中にいることを確認して、今の状態を見ます。

cd ~/fde-dojo
git status

git status は「いま、どうなっている?」を見るだけの、何度打っても安全なコマンドです。結果は、次の図のようにいくつかのブロックに分かれて出ます。

git status の結果を3つのブロック(コミットに含める分・まだ add していない分・未追跡のファイル)で注釈し、useで始まる案内行を強調した図

  • 見出し行(Changes to be committed: など)が、そのブロックの意味です。
  • そのすぐ下にある (use "git ...") の行に注目してください。ここは、Git が「どう戻すか・どう進めるか」を自分で教えてくれる案内です。取り消しのコマンドも、たいていここに書かれています。慣れないうちは、この行を読むだけで次の一手が分かります。

いまの fde-dojo では、レッスン03で作った workspace/ch0/setup-notes.md が **Untracked files(まだ追跡していない)**として出ているはずです(他のレッスンで作ったファイルも一緒に出るかもしれません)。もし setup-notes.md が見当たらない場合は、先に用意します。

mkdir -p workspace/ch0

そのうえで、エディタで workspace/ch0/setup-notes.md を開き、1行でも書いて保存してから、もう一度 git status を打ってください(開き方はレッスン03のステップ5と同じです)。

ステップ2: ファイルの4つの状態

git status の各ブロックは、ファイルが今どの「状態」にあるかを表しています。状態は次の4つです。ここは丸暗記ではなく、「この4つを行き来しているんだな」というイメージで十分です。

状態どういう状態かgit status での見え方
untracked(未追跡)新しく作った、Git がまだ存在を知らないファイルUntracked files
modified(変更済み)追跡中のファイルを変更したが、まだ add していないChanges not staged for commit
staged(ステージ済み)git add して、次のコミットに含める状態にしたChanges to be committed
committed(コミット済み)git commit して履歴に刻まれた状態どのブロックにも出ない(nothing to commit

前のレッスンで見た「作業ディレクトリ → ステージ → リポジトリ」という場所の流れと、この状態は裏表の関係です。add で「未追跡・変更済み」から「ステージ済み」へ、commit で「ステージ済み」から「コミット済み」へ動きます。次のステップで、実際にこの移り変わりを目で追います。

ステップ3: 1周目 ― 新しいファイルを記録する(add → commit)

さきほど Untracked files に出ていた setup-notes.md を、実際に記録します。

まず、これから記録する分だけをステージに載せます。

git add workspace/ch0/setup-notes.md

もう一度 git status を打つと、同じファイルが **Changes to be committed(コミットに含める分)**へ移っています。未追跡から、ステージ済みへ動いた、ということです。

では、記録(コミット)します。

git commit -m "ch0-06: 第0章のsetup-notesを記録"

-m "..." は、その記録に付けるメモ(コミットメッセージ)です。メッセージの付け方は、次の3つを意識すれば十分です。

  • 1つのコミットには、1つの意味のまとまりを入れる(あれもこれも詰め込まない)
  • **1行目は短く、「何をしたか」**を書く
  • 日本語で構いません

達成状態: 1 file changed のような要約が出て、もう一度 git status を打つと、setup-notes.md が消えていること(コミット済みになったので、もう status には出ません)。これで、あなたの手による記録が1つ、履歴に刻まれました。

-m を付け忘れて、見慣れない画面が開いたら: git commit-m なしで打つと、メッセージ入力用のエディタが開きます。レッスン03で core.editor を nano(macOS)や notepad(Windows)に設定していれば、1行書いて保存して閉じれば進みます。もし黒い画面に文字が並ぶ Vim が開いてしまったら、あわてず Esc を押し、:q! と打って Enter。いったん中断できるので、-m "..." を付けて打ち直してください。

ステップ4: 2周目 ― 既存のファイルを変更して記録する

1周目は「新しいファイル(未追跡)」でした。2周目は「すでに記録したファイルを変更する(変更済み)」を体験します。ここが、実務でいちばん多いパターンです。

さきほどコミットした setup-notes.md を、エディタでもう一度開いて、このレッスンの気づきを1行書き足して保存してください(例: 06: add→commitの2周ができた。statusの3ブロックが読めた)。これが、第0章の通し成果物への追記にもなります。

書き足したら、状態を見ます。

git status
git diff

git status では setup-notes.md が **Changes not staged for commit(変更済み)**として出ます。git diff には、直前のコミットからの変更が +(足した行)で表示されます(長ければ q で抜けます)。

ここで、記録するためにステージへ載せます。

git add workspace/ch0/setup-notes.md

ここで1つ予測してください。 いま add した直後に、もう一度 git diff を打つと、どうなるでしょうか。

  • A: さきほど書き足した行が、また + で表示される
  • B: 何も表示されない(空になる)
答え合わせ(A か B を決めてから開いてください)

正解は B(何も表示されない)です。git diff は「まだステージに載っていない変更」を見せるコマンドです。add でステージに載せた瞬間、git diff から見た「未ステージの変更」は無くなります。では、ステージに載せた内容を見たいときは? そのときは git diff --staged を使います。

git diff --staged

これで、いま add 済みの変更(次のコミットに入る分)が確認できます。「git diff は未ステージ、git diff --staged はステージ済み」と覚えておくと、混乱しません。

予測が当たったか外れたかを、いま書き足した setup-notes.md の続きに、もう1行足しておいてください(例: 予測はA/Bだった。実際はBだった)。書けたら、記録します。

git add workspace/ch0/setup-notes.md
git commit -m "ch0-06: 気づきと予測の結果を追記"

git log --oneline を打つと、あなたのコミットが2件(1周目と2周目)並んでいるはずです(q で抜けます)。

ステップ5: 間違えたときの取り消し(3つの場面)

Git のありがたみは「間違えても戻せる」ことです。よくある3場面の戻し方を、名前だけでも知っておくと安心です。どれも、実は git status(use "git ...") の行が教えてくれる内容です。

場面A: git add したのを取り消したい(ステージから下ろす)

「まだコミットしていないけど、add する対象を間違えた」ときです。編集内容は消さずに、ステージから下ろすだけです。

git restore --staged workspace/ch0/setup-notes.md

これで「ステージ済み」から「変更済み」に戻ります。あなたが書いた中身は消えません

場面B: ファイルへの編集そのものを、直前のコミットの状態に捨てたい

「書き換えたけど、やっぱり全部なかったことにして、前のコミットの状態に戻したい」ときです。

git restore workspace/ch0/setup-notes.md

これは、まだコミットしていない編集を捨てるコマンドです。捨てた編集は元に戻せません。 打つ前に、必ず git statusgit diff で「何が消えるのか」を確認してください。なお、すでにコミット済みの内容までは消えません。あくまで「直前のコミット以降に書いた、まだ記録していない分」だけが対象です。だからこそ、こまめにコミットしておくと安全なのです。

場面C: 直前のコミットメッセージを書き間違えた

「コミットは正しいけれど、メッセージを打ち間違えた」ときです。まだ push していない、手元だけのコミットなら、メッセージを付け直せます。

git commit --amend -m "ch0-06: 正しいメッセージ"

これら以外の「もっと前のコミットに戻す」「コミットを取り消す」といった操作(git resetgit revert など)は、少し踏み込んだ内容なので、第6章でまとめて手を動かします。今日は、この3場面が「戻せる」と知っていれば十分です。

ステップ6: 履歴を見る

最後に、これまでの記録を眺めます。

git log

達成状態: コミットごとに「誰が・いつ・どんなメッセージで」記録したかと、commit に続く長い英数字(ハッシュ)が並んで表示されること(q で抜けます)。ハッシュは、1つ1つのコミットに付く通し番号のようなものです。

特定のコミットの中身を見たいときは、ハッシュの先頭7文字で指定できます。

git show <ハッシュの先頭7文字>

<ハッシュの先頭7文字> は、git log に出た英数字の頭7文字に置き換えます。山カッコは打ちません。レッスン03の <> の読み方と同じです。)

達成状態: そのコミット1件のメッセージと、変更内容(+-)が表示されること。

仕組みの解剖 — 「状態」と「場所」は裏表

今日の操作を、2つの見方で振り返ります。

  • 場所で見る: 作業ディレクトリ →(git add)→ ステージ →(git commit)→ リポジトリ(.git の履歴)。決まった向きに流れます。
  • 状態で見る: untracked / modified →(git add)→ staged →(git commit)→ committed。

この2つは、同じことを別の角度から言っているだけです。git status は、いまどのファイルがどの状態(=どの場所)にいるかの一覧表だと考えると、迷いません。そして Git は、次にどう進めるか・どう戻すかを、(use "git ...") の行でその場で教えてくれます。困ったら、まずその行を読む。これが、Git とうまく付き合うコツです。

なお、「コミットが .git の中で実際にどんな形で保管されているのか(スナップショットの正体)」という、もう一段深いところは、第1章でじっくり解剖します。今日は「状態と場所を、status で読み分けられる」ところまでで十分です。

理解ゲート

レッスン06で Claude Code を入れたので、今回は AI の先生に採点してもらえます。Claude Code を起動して、こう打ってください。

gatekeeperスキルで、第0章レッスン08の理解ゲートをお願いします

聞かれるのは、おおむね次の2つです(自分の言葉で答えられればOK。暗記ではありません)。

  1. (a) この教材フォルダ(fde-dojo)のどこに何があるか、そして今日どのファイルを記録したかを、自分の言葉で説明してください
  2. (b) git add から git commit までの流れを、図に描いて顧客に説明するつもりで話してください

うまくスキルが動かない場合は、次のセルフチェックで自己採点してください。

Q1. `git status` の3つのブロックは、それぞれ何を表す?

例: Changes to be committed は add 済みで次のコミットに入る分です。Changes not staged for commit は変更したがまだ add していない分です。Untracked files はまだ Git が追跡していない新しいファイルです。

Q2. `git restore --staged ` と `git restore ` は、何が違う?

例:「--staged は、add をやめてステージから下ろすだけで、書いた中身は消えない。--staged なしは、まだコミットしていない編集そのものを捨てて、直前のコミットの状態に戻す(戻せないので、先に status と diff で確認する)」。

Q3. あなたのコミットを push できないのは、なぜ?

例:「この教材リポジトリは受け取り専用のコピーで、共有の本家に送る権限が無いから。Permission denied は正常な反応。認証をともなう push は第3章で扱う」。

セーブポイント

  • git status を、3つのブロックで読み分けられる
  • ファイルの4状態(未追跡・変更済み・ステージ済み・コミット済み)を区別できる
  • 1周目(新しいファイル)を add → commit で記録できた
  • 2周目(既存ファイルの変更)を記録し、git diffgit diff --staged の違いが分かった
  • 取り消しの3場面(add取り消し・編集を捨てる・メッセージ訂正)を知っている
  • git log で履歴を、git show <7文字> で1コミットの中身を見られた
  • push できない理由(受け取り専用のコピー)を説明できる

今日はここで区切ってOKです。再開するときは、ターミナルを開いて cd ~/fde-dojo から始めてください。

よくある詰まり

症状原因と対処
git commitPlease tell me who you are と出るレッスン03の git config(名乗りの設定)が済んでいません。名前とメールを登録してから、もう一度コミットしてください
(Windows)warning: LF will be replaced by CRLF と出るこれは警告であって失敗ではありません。改行コードを Windows 向けに自動調整しているだけで、コミットは進んでいます。そのまま続けて大丈夫です
(macOS).DS_StoreUntracked files に出てくるFinder が作る管理用ファイルです。今は無視して構いません(記録しない)。こうしたファイルを最初から一覧に出さない「除外設定」は、第2章で扱います
git commit-m を付け忘れ、見慣れない画面が開いたレッスン03で設定したエディタなら、書いて保存して閉じれば進みます。Vim が開いたら Esc:q!Enter で中断し、-m "..." を付けて打ち直してください
git push を試したら Permission denied で拒否された正常です。この教材は受け取り専用のコピーで、本家へ送る権限はありません。手元のコミットはそのまま残っています
ホームなど fde-dojo の外で Git のコマンドが fatal: not a git repository になるGit が効くのは .git のある fde-dojo の中だけです。cd ~/fde-dojo で戻ってからやり直してください
教材の更新を取り込もうとしたら、自分のコミットとぶつかった旨のメッセージが出たあわてず、そのメッセージ全文を doctor に貼って相談してください。安全な進め方を案内します

次は レッスン09 Node.jsを入れる へ。第4章や第5章でアプリを動かすための土台を用意します。

最終確認日: 2026-07-24