Git — 変更履歴を記録して、いつでも戻れる

中級の解説は準備中のため、中級の内容を表示しています。

概要 — まず全体をつかむ

初級ではGitを「セーブポイントを何度でも作れて、いつでも戻れる仕組み」と捉えました。中級では、その正体であるコミット・ブランチ・マージ・リモートを見ていきます。

詳細 — 1段階ずつ追う

これは何をする係?

1回の記録=コミットは、その時点のスナップショット(※1 作業場所を丸ごと写した1枚)です。差分だけでなく「その瞬間の全体像」を指し示し、各コミットは1つ前の親コミットを覚えています。

だから履歴はスナップショットの連なりになります。連なりをたどれば必ず過去の完全な状態に戻れる——これが「安全」の正体です。1点でも独立して残っているので、途中が壊れても後ろの記録は無傷です。

登場人物メモ:

  • ※1 スナップショット — その時点のファイル全体を写した記録の1枚
  • ※2 HEAD — 「いま自分が見ている/作業している位置」を指す目印
  • ※3 リモート — GitHub などの共有先。手元の履歴を送受信する相手

履歴を枝分かれさせる — ブランチとマージ

  • ブランチ — 履歴を枝分かれさせる。main(本流)を壊さず、feature などの枝で新機能を試せる
  • マージ — 枝を本流に統合する。枝の変更を取り込んで1つに合流させる

下の図は、mainの連なりから途中で feature が分かれ、最後にmainへマージ(合流)する流れです。

アニメーション『Gitの履歴グラフ(分岐とマージ)』を開く
コミットの連なり=履歴枝分かれ(ブランチ)して並行作業し、あとで合流(マージ)する初期変更A分岐元変更Bマージ試作1試作2mainfeatureHEAD● 1つの円=その時点の「スナップショット(丸ごとの記録)」。→ 矢印は「1つ前の親コミット」を指す。連なりをたどれば、いつでも過去の状態に戻れる。

枝を切るのが軽いのは、コミットが独立したスナップショットで、ブランチはその1点を指す名札にすぎないから。だから「試してダメなら枝ごと捨てる」が気軽にできます。

仕事の流れ

  1. 変更をステージに載せる(記録する範囲を選ぶ)
  2. コミットする(スナップショットを1枚作る)
  3. 手元の履歴をリモートへ push(共有先へ送る)
  4. 他の人の変更をpull(共有先から取り込む)
  5. 枝ができたらマージで本流へ統合する

下の図は、手元での記録(add→commit)から共有先とのやり取り(push→pull)までを1手ずつ追ったものです。

アニメーション『Gitの流れ(add→commit→push)』を開く
作業ツリーステージローカルリポジトリリモート
  • 作業ツリーいま編集している手元のファイル群。ここでの変更はまだ記録されていない
  • ステージ次のコミットに含める変更を並べる控えの場(index)
  • ローカルリポジトリ手元にある履歴の本体。コミット(スナップショット)が積まれていく
  • リモートGitHub などの共有先。仲間と履歴をやり取りする相手
「▶ 再生」で通しで見るか、「次へ」で1手ずつ進めてください。
0 / 5

みんなで使う — リモートとコンフリクト

  • リモート — GitHub 等の共有先。push で送り、pull で受け取る。手元にも全履歴があるので、共有先が落ちても作業は続く
  • プルリクエスト — 「この枝をmainに入れたい」というレビュー依頼の形(サービス側の機能)
  • コンフリクト — 同じ箇所を別々に変えた枝を統合すると衝突する。Gitはどちらを採るか決められないので、人が見て解消する

このコミット履歴の安定性が、変更のたびに自動でテスト・デプロイする自動化CI/CD など)の土台になります。「いつでも戻せる記録」があるからこそ、機械に任せて素早く回せます。

⚠️ うまくいかないとき

  • コンフリクト解消のミス — 衝突を雑に消すと、必要な変更まで捨ててしまう
  • 巨大なコミット — まとめすぎると、どの変更が原因か切り分けられない
  • push し忘れ/pull し忘れ — 手元と共有先がずれ、あとで衝突が増える
  • 秘密情報のコミット — パスワード等を記録すると履歴に残り続ける(消しても過去に残る)

土台のしくみが気になったらプログラムが動くまでや、実行環境を箱で運ぶDockerもあわせてどうぞ。

理解度チェック

そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。

1. Gitの「ブランチ」の説明として正しいのは?

2. コンフリクト(衝突)が起きるのはどんなとき?

3. Gitの1回のコミットが記録するものとして、本文の説明に最も近いのは?

4. Gitで枝を切る(ブランチ作成)のが軽いのはなぜ?

5. Gitで「リモート(共有先)が落ちても手元の作業は続けられる」のはなぜ?

6. 「この枝をmainに入れたい」というレビュー依頼の形を何と呼ぶ(GitHub等のサービス側の機能)?

7. 「いま自分が見ている・作業している位置」を指す目印を、英字4文字で何と呼ぶか答えてください。

8. 枝の変更を本流に取り込んで1つに合流させる操作を何と呼ぶか、カタカナまたは英語で答えてください。

Git — 変更履歴を記録して、いつでも戻れる | Kotowary