Git はファイルをどこに置いているのか

AI に Git を任せても、いまの変更がどこまで届いたかは自分で確かめられます。読み終えると、add・commit・push・pull で何がどこへ動くのかが分かって、手元で止まっているのか GitHub に載っているのかを自分で見分けられます。

確かめられるのは、場所が 4 つしかなく、外にあるのはそのうち 1 つだけだからです。

私の場合は、外出先ではスマホから頼んで作業して、その結果を GitHub に上げておきます。帰宅後は PC で受け取るだけで、続きから始められる。GitHub そのものが何をしてくれるかはGitHub とは何かに書きました。

Git がファイルを置く 4 つの場所

Git は、ファイルを 4 つの場所に分けて持っています。そのうち 3 つは、作業しているフォルダの中にあります。 外にあるのは残りの 1 つ、GitHub だけです。

Git は GitHub 側を「リモート」、記録が積まれる場所を「ローカル」と呼びます。3 つとも手元にありますが、この名前が付くのは記録が積まれる場所だけです。積み重なった記録のことは、まとめて「履歴」と呼びます。

下に出てくる git add のような言葉は、AI が実行して、会話の中にも出てきます。自分で打たなくても、目にはします。押すと、その操作で動く矢印だけが伸びます。見てほしいのは、どこで止まってどこから先へ行くのかです。

作業ツリー いま編集しているファイル ステージ 次に記録する分 ローカル この PC に積まれた履歴 リモート GitHub 側の履歴 add
編集したファイルのうち、次に記録する分だけをステージに乗せる
作業ツリー いま編集しているファイル ステージ 次に記録する分 ローカル この PC に積まれた履歴 リモート GitHub 側の履歴 commit
ステージに乗っているものだけが履歴に 1 件として残る
作業ツリー いま編集しているファイル ステージ 次に記録する分 ローカル この PC に積まれた履歴 リモート GitHub 側の履歴 push
手元の履歴をリモートに送る。ここではじめて、ほかの場所から見える
作業ツリー いま編集しているファイル ステージ 次に記録する分 ローカル この PC に積まれた履歴 リモート GitHub 側の履歴 fetch
リモートの履歴を取ってくるだけ。作業ツリーは変わらない
作業ツリー いま編集しているファイル ステージ 次に記録する分 ローカル この PC に積まれた履歴 リモート GitHub 側の履歴 fetch merge
受け取って、いま編集しているファイルにも反映するところまで進む

作業ツリーで保存は上書きなので、前の状態は残りません。 Git が別に取っておくのは、「ここまで」と区切った時点だけです。

ステージがあるのは、何を記録するかを人が決めるためです。 たとえば AI に 5 ファイル直してもらって、3 つは採用、2 つはもう少し見たい——そのとき、採る分だけを乗せて記録できます。全部まとめて記録するしかないなら、この段は要りません。

記録するのと、外に出すのは別の操作

git commit で記録した先が、いったん手元なのには理由があります。 記録することと外に出すことを別の操作にしておくと、タイミングを別々に決められるからです。手元では何度でも区切っておいて、まとまったところでまとめて送る。だから commit と push が分かれています。

送っていないあいだ、その履歴は PC の中だけにあります。ほかの場所から見えるようになるのは、git push のあとです。

fetch は受け取るだけ、pull は編集中のファイルまで反映する

fetch で止められるのは、届いたものを見てから、手元に反映するか決めたいときです。受け取った履歴はローカルに積まれますが、自分のコミットもそこに残ったままなので、この時点では両方が並んでいます。

git pull は、そこで止まりません。この後半が merge です(受け取った履歴を、いま編集しているファイルに重ねる操作)。図で矢印が 2 本続くのはそのためです。

すんなり通るのは、手元に自分だけの変更が無いときです。GitHub 側だけが進んでいるなら、手元がそこへ追いつくだけで済みます(Git はこれを Fast-forward と表示します)。

手元でも別にコミットしていると、両方を合わせる記録が 1 つ増えます。 下は、手元で todo.md を足しているあいだに、AI が memo.md に説明を足してリモート側へ送っていた状態で git pull を打ったときの出力です(練習用に手元に作ったリモートなので、場所は伏せました)。

$ git pull
From <練習用のリモート>
   0f39f48..d802ba6  main       -> origin/main
Merge made by the 'ort' strategy.
 memo.md | 2 ++
 1 file changed, 2 insertions(+)

2 行目が受け取ったところ(fetch)、Merge made by からが編集中のファイルに重ねたところ(merge)です。図の 2 本の矢印が、そのまま 2 段に出ています。 触ったファイルが別々だったので、Git が自分で合わせて終わりました。

同じところを両方で書き換えていれば、ここで止まって人に聞きます。 どちらを残すかは、機械が決められないからです。

届いたかどうかは、自分で確かめられる

持ち帰りは 1 つです。どこまで届いたかは、2 つの見方で分かります。

送った側は、GitHub のページを開いて、そこに自分の変更が載っていれば push まで届いています。 載っていなければ、まだ PC の中です。

受け取った側は、pull が「追いつくだけ」で終わったかどうかです。止まったなら、手元にも別の記録があるということ。冒頭の「帰宅後は受け取るだけで続きから始められる」が成り立つのは、外出先で push しておいて、片方だけが進んでいる形にしてあるからです(Claude Code と GitHub をスマホで使った記録)。

毎回 GitHub を開いて確かめるより前に、そもそも何を黙って実行させるかを決めておけます。毎回同じ説明をしないための 2 つのファイルに、取り消せない操作にだけ確認を出す設定を書きました。

AI活用ガイドのトップへ

この章は役に立ちましたか?

読みたい記事をリクエストする