この章で学ぶこと
推定読了時間: 25-35分 | 難易度: ★☆☆☆☆
本書を手に取っていただき、ありがとうございます。
ネットで検索すれば、Gitの情報はいくらでも出てきます。それなのに、なぜわざわざ本を買うのか——そう思われる方も多いのではないでしょうか。
もしかすると、「Git」という言葉を初めて聞いて気になったから、という方もいらっしゃるかもしれません。でも大半の方は、一度ネットの情報を頼りにGitを学ぼうとして、挫折した経験があるのではないでしょうか。
実は筆者もGit挫折経験者です。それも2回。
最初は「なんか難しそうだし、そもそも必要性がわからない」と感じて投げ出しました。その後、本格的な開発業務に携わるようになり、必要に迫られてネットの情報を頼りに再挑戦。しかし、またしても挫折。2回の挫折を経験しています。
だからこそ、どこでつまずくのか、何がわかりにくいのか、身をもって知っています。そして不思議なもので、一度コツをつかむと「あれ、意外とシンプルじゃん」と拍子抜けするくらいスッと理解できるようになります。
挫折の原因は大きく2つあると考えています。
1つ目は、黒い画面への抵抗感です。コマンドを打ち込む画面は視覚的にわかりづらく、何が起きているのか見えません。コマンドを暗記しようとして、覚えられなくて嫌になる。
2つ目は、ネット情報の断片性です。ある程度知っている人でないと、欲しい情報にたどり着けません。そもそもどんなコマンドがあるか知らないのだから、調べようがないのです。「そんなこともできるの!?」と後から驚かされることばかりでした。
今やGitはエンジニアにとっての常識です。開発現場でGitをスラスラ使えるエンジニアは、それだけでプロっぽく見えます。AI時代になってもこの状況はしばらく続くでしょう。むしろ、AIと協働する時代だからこそ、Gitの重要性は増しています。
本書は、この2つの挫折ポイントを乗り越えられるように設計しました。黒い画面で何が起きているのか、多くの図解で視覚的に「見える化」しています。そして、断片的な情報ではなく、Gitの全体像から個々のコマンドまで体系的に学べる構成にしました。コマンドを暗記するのではなく、「なぜそうするのか」を理解することで、自然と使えるようになります。
本書があなたのエンジニアとしての第一歩を踏み出す手助けになれたら、筆者としてこれほどうれしいことはありません。
本書「Why Git?」は2巻構成で、基礎から実践まで段階的に学べます。
Vol. I:基礎編(本書)
ローカル環境でのGit操作を基礎から学びます。Gitを初めて使う方、コマンドラインに不慣れな方でも、丁寧な解説で着実にスキルを身につけられます。
| 章 | 内容 |
|---|---|
| 第1章 | AI時代になぜGitが必要なのか |
| 第2章 | Gitの基本概念を理解しよう |
| 第3章 | 開発環境を整えよう |
| 第4章 | ターミナルを使ってみよう |
| 第5章 | Gitコマンド入門 |
| 第6章 | ローカルでGitを実践しよう |
| 第7章 | AIエージェントとGitを連携させよう |
本書を読み終えると、一人でGitを使った開発ができるようになります。
Vol. II:マスター編
GitHubとの連携、コンフリクト解消、AIツールとの連携、チーム開発、CI/CDの実践的なワークフローを学びます。
| 章 | 内容 |
|---|---|
| 第1章 | Vol. II入門とGitHubのセットアップ |
| 第2章 | リモートリポジトリの基本操作 |
| 第3章 | 開発フローのルール |
| 第4章 | コンフリクト解消マスター |
| 第5章 | AIツールとGitを連携させよう |
| 第6章 | チーム開発で活躍しよう |
| 第7章 | GitHub Actionsで自動化しよう |
| 第8章 | トラブルシューティングと応用テクニック |
| 第9章 | さらなる一歩 – worktreeとGit LFS |
Vol. IIを読み終えると、チーム開発で活躍できるGitスキルが身につきます。
本書は第1章から順番に読むことをおすすめします。各章は前の章の知識を前提としているため、途中から読むと理解しづらい箇所があるかもしれません。
ただし、すでにGitの基本を知っている方は、必要な章から読み始めても構いません。各章の冒頭に「この章で学ぶこと」がまとめてあるので、参考にしてください。
各セクションの見出しには「もくじへ戻る」ボタンがあります。復習したいときや特定のコマンドを確認したいときは、目次に素早く戻って開きたいページを選ぶことができます。
プログラミングの世界は大きく変わりました。GitHub Copilot、Claude Code、ChatGPTといった定番ツールに加え、Cursor、Devin、Windsurf、Cline、そしてGoogleのAntigravityなど、新しいAI開発ツールが次々と登場しています。あなたがこの本を手に取ったということは、すでにこれらのツールを使っているか、これから使おうとしているのではないでしょうか。
AIツールの登場により、開発スタイルは根本から変わりつつあります。
従来、プログラマーは「コードを書く」ことに多くの時間を費やしていました。しかし今、プログラマーの役割は「AIに何を作らせるか指示する」方向へシフトしています。「プロンプトエンジニアリング」という言葉が示すように、AIへの指示の仕方そのものが新しいスキルになりました。
この変化により、プログラミングの敷居は大きく下がりました。AIの助けを借りれば、経験の浅い人でもアプリを作れる時代です。しかし同時に、新たな課題も生まれています。
AIの登場で、これまでプログラミングに触れたことのない方でもアプリを作れる時代になりました。マーケター、デザイナー、経営者——職種を問わず「AIと一緒に開発する」という選択肢が広がっています。
しかし、AIで開発を始めた非エンジニアの多くが、ある段階で壁にぶつかります。
コードは書ける。動くものは作れる。でも、プロジェクトが大きくなるにつれて「なんだかうまくいかない」状況が増えていく。ファイルがぐちゃぐちゃになる。昨日動いていたものが今日は動かない。チームで作業しようとすると混乱する。
この壁の正体は、エンジニアが当たり前に使っている「暗黙のルール」を知らないことです。
長年の開発現場で培われてきた定石、業界標準のツール、チーム開発のお作法——これらはエンジニア教育の中で自然と身につくものですが、AI経由で開発を始めた方には触れる機会がありません。
その代表格がGitです。
エンジニアにとってGitは空気のような存在。使えて当たり前のツールです。しかし、「Git」という言葉を本書で初めて聞いたという方も少なくないのではないでしょうか。
もしあなたがその一人なら、本書を手に取ったのは幸運です。Gitは単なるツールではなく、プロの開発現場に入るための「入場券」のようなもの。これを知っているかどうかで、この先の開発体験は大きく変わります。
本書では、Gitの基礎はもちろん、なぜそうするのかという背景も丁寧にお伝えします。将来エンジニアとして活躍したいと思ったとき、すでに業界標準の開発手法が身についている——そんな状態を目指しましょう。
では、Gitとは一体何でしょうか。
一言で言えば、ファイルの変更履歴を記録・管理するツールです。
普段、あなたはファイルを保存するとき、上書き保存をしていると思います。でも「昨日の状態に戻したい」と思ったら? 上書きしてしまった後では、もう戻せません。
Gitを使うと、ファイルの「スナップショット」を好きなタイミングで保存できます。いつでも過去の状態に戻れるし、「いつ、誰が、何を、なぜ変更したか」も記録に残ります。
ゲームのセーブポイントをイメージしてください。ボス戦の前にセーブしておけば、負けても何度でもやり直せます。Gitはプログラミングにおけるセーブポイントのようなものです。
「ファイルの履歴管理なら、Dropboxや Google ドライブでもできるのでは?」と思うかもしれません。
答えはシンプルです。AIの出力は毎回異なり、一発で完璧なコードが生成されることはほとんどありません。AIとの開発は「試行錯誤の連続」なのです。
たとえば、こんな場面を想像してください。AIに「ログイン機能を作って」と依頼したとします。
この繰り返しがAI開発の現実です。そして、ここで問題が起きます。「2回目の時点では動いていたのに…あの状態に戻りたい」と思っても、どうやって戻ればいいのでしょうか?
Gitを使っていれば、各段階を「コミット」として記録できます。「2回目の状態に戻りたい」と思えば、コマンド一つで復元できます。迷走する前の「動いていた状態」にすぐ戻せるのです。
つまり、GitはAIとの試行錯誤を安全に行うためのセーフティネットなのです。AIが強力になればなるほど、試行錯誤の回数も増えます。だからこそ、Gitの価値は高まっているのです。
AI時代にGitが重要な3つの理由
AIが強力になればなるほど、その出力を管理するGitの重要性は高まります。
AIは強力ですが、適切な管理なしに使うと思わぬ落とし穴があります。ここでは、AI開発で特に注意すべき3つのリスクを見ていきましょう。
AIに「ボタンの色を変えて」とお願いしたら、関係ないファイルまで書き換えられていた——そんな経験はありませんか?
AIは指示した箇所だけでなく、「ついでに」他の部分も変更してしまうことがあります。親切心からの改善かもしれませんが、意図しない変更は思わぬバグの原因になります。2025年には、AIがデータベースを誤って削除するという事故も報告されています。
Gitがあれば:
git diffで「何が変わったか」を一目で確認できます。意図しない変更があれば、その部分だけ元に戻すことも簡単です。
「動いた!」と喜んでデプロイしたコードに、実はセキュリティの穴が空いていた——これは珍しい話ではありません。
AI生成コードの約半数がセキュリティテストで問題を指摘されるというデータもあります。AIは「今、動くコード」を書くのは得意ですが、「安全なコード」や「後でメンテナンスしやすいコード」という観点は弱いのです。
Gitがあれば: コードレビューの際に変更履歴を追えます。「いつ、どんな変更が入ったか」がわかるので、問題の原因特定も容易です。
「さっきは動いていたのに…」——AIとの開発でよく聞く言葉です。
同じプロンプトを投げても、AIは毎回少し違うコードを生成します。「あのとき動いていたバージョン」を再現しようとしても、二度と同じコードは生成されません。記憶を頼りに手動で戻そうとすると、かえって状況を悪化させることも。
Gitがあれば:
動いていた状態をコミットとして保存できます。迷走してもgit checkout一発で、確実に動いていた状態に戻れます。
AI生成コードを安全に扱うための3つの習慣
AIは強力ですが、完璧ではありません。AI生成コードには以下の対策が有効です。
git diffで「何が変わったか」をチェックしてから採用するこのサイクルを習慣にすれば、AIとの開発で迷走しても、いつでも「動いていた状態」に戻れます。
app_最終版.js、app_最終版2.js、app_本当の最終版.js——こんなファイル名を見たことはありませんか?
バージョン管理を使わないと、こうなります。どれが最新かわからない。何が違うのかわからない。いつ変更したのかわからない。なぜ変更したのかは、もう誰も覚えていない。
チーム開発では、この混乱が人数分だけ掛け算されます。「田中さんの最終版」と「鈴木さんが直したやつ」、どっちが正しいのか。メールやチャットで確認する時間が、コードを書く時間を圧迫していきます。
AI開発で特に厄介なのが、「さっきまで動いていたのに」という状況です。
AIに修正を頼む → 動かなくなる → 別の修正を頼む → さらに悪化する。この繰り返しで、気づけば最初の状態から遠く離れてしまいます。
「動いていた状態に戻りたい」と思っても、どの時点が「動いていた状態」なのか、ファイル名では特定できません。記憶を頼りに手動で戻そうとすると、別のバグを埋め込んでしまうことも。
こうした問題を解決するのが、次節で紹介するGitとAIの組み合わせです。
ここまで、AIコード生成のリスクとバージョン管理の重要性を見てきました。では、AIとGitはどう組み合わせればいいのでしょうか。
AIは「攻め」の担当。 コードを高速に生成し、次々と提案を出してきます。「こう書いたらどう?」「この機能も追加しようか?」と、積極的に前に進もうとします。
Gitは「守り」の担当。 AIが生成したコードを確実に記録し、問題が起きたら以前の状態に戻せるようにします。「ここまでは大丈夫だった」という安全な地点を守り続けます。
この役割分担があるからこそ、AIの提案を気軽に試せるのです。失敗しても、Gitが守っている「安全な地点」に戻ればいい。攻めと守り、両方があって初めて安心して開発を進められます。
具体的には、こんな流れで開発を進めます。
この繰り返しです。AIが「攻め」て、うまくいったらGitで「守り」を固める。うまくいかなかったら、Gitで守っていた地点まで戻って再挑戦。
このワークフローを身につければ、AIとの開発で迷走することはなくなります。本書では、この流れを実践的に学んでいきます。
本書(Vol. I:基礎編)は、Gitを基礎から学ぶための実践的ガイドです。全6章を通じて、「Gitとは何か」という概念からローカル環境での実践まで、段階的に学習していきます。
第1章(本章)
AI時代になぜGitが必要なのかを理解します。AIツールの爆発的普及、実際の失敗事例、バージョン管理の重要性、そしてGitとAIの相互補完関係を学びます。
第2章「Gitの基本概念を理解しよう」
リポジトリ、コミット、ブランチといったGit特有の概念を、初心者にもわかりやすく解説します。「ローカルリポジトリとリモートリポジトリの違い」「コミットは追加であって上書きではない」といった、初心者が躓きやすいポイントを重点的に説明します。
第3章「開発環境を整えよう」
Git、VS Codeのインストールと設定を行います。無料で使えるツールを中心に、頻出するトラブルシューティングまで、実務で必要な環境構築をカバーします。
第4章「ターミナルを使ってみよう」
Gitを使うために必要なターミナル(コマンドライン)の基礎を学びます。ターミナルとは何か、GUIとCLIの違い、基本的なコマンド操作(ls、cd、mkdir、pwd)など、黒い画面への苦手意識を克服し、自信を持ってコマンドを入力できるようになります。
第5章「Gitコマンド入門」
実務で使う主要Gitコマンドを体系的に解説します。init、status、add、commit、log、diff、branch、switch、merge、restoreなど、各コマンドの用途、オプション、実例を豊富に掲載。今すぐ覚える必要はありません。使いながら慣れていきましょう。
第6章「ローカルでGitを実践しよう」
実際の開発フローに沿って、コマンドを組み合わせた実践演習を行います。リポジトリの作成から、新機能開発、バグ修正、複数ブランチの並行開発といった実務シナリオを通じて、第5章で学んだコマンドを実践で使いこなせるようになります。
本書を学習することで、あなたは以下のスキルを習得できます:
本書を読み終えたら、ぜひ Vol. II:マスター編にも挑戦してください。GitHubとの連携、AIツールとの連携、チーム開発の実践的なワークフローを学べます。
学習時間の目安は2〜3週間です。もちろん、あなたの経験や学習ペースによって前後しますが、本書の構成は「確実に一歩ずつ前進できる」ように設計されています。
AI時代の開発は、かつてないほど可能性に満ちています。AIツールの力を借りれば、初心者でも驚くほど高品質なコードを書けるようになります。しかし、その力を最大限に引き出すには、確実な「土台」が必要です。それがGitです。
本書を通じて、あなたは「失敗を恐れない」開発スタイルを身につけることができます。AIの提案を積極的に試し、うまくいかなければ元に戻し、成功したら次のステップへ進む。そんなダイナミックな開発サイクルを、自信を持って回せるようになります。
次章からは、具体的なGitの学習に入っていきます。まずは第2章で、Gitの基本概念をしっかりと理解しましょう。
Gitで挫折しないための3つの心構え
「Gitは難しい」「何度も挫折した」という声をよく聞きます。実は、Gitで挫折する人には共通のパターンがあります。以下の3つを意識するだけで、学習の成功率は劇的に上がります。
1. 完璧を目指さない
すべてのコマンドを覚える必要はありません。実務では10個程度のコマンドで90%のケースをカバーできます。本書では「本当に使うコマンド」だけを厳選して解説しています。残りは必要になったときに学べば十分です。
2. 失敗を恐れない
「間違ってコミットしたらどうしよう」「データが消えたら…」という不安から、手が止まってしまう人が多くいます。しかし、Gitは「失敗しても元に戻せる」ように設計されています。本書では「失敗したときの対処法」も丁寧に解説します。安心して実験してください。
3. GUIツールも活用する
「黒い画面(ターミナル)が苦手」という方も多いでしょう。VS CodeやGitHub Desktopなどのグラフィカルツールを使えば、視覚的に操作できます。最初はGUIで慣れて、徐々にコマンドに挑戦する方法でも全く問題ありません。本書では両方のアプローチを解説しています。
AI時代は、Gitがより「優しく」なる
Claude CodeやAiderといったAIツールは、Gitコマンドの生成も支援してくれます。「このファイルを前の状態に戻したい」と自然言語で伝えれば、AIが適切なコマンドを提案してくれます。AI時代のGit学習は、一昔前より格段に簡単になっているのです。
挫折は「やり方」の問題であって、「あなたの能力」の問題ではありません。本書は、挫折しないための道筋を丁寧に示します。一緒に、一歩ずつ進んでいきましょう。
本書では、多くのコマンド例が登場します。「コマンド」という言葉を聞いて、うっ…と身構えてしまう方もいるかもしれません。大丈夫です。
今すぐ覚える必要はありません。 本書では、コマンドが登場するたびに一つ一つ丁寧に説明します。「覚える」のではなく「使いながら慣れる」のが一番の近道です。
また、後述しますが、GitはVS Codeなどのエディタからボタン操作でも使えます。ただし、コマンドでしかできない操作も多いため、本書ではコマンドを中心に解説します。最初は戸惑うかもしれませんが、繰り返し使っているうちに自然と手が動くようになります。
なお、本書で登場するコマンドにはGitコマンドとBashコマンドの2種類があります。Gitコマンドは
git
で始まるコマンド、Bashコマンドはそれ以外のターミナル操作コマンドです。本書の本題はGitですのでBashコマンドの詳細は割愛しますが、よく使うものは第4章で紹介します。
このセクションでは、本書で使われる表記ルールを解説します。ここを理解しておけば、後の章でスムーズに学習を進められます。
ターミナル(またはコンソール、コマンドライン)は、文字を入力してコンピュータに指示を出すツールです。OSによって標準のターミナルが異なります。
| OS | 標準ターミナル | プロンプト記号 |
|---|---|---|
| Mac | ターミナル.app(zsh) | % |
| Windows | PowerShell / コマンドプロンプト | > |
| Linux | 各種ターミナル(bash) | $ |
Windowsユーザーへの重要なお知らせ: 本書では、Windowsでも「Git Bash」を使用することを前提としています。Git BashはGitをインストールすると一緒にインストールされるbashシェルで、MacやLinuxと同じコマンドが使えます。
PowerShellやコマンドプロンプトでは、一部のコマンド(ls、catなど)が動作しなかったり、出力形式が異なったりします。本書の内容をそのまま試すには、Git
Bashを使用してください。
本書では、ターミナルでの操作を以下のような黒い背景のボックスで表示します。
$ git status
On branch main
nothing to commit, working tree clean
ターミナル表示で重要なのが、行頭のプロンプト記号です。お使いの環境によって表示が異なります。
| 環境 | 実際の表示例 |
|---|---|
| Git Bash / Linux | $ |
| Mac (zsh) | % |
| Windows PowerShell | PS C:\> |
| Windows コマンドプロンプト | C:\> |
本書では $ で統一しています。
お使いの環境で % や >
が表示されていても、$
の後に書かれているコマンドをそのまま入力してください。
$ git status
On branch main
$ がある行:
あなたが入力するコマンド($ 自体は入力しない)
$ がない行:
コンピュータからの出力(結果)
つまり上の例では、git status
と入力すると、On branch main という結果が返ってきます。
本書のコマンド出力は英語表示を基準にしています。 お使いの環境が日本語設定の場合、出力メッセージが日本語で表示されることがあります。
# 英語環境(本書の表示)
$ git status
On branch main
nothing to commit, working tree clean
# 日本語環境(お使いの環境)
$ git status
ブランチ main
コミットするものがありません、作業ツリーはきれいです
どちらでも動作に違いはありません。本書の英語メッセージと異なる表示でも、同じ意味であれば問題なく進められます。
#)の意味コード内の #
は「コメント」の始まりを示す記号です。#
からその行の終わりまでがコメントとして扱われ、コンピュータには無視されます。つまり、入力する必要はありません。
# この行は全体がコメント(入力不要)
$ git add index.html # ←この部分だけがコメント
#
があるので、行全体がコメントgit add index.html
がコマンド、# 以降の説明文はコメント上の例で実際に入力するのは git add index.html
の部分だけです。
本書で登場するコマンドは、大きく2種類に分けられます。
git
で始まるコマンドはすべてGitコマンドです。バージョン管理の操作を行います。
$ git init # Gitリポジトリを初期化
$ git add . # ファイルをステージング
$ git commit -m "メッセージ" # コミットを作成
$ git push # リモートに送信
$ git pull # リモートから取得
git
で始まらないコマンドは、一般的なシェルコマンドです。ファイル操作やシステム操作を行います。
$ ls # ファイル一覧を表示
$ cd my-project # ディレクトリを移動
$ cat index.html # ファイルの内容を表示
$ mkdir new-folder # 新しいフォルダを作成これらはGitとは直接関係ありませんが、開発作業では頻繁に使います。本書でも状況確認のために登場することがあります。
コマンドには「オプション」を付けて動作を変えることができます。
$ git log --oneline # 履歴を1行ずつ表示
$ git commit -m "メッセージ" # コミットメッセージを指定
$ ls -la # 隠しファイルも詳細表示
ハイフン1つ(-): 短いオプション(例:
-m, -a)
ハイフン2つ(--): 長いオプション(例:
--oneline, --all)
短いオプションは1文字、長いオプションは単語で指定します。同じ意味のオプションが短い形式と長い形式の両方で用意されていることもあります(例:
-m と --message は同じ意味)。
本書では、実際の値に置き換える部分を <>
で囲んで示します。
$ git commit -m "<message>"
$ git switch <branch-name>
$ git clone <repository-url>
上の例では、<message>
の部分を実際のメッセージ(例:
"Initial commit")に置き換えて実行します。<>
自体は入力しません。
コマンドが長い場合、\(バックスラッシュ)で改行することがあります。
$ git log --oneline \
--graph \
--all
これは実際には1つのコマンドです。\
は「次の行に続く」という意味で、すべてを1行で入力しても同じ結果になります。
出力が長い場合、... で省略することがあります。
$ git log
commit a1b2c3d4e5f6a7b8...
Author: Your Name <email@example.com>
Date: Mon Jan 15 10:00:00 2025 +0900
Initial commit
...
| 表記 | 意味 |
|---|---|
$ |
ユーザーが入力するコマンド($ は入力しない) |
# |
コメント(説明用、入力不要) |
<値> |
実際の値に置き換える部分 |
-x |
短いオプション |
--option |
長いオプション |
\ |
コマンドの継続(改行) |
... |
出力の省略 |
コマンドに慣れるコツ
最初はコマンドを「暗記」しようとしないでください。最初は時間がかかっても、面倒でも、自分の手でコマンドを打つことをおすすめします。コピー&ペーストでは指が覚えません。
git status、git add、git commit…何度も手で打っているうちに、考えなくても指が動くようになります。タイピング練習と同じです。
慣れてきたら、Vol. IIで紹介するClaude Codeのようなツールを活用するのも良いでしょう。「このファイルをコミットしたい」と伝えるだけで、適切なコマンドを提案してくれます。ただし、基本を身につけてからの方が、AIの提案も理解しやすくなります。
前のセクションで「WindowsユーザーはGit Bashを使いましょう」とお伝えしました。ここでは、Git Bashを開く方法を説明します。
Git Bashを開く方法はいくつかありますが、VS Code(Visual Studio Code)から開くのがおすすめです。VS Codeは第3章で詳しく解説しますが、プログラミングで最も使われているエディタです。
ショートカットキー(Windows: Ctrl+`、Mac:
Cmd+`)でも開けます。
ターミナルが開くと、画面下部にコマンドを入力できるパネルが表示されます。
上の画像ではシンプルに $
だけが表示されていますが、お使いの環境では
user@PC名 ~/project $
のようにユーザー名やフォルダパスが表示されているかもしれません。Git
Bashでは色付きで装飾されていることもあります。表示が違っても問題ありません。$
や % の後にコマンドを入力できれば大丈夫です。
$
の後にコマンドを入力し、Enter(Return)キーを押すと実行されます。多くのコマンドは、成功すると何もメッセージを返さずに次のプロンプトが表示されます。「何も起きていない?」と不安になるかもしれませんが、エラーメッセージが出ていなければ成功です。「便りがないのは良い便り」と覚えておきましょう。
Windowsユーザーの場合: 初回は PowerShell が開くことがあります。その場合は、ターミナルパネル右上の「+」ボタン横の「∨」をクリックし、「Git Bash」を選択してください。
これで、VS Code内でターミナル(Git Bash)が使えるようになります。プロジェクトフォルダが自動的にカレントディレクトリになるため、すぐにGitコマンドを実行できます。
なぜVS Codeから開くのがおすすめなのか
毎回Git Bashを選択するのが面倒な場合は、VS Codeのデフォルトターミナルをgit Bashに変更できます。
Ctrl+Shift+Pでコマンドパレットを開くこれで、新しいターミナルを開くと自動的にGit Bashが起動します。
MacやLinuxの場合
MacやLinuxでは、標準のターミナル(zshやbash)がそのまま使えます。特別な設定は必要ありません。本書のコマンドはすべてそのまま実行できます。
この章では、AI時代になぜGitが必要なのかを学びました。Gitはファイル管理ツールというだけでなく、AIとの協働を安全に進めるための「守り」の役割を担います。
$はプロンプト、#はコメント、<>はプレースホルダーを表すAI時代にGitが重要な理由として正しいものはどれですか?
AIとGitの役割分担として正しいのはどれですか?
次章予告: 第2章では、リポジトリ、コミット、ブランチといったGitの基本概念を学びます。これらの概念を理解することで、Gitの動作原理がわかるようになります。
この章で学ぶこと
推定読了時間: 20-30分 | 難易度: ★★☆☆☆
「昨日まで動いていたコードが、なぜか動かない」「あの修正、元に戻したいけど、どこを変えたか覚えていない」——新機能を追加しようとコードを書き換えていたら、元々動いていた部分まで壊れてしまい、「Ctrl+Z」を連打しても、もう手遅れ。プログラムに触れたことがある人なら、誰もが一度は経験する悪夢です。
AIコーディングの時代になった今、この問題はさらに深刻になっています。AIが一度に大量のコードを生成・変更するため、「どこが変わったのか」「元はどうだったのか」を人間が把握することは、もはや不可能に近いのです。だからこそ、バージョン管理システムの重要性はかつてないほど高まっています。
バージョン管理システムとは、ファイルに対するすべての変更を自動的に記録し、いつでも過去の任意の時点に戻れるようにするツールです。いつ、誰が(あるいはどのAIが)、どのファイルの、どの部分を、どのように変更したのか——そのすべてが記録され、必要なときにいつでも参照できます。AIが生成したコードで問題が起きても、一瞬で「あのときの状態」に戻せる。これは、AIと協働する現代の開発者にとって、まさに命綱と言えるでしょう。
現代のソフトウェア開発において、バージョン管理システムは電気や水道と同じくらい当たり前のインフラです。使わない開発現場は存在しないと言っても過言ではありません。そして、その世界標準となっているのがGitです。
Gitの強力さを実感できるのが「差分(Diff)」表示です。以下は、VSCodeでGitの差分を表示した画面のイメージです。
左側が変更前、右側が変更後のコードです。削除された行は赤色、追加された行は緑色でハイライトされています。この例では、従来のfor文をより簡潔なforEach文に書き換えています。
この差分表示があれば、AIが生成したコードでも、自分が深夜に書いたコードでも、「何がどう変わったのか」が一目瞭然です。問題が起きたとき、この差分を見れば原因の特定が格段に速くなります。そして、必要であればワンクリックで変更前の状態に戻すことができます。
これこそが、Gitを使う最大のメリットです。変更を「見える化」し、いつでも過去に戻れる安心感——それが、恐れずにコードを改善し続ける勇気を与えてくれます。
「差分が見えるのはわかった。でも、実際に元に戻すのは難しいのでは?」と思うかもしれません。実は、VSCodeとGitの組み合わせなら、Diff画面からワンクリックで元に戻せます。
Diff画面で変更箇所を確認しているとき、変更ブロックの横に「→」と「+」のボタンが表示されます。「→」をクリックするだけで、その部分の変更が取り消され、元のコードに戻ります。コマンドを覚える必要はありません。ファイル全体ではなく、特定の変更ブロックだけを選んで元に戻せるのもポイントです。
AIにコードを書かせてみたものの、一部だけうまく動かない。そんなとき、問題のある部分だけをワンクリックで元に戻し、他の変更は残したまま別のアプローチを試せます。失敗を恐れず、何度でもやり直せる——これがGitのある開発環境です。
Gitは2005年4月、Linuxカーネルの生みの親であるLinus Torvaldsによって作られました。その誕生には、ドラマチックな背景があります。
当時、世界最大級のオープンソースプロジェクトであるLinuxカーネルの開発には、BitKeeperという商用のバージョン管理システムが使われていました。BitKeeperは分散型で高性能でしたが、あるLinux開発者がBitKeeperのプロトコルをリバースエンジニアリングしたことで、無償ライセンスが取り消されてしまいます。数千人の開発者を抱えるLinuxコミュニティは、突然、開発ツールを失ったのです。
Torvaldsは既存のバージョン管理システム(CVSやSubversion)を検討しましたが、どれも彼の要求を満たしませんでした。彼が求めたのは以下の要件です。
「CVSを反面教師にした」とTorvaldsは後に語っています。「CVSがやっていることの正反対をやれば、だいたい正しい設計になる」と。
そして驚くべきことに、Torvaldsはわずか10日間でGitの最初のバージョンを完成させました。ただし、これは突然の思いつきではありません。彼はその前の4ヶ月間、BitKeeperを超えるシステムの構想を練り続けていたのです。2005年4月7日、Gitの最初のコミットが行われ、そのコミット自体がGitを使って記録されました。
バージョン管理システムには「集中型」と「分散型」の2種類があります。Gitは分散型です。この違いを理解しておくと、Gitの動作がスムーズに理解できます。
集中型では、プロジェクトの全履歴はサーバーだけが持っています。開発者の手元にあるのは「最新版のファイル」だけです。
これはつまり、サーバーが止まると全員が作業停止になるということです。履歴を見たい、過去のバージョンに戻したい、ブランチを作りたい…すべてサーバーへの接続が必要です。ネットワークが不安定な場所では、作業効率が大きく落ちます。
分散型では、全員が完全な履歴を持っています。git clone
でリポジトリを複製すると、プロジェクトの最初から最新まで、すべての履歴があなたの手元にコピーされます。
だから、サーバー(GitHubなど)がダウンしても、手元で作業を続けられます。コミット、ブランチ作成、履歴の検索、すべてローカルで完結します。ネットワークが必要なのは、他の人と変更を共有するときだけです。
この違いは日常の開発体験に直結します。Gitでは「とりあえず試してみる」「過去の履歴を探る」といった操作が気軽にできます。ブランチ作成は一瞬。履歴検索もネットワーク遅延なし。この軽快さが、Gitが世界中で使われている理由の一つです。
今やGitは、開発者にとって「使えて当たり前」のツールです。求人票に「Git必須」と書かれていることも珍しくありません。
ただ、Gitが最初から人気だったわけではありません。2005年の誕生から数年間は「Linuxカーネル開発者のための難解なツール」という印象が強く、一般の開発者にはなかなか浸透しませんでした。
状況を変えたのが、2008年のGitHubです。GitHubはGitリポジトリのホスティングに加えて、プルリクエスト、イシュー管理、コードレビューといった機能をWebから使えるようにしました。
特に「オープンソースプロジェクトは無料」という方針が決め手でした。個人開発者やオープンソースコミュニティがこぞってGitHubを使い始め、その流れが企業にも広がりました。2018年にはMicrosoftがGitHubを買収。今ではGitLabやBitbucketも含め、Git中心の開発エコシステムが完全に定着しています。
Gitが選ばれ続けているのには、技術的な理由があります。
Gitが20年経っても主流であり続ける理由
ソフトウェア業界では、技術の栄枯盛衰が激しいことで知られています。数年前のトレンドが今日では時代遅れになることも珍しくありません。しかしGitは、2005年の誕生から20年経った今も、圧倒的な主流の座を維持し続けています。なぜでしょうか。
その答えは、Gitが解決している問題の本質にあります。Gitは単なる「ファイルのバックアップツール」ではありません。「誰が」「いつ」「何を」「なぜ」変更したかを完全に追跡できる仕組みなのです。
この「変更履歴の完全な追跡」は、時代が変わっても価値が変わりません。むしろ、AI時代においてはさらに重要性が増しています。
AIコーディングアシスタントが普及した現在、開発者はAIが提案したコードと自分が書いたコードを区別する必要があります。バグが発生したとき、それがAIの提案に起因するのか、人間の判断ミスなのかを特定できなければ、問題の根本解決は困難です。
さらに深刻なのは、AIが予期せぬ箇所を変更してしまう問題です。開発者コミュニティでは「70個のファイルが変更された中に、意図しない小さな編集が紛れ込んでいた」「確認を求める前にファイルを勝手に書き換えられた」といった報告が相次いでいます。AIは指示していない箇所まで「改善」しようとすることがあり、その変更に気づかないまま本番環境にデプロイしてしまうリスクがあるのです。
ここでGitの真価が発揮されます。AIにコードを生成させる前にgit addでステージングしておけば、git diffで変更箇所を一目で確認できます。70個のファイルが変更されていても、差分を見れば意図しない変更を瞬時に発見できます。問題があればgit checkoutやgit restoreで即座に元の状態に戻せます。
Gitのコミット履歴は、まさにこの問題を解決します。「AIの提案を採用」「人間によるリファクタリング」「AIコードのセキュリティ修正」といったコミットメッセージを残すことで、コードの出自と変更理由が明確になります。経験豊富な開発者は「AIを絶対にmainブランチで作業させない」「こまめにコミットする」といったルールを徹底しています。
また、Gitの分散型アーキテクチャは、クラウドサービスへの依存度が高まる現代において、むしろ安心材料となっています。GitHubやGitLabがダウンしても、各開発者のローカルに完全な履歴が残っているという事実は、ビジネス継続性の観点からも重要です。
技術は変わっても、「変更を追跡し、いつでも過去に戻れる」という根本的なニーズは変わりません。Gitが20年後も使われ続けている可能性は、極めて高いと言えるでしょう。
Gitには独自の用語がたくさんあります。「リポジトリ」「コミット」「ブランチ」「ステージングエリア」など、初めて聞くと混乱してしまうかもしれません。しかし心配は不要です。このセクションで、Gitの世界の全体像と基本用語を一度に把握してしまいましょう。
Gitでの作業は、大きく分けて「4つの場所」と「それらをつなぐ操作」で構成されています。まず、この全体像を頭に入れておくと、後の詳細解説がずっと理解しやすくなります。
この図が示す「場所」と「操作」の関係が理解できれば、Gitの8割は理解したも同然です。それぞれの詳細は2-3節以降で解説しますので、今は「こういう流れなんだな」と眺めるだけで大丈夫です。
以下の表は、この章で詳しく学ぶ用語の一覧です。今は「こういう用語があるのか」と眺めるだけで大丈夫です。各セクションを読み進める中で、自然と理解が深まります。
| 用語 | 一言説明 | 詳細 |
|---|---|---|
| ワークツリー | 実際にファイルを編集する場所 | 2-6 |
| ステージングエリア | コミットする変更を準備する場所 | 2-6 |
| ローカルリポジトリ | 自分のPC上の履歴保存場所 | 2-3 |
| リモートリポジトリ | サーバー上の共有保存場所 | 2-3 |
| 用語 | 一言説明 | 詳細 |
|---|---|---|
| コミット | プロジェクトの状態を記録したスナップショット | 2-4 |
| ブランチ | 作業の分岐点を示すポインタ | 2-5 |
| HEAD | 今自分がいる場所を示す目印 | 2-5 |
| コミットハッシュ | 各コミットを識別する一意のID | 2-4 |
| 用語 | 一言説明 | 詳細 |
|---|---|---|
| clone | リモートリポジトリをローカルにコピー | 2-3 |
| add | 変更をステージングエリアに追加 | 2-6 |
| commit | ステージングした変更を履歴に記録 | 2-4 |
| push | ローカルの変更をリモートに送信 | 2-3 |
| pull | リモートの変更をローカルに取得 | 2-3 |
本書の後半では、さらに以下の用語が登場します。
| 用語 | 一言説明 | 詳細 |
|---|---|---|
| マージ | 複数のブランチを統合する | 第6章 |
| プルリクエスト | 変更のレビューを依頼する | 第9章 |
| コンフリクト | 変更が衝突した状態 | 第10章 |
| リベース | コミット履歴を整理する | 第10章 |
| スタッシュ | 作業を一時的に退避する | 第10章 |
この章は、上から順番に読むことをお勧めします。各セクションは前のセクションの知識を前提にしていますが、もし途中で用語が分からなくなったら、このセクションに戻って確認してください。
また、章末には「用語解説」ボックスがあります。そこでは全用語を一覧表形式でまとめているので、辞書的に活用できます。
では、次のセクションから各概念を詳しく見ていきましょう。
Git初心者が最初に躓きやすいのが、「リポジトリ」という概念です。特に「ローカル」と「リモート」の2種類があることを理解することが、Gitを使いこなす第一歩となります。
2-2節で見た図を、もう少し詳しく解説します。
Gitでの作業は「4つの場所」と「4つの操作」で構成されています。
4つの場所
4つの基本操作
この流れを理解すれば、Gitの8割は理解したも同然です。では、それぞれの要素を詳しく見ていきましょう。
リポジトリ(Repository)とは、プロジェクトのファイルとその変更履歴を保存する場所です。単なるフォルダとは異なり、すべての変更の記録(誰が、いつ、何を変更したか)が含まれています。
リポジトリの実体は、プロジェクトフォルダ内にある.gitという隠しフォルダです。このフォルダには、コミット履歴、ブランチ情報、設定ファイルなど、Gitが動作するために必要なすべてのデータが格納されています。
普通のフォルダをGitリポジトリに変換するには、git initコマンドを実行します。実際に何が起きるか見てみましょう。
# 普通のフォルダの状態
$ ls -la my-project/
drwxr-xr-x 3 user staff 96 Jan 15 10:00 .
drwxr-xr-x 5 user staff 160 Jan 15 10:00 ..
-rw-r--r-- 1 user staff 100 Jan 15 10:00 index.html
# git init を実行
$ cd my-project && git init
Initialized empty Git repository in /Users/user/my-project/.git/
# .git フォルダが追加された
$ ls -la
drwxr-xr-x 4 user staff 128 Jan 15 10:00 .
drwxr-xr-x 5 user staff 160 Jan 15 10:00 ..
drwxr-xr-x 12 user staff 384 Jan 15 10:00 .git ← これが追加された
-rw-r--r-- 1 user staff 100 Jan 15 10:00 index.html
この.gitフォルダこそがリポジトリの正体です。このフォルダが存在するかどうかで、「普通のフォルダ」と「Gitリポジトリ」が区別されます。
.gitフォルダの中身.gitフォルダの中を覗いてみると、Gitがどのようにデータを管理しているかが分かります。
$ ls .git/
HEAD # 今どのブランチにいるかを記録
config # このリポジトリの設定
objects/ # コミットやファイルの実データ(圧縮して保存)
refs/ # ブランチやタグの情報
hooks/ # 自動実行スクリプト(上級者向け)重要なのは、この.gitフォルダを削除すると、すべての履歴が消えてしまうということです。ファイル自体は残りますが、変更履歴は完全に失われます。逆に言えば、.gitフォルダさえあれば、過去のどの時点の状態にも戻ることができます。
ローカルリポジトリは、あなたのコンピューター上に存在するリポジトリです。
特徴 - 自分のPC上に存在し、他の人からは見えない -
インターネット接続なしで作業可能 -
自由に実験やテストができる「下書き」の場所 -
git initコマンドで新規作成できる
ローカルリポジトリでは、コードの変更、コミット、ブランチの作成など、ほとんどの操作を完結できます。ネットワークに接続していなくても、過去の履歴を確認したり、新しい機能を開発したりすることが可能です。
リモートリポジトリは、GitHubやGitLabなどのサーバー上に存在するリポジトリです。
特徴 - インターネット上のサーバーに存在する -
チームメンバーと共有するための「共有スペース」 -
バックアップとしての役割も果たす -
git cloneコマンドでローカルにコピーできる
リモートリポジトリは、チームでの共同作業の中心となります。各メンバーが自分のローカルリポジトリで作業し、完成した変更をリモートリポジトリに送信(push)することで、他のメンバーと作業を共有します。
GitとGitHubの違いを理解する
初心者がよく混同するのが「Git」と「GitHub」です。
つまり、GitはMicrosoft Wordのようなソフトウェアであり、GitHubはGoogle Driveのようなクラウドサービスです。Gitはローカルだけでも使えますが、チームで共有するにはGitHub(またはGitLab、Bitbucket)のようなサービスが必要になります。
ローカルとリモートの間でデータをやり取りする基本操作は3つです。
| 操作 | コマンド | 説明 |
|---|---|---|
| クローン | git clone |
リモートリポジトリをローカルにコピー |
| プッシュ | git push |
ローカルの変更をリモートに送信 |
| プル | git pull |
リモートの変更をローカルに取得 |
個人開発では、主にバックアップ目的でリモートリポジトリを使います。チーム開発では、メンバー間の変更を統合する中心的な役割を果たします。
Gitを理解する上で最も重要な概念が「コミット」です。コミットは、通常のファイル保存とは根本的に異なる仕組みを持っています。
普段の「保存」とGitの「コミット」は、役割が異なります。保存の代わりにコミットするのではなく、保存した上でコミットするという関係です。
ファイル保存(Ctrl+S / Cmd+S)は今まで通り必要
エディタで作業しているとき、Ctrl+Sを押してファイルを保存する——これは今まで通り必要です。保存しないとファイルの変更は反映されません。ただし、保存は「上書き」なので、保存するたびに以前の状態は消えていきます。エディタを開いている間はUndo(Ctrl+Z)で戻れますが、エディタを閉じるとそのUndo履歴も消えてしまいます。
コミットは「履歴ポイント」を作る操作
Gitのコミットは、保存とは別の操作です。「今のこの状態を、履歴として残しておきたい」と思ったタイミングで実行します。コミットすると、その瞬間のプロジェクト全体の状態が「履歴ポイント」として記録されます。
コミットA、コミットB、コミットC…と好きなタイミングで履歴ポイントを作っていけば、どの時点の状態にもいつでも戻ることができます。エディタを閉じても、PCを再起動しても、1年後でも関係ありません。コミットした時点の状態は永続的に保存されており、いつでもアクセスできます。
つまり、作業の流れはこうなります:
保存は「ファイルを更新する」操作、コミットは「履歴ポイントを作る」操作。この2つを組み合わせることで、いつでも過去に戻れる安心感が生まれます。
図を見ると違いは明らかです。上書き保存では過去のバージョンが次々と消えていきますが、Gitではすべてのコミットが残り続け、HEADを動かすだけでどの時点にも自由に移動できます。
コミットは「ボス戦前のセーブ」——失敗を恐れない開発スタイル
一昔前のRPGを思い出してください。「ボス戦の前にセーブしておこう」——これは多くのゲーマーが身につけた習慣です。セーブしておけば、どんな強敵に全滅させられても、セーブポイントからやり直せます。逆にセーブを忘れて全滅すると、何時間もの冒険が水の泡…。あの絶望感は、経験した人にしかわかりません。
プログラミングも同じです。新しい機能を追加しようとしたら、既存の機能が壊れた。リファクタリングしたら、どこかでバグが発生した。AIに大胆な変更を提案されて試してみたら、プロジェクト全体が動かなくなった——。こうした「全滅」は、開発者なら誰もが経験することです。
Gitのコミットは、まさにこの「セーブポイント」を自由に作れる機能です。「この機能が完成した」「ここまでは動いている」「大きな変更を試す前」——そんなタイミングでコミットしておけば、何が起きてもそこに戻れます。
この「何を試しても大丈夫、いつでも戻れる」という安心感は、コーディングにおいて驚くほど有効です。失敗を恐れずに思い切った変更ができる。実験的なアプローチに挑戦できる。AIの提案を気軽に試せる。この心理的な安全性が、開発者の創造性を解放します。
ベテラン開発者ほど、こまめにコミットする習慣を持っています。それは経験から「セーブポイントの大切さ」を痛感しているからです。Gitを使いこなせるようになると、この感覚が身に染みてわかるはずです。
Gitのコミットは、その瞬間のプロジェクト全体の状態を丸ごと記録した「スナップショット(写真)」のようなものです。
コミットするたびに、プロジェクト全体の「写真」が1枚撮影されるイメージです。写真にはすべてのファイルが写っており、後から見返せば「あのときプロジェクトはこういう状態だった」と完全に再現できます。
ここが重要なポイントです。 過去に戻りたくなったら、その時点の「写真」を選ぶだけ。するとプロジェクト全体が、その写真を撮った瞬間の状態に一瞬で切り替わります。ファイルが100個あろうと1000個あろうと関係ありません。写真を1枚選ぶだけで、すべてのファイルがその時点の内容に戻るのです。
これがGitの「スナップショット」という考え方の本質です。差分を1つずつ巻き戻すのではなく、「その時点の完全な状態」をまるごと復元できる。だから、AIが大量のファイルを変更しても、コミットさえしておけば怖くありません。
技術的に言うと、Gitは各コミットでファイルの「差分」ではなく「完全な状態」を記録しています。ただし、内部的には効率化のため、変更のないファイルは前のコミットへの参照として保存されるので、ディスク容量を無駄に消費することはありません。
コミットは抽象的な概念ではありません。git logコマンドで、実際にどのように記録されているか確認できます。
$ git log --oneline
a1b2c3d (HEAD -> main) Add user authentication
e4f5a6b Update header design
c7d8e9f Initial commit
この出力から分かること:
a1b2c3d):コミットを一意に識別するID(コミットハッシュ)HEAD -> main:今自分がいる場所を示しているブランチの分岐やマージの様子を視覚的に確認したい場合は、--graphオプションを追加します。実務で最もよく使うコマンドの一つです。
$ git log --oneline --graph
* a1b2c3d (HEAD -> main) Merge branch 'feature/login'
|\
| * b2c3d4e Add login form validation
| * c3d4e5f Create login page
|/
* d4e5f6a Update README
* e5f6a7b Initial commit
*がコミットを表し、線で繋がれた分岐とマージの流れが一目で分かります。複数人で開発しているときや、ブランチを多用する場合に特に便利です。
より詳細な情報を見たい場合は、--onelineを外します。
$ git log
commit a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0 (HEAD -> main)
Author: Your Name <email@example.com>
Date: Mon Jan 15 14:30:00 2025 +0900
Add user authentication feature
このように、「誰が」「いつ」「何を」変更したかが完全に記録されています。
コミットが蓄積されていくと、「あのときのコードはどうなっていたか」を確認したくなることがあります。Gitなら簡単です。
# 2つ前のコミット時点のファイル内容を見る
$ git show c7d8e9f:index.html
<!DOCTYPE html>
<html>
<head><title>My App</title></head>
<body></body>
</html>
# 現在のファイル内容と比較
$ cat index.html
<!DOCTYPE html>
<html>
<head><title>My App - User Dashboard</title></head>
<body>
<header>Welcome, User!</header>
<!-- 多くのコードが追加されている -->
</body>
</html>
このように、過去のどの時点のファイル内容も、いつでも参照できます。これがGitの「すべて残る」という特徴です。
各コミットには、一意の識別子(ID)が付与されます。これを「コミットハッシュ」または「SHA-1ハッシュ」と呼びます。
完全なハッシュ: a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0(40文字)
短縮形: a1b2c3d(最初の7文字)
コミットハッシュは、コミットの内容(変更されたファイル、作成者、日時、コミットメッセージなど)から自動的に計算されます。同じ内容のコミットは常に同じハッシュになり、内容が1文字でも異なれば全く違うハッシュになります。
短縮形で十分な理由
実際の操作では、40文字すべてを入力する必要はありません。Gitは短縮形でもコミットを特定できます。
# 以下はすべて同じコミットを指定できる
$ git show a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0
$ git show a1b2c3d4e5f6
$ git show a1b2c3d
通常、最初の5〜7文字を指定すれば、プロジェクト内で一意にコミットを特定できます。Gitは入力された文字列に一致するコミットを自動的に検索し、該当するものが1つだけならそれを使用します。もし複数のコミットが同じ文字列で始まる場合は、Gitが「曖昧です」と警告を出すので、文字を1〜2文字追加すれば解決します。
なぜ衝突しないのか
SHA-1は16進数40文字(160ビット)の空間を持ちます。これは約10の48乗通りの組み合わせです。7文字の短縮形でも約2億6千万通りあるため、数千〜数万コミット程度のプロジェクトでは、実質的に衝突は起こりません。
Linuxカーネルのような巨大プロジェクト(100万コミット以上)でも、12文字程度で一意性が保たれています。
コミットハッシュの確認方法
# 直近のコミットのハッシュを確認
$ git log --oneline -1
a1b2c3d feat: ログイン機能を追加
# 完全なハッシュを表示
$ git log -1 --format="%H"
a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0
git log --onelineでは、Gitが自動的に適切な長さの短縮形(通常7文字)を表示します。これをコピーしてそのまま他のコマンドで使用できます。
コミットには必ず「コミットメッセージ」を添えます。これは「何を」「なぜ」変更したかを記録するものです。
良いコミットメッセージの例
ユーザー認証機能を追加
- ログイン/ログアウト機能を実装
- セッション管理にJWTを採用
- パスワードはbcryptでハッシュ化
悪いコミットメッセージの例
修正
コミットメッセージは「未来の自分」や「チームメンバー」への手紙です。数ヶ月後に「なぜこの変更をしたのか」を思い出すために、具体的で意味のあるメッセージを書くことが重要です。
AI時代のコミット習慣
AIツールを使った開発では、コミットメッセージがさらに重要になります。AIが提案したコードを採用した場合、その理由をコミットメッセージに記録しておくことで、後から「なぜこのアプローチを選んだのか」を確認できます。
例:
[AI] Claude Codeの提案を採用: エラーハンドリングを改善
このような記録を残すことで、AI提案コードと人間が書いたコードを区別し、問題が発生したときの調査を容易にします。
実際には、Claude CodeなどのAIツールに変更内容を確認させ、適切なコミットメッセージを自動生成させることもできます。AIがdiffを分析し、変更の意図を要約してくれるため、より正確で一貫性のあるコミットメッセージが作成できます。この手法については本書では詳細を割愛しますが、第8章でAIツールとGitの連携について触れています。
ブランチは、Gitの最も強力な機能の一つです。しかし、多くの初心者がブランチについて誤解しています。この概念を正しく理解することで、Gitの真価を発揮できるようになります。
多くの初心者は「ブランチを作る=プロジェクト全体をコピーする」と考えがちです。フォルダを複製してproject_v1、project_v2と管理していた経験があると、この誤解に陥りやすいでしょう。
誤解: ブランチを作ると、ファイルがコピーされる
正解: ブランチは、コミットへの「ポインタ(参照)」にすぎない
上の図が示すように、ブランチの実体は非常にシンプルです。各ブランチは単に「どのコミットを指しているか」という情報(40文字のハッシュ値)を持っているだけです。ブランチを作成しても、ファイルは一切コピーされません。
この設計により、以下のメリットが生まれます:
この「軽量ブランチ」こそが、Gitが他のバージョン管理システムと一線を画す特徴です。気軽にブランチを作り、実験し、不要になれば削除する。この柔軟性が、モダンな開発ワークフローを支えています。
ブランチの必要性は、具体的なシナリオで考えると分かりやすくなります。
状況: あなたは新機能「ダークモード」を追加したいと考えています。しかし、うまく実装できるか分かりません。試行錯誤が必要で、場合によっては失敗するかもしれません。
ブランチがない場合の問題:
mainブランチで直接開発を始めると、試行錯誤の過程で動いていたコードが壊れる可能性があります。「やっぱりやめよう」と思っても、どこまで戻せばいいか分からなくなります。最悪の場合、元々動いていた機能まで壊してしまうかもしれません。
ブランチがある場合の解決策:
ブランチを使えば、「完成版のコード」と「開発中のコード」を完全に分離できます。
main ブランチ → 完成して動作確認済みのコード
feature/dark-mode → ダークモードを開発中(まだ未完成)
ダークモードの開発はfeature/dark-modeブランチで進めます。このブランチでどれだけコードを変更しても、mainブランチには一切影響しません。開発が完了し、十分にテストして動作確認ができたら、そのタイミングでmainにマージ(統合)します。
もし開発がうまくいかなかったら?そのブランチを削除するだけです。mainブランチは最初から最後まで安全なまま。今まで動いていた機能には一切影響を与えません。
具体的なコマンドと、それぞれの操作後の状態を見てみましょう。
ポイントは、git switchでブランチを切り替えると、フォルダ内のファイルが実際に書き換わるということです。同じフォルダなのに、ブランチによって中身が変わる。これがGitの魔法です。
switchとcheckout、どちらを使う?
ネットで検索すると、git checkoutというコマンドもよく見かけます。実はgit switchは2019年に追加された比較的新しいコマンドで、それ以前はcheckoutがブランチ切り替えに使われていました。
git switch main # 新しい書き方(推奨)
git checkout main # 古い書き方(今でも動く)
checkoutは「ブランチ切り替え」と「ファイルの復元」の両方ができる多機能コマンドでしたが、初心者には紛らわしいため、機能を分割してswitch(切り替え専用)とrestore(復元専用)が生まれました。本書では公式推奨のswitchを使いますが、checkoutでも全く同じことができます。
ちなみに筆者も、長年の習慣でいまだにcheckoutと打ってしまいます。早く新時代のやり方にスイッチ(switch)しないといけませんね。
このように、ブランチを使えば複数の作業を完全に分離できます。お互いに影響を与えることなく、並行して作業を進められるのです。
ブランチの実体は、40文字のコミットハッシュが書かれた小さなファイルです。.git/refs/heads/ディレクトリを覗くと、各ブランチに対応するファイルが見つかります。
$ cat .git/refs/heads/main
e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4
$ cat .git/refs/heads/feature
d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3このように、ブランチファイルの中身は単なるハッシュ値です。新しいコミットを作ると、このハッシュ値が新しいコミットのものに更新されます。
ブランチを切り替える(git switch)と、Gitは以下の処理を行います:
上の図は典型的なブランチの流れを示しています。コミットBの時点でfeatureブランチを作成し、その後mainとfeatureがそれぞれ独立して進み、最終的にマージ(統合)されています。
ブランチの切り替えは、単なる「表示の切り替え」ではありません。ファイルの内容が実際に変わります。
# feature/dark-mode ブランチで新機能を開発中
$ git switch feature/dark-mode
Switched to branch 'feature/dark-mode'
$ cat styles.css
body {
background: #1a1a1a; /* ダークモードの背景色 */
color: #ffffff;
}
# main ブランチに切り替える
$ git switch main
Switched to branch 'main'
$ cat styles.css
body {
background: #ffffff; /* 通常の背景色 */
color: #333333;
}
同じファイル(styles.css)なのに、ブランチを切り替えると内容が変わっています。これは、Gitが.gitフォルダ内に保存されているデータを元に、ファイルを書き換えているのです。
この仕組みにより、1つのプロジェクトフォルダで複数の開発ラインを管理できます。ファイルを手動でコピーしたり、複数のフォルダを用意したりする必要はありません。
HEADは、「今自分がいる場所」を示す特別なポインタです。地図アプリで「現在地」を示すピンのように、Gitの世界での「今ココ」マーカーだと考えてください。Gitで作業するとき、常に「どこにいるか」を把握していることが重要です。HEADがその役割を担っています。
通常、HEADはブランチ名を指しており、そのブランチが指すコミットが現在の作業状態となります。この「二段階の参照」構造を理解することが、Gitを使いこなす鍵です。
上の図のように、HEADは通常「ブランチ」を指し、ブランチが「コミット」を指します。新しいコミットを作ると、現在のブランチのポインタが自動的に新しいコミットに移動します。HEADは変わらずそのブランチを指し続けるので、結果的にHEADも最新コミットを参照することになります。
ブランチを切り替える(git switch feature)と、HEADの指す先が変わります。
$ git switch main
Switched to branch 'main'
# HEAD → main → コミットE
$ git switch feature
Switched to branch 'feature'
# HEAD → feature → コミットD
デタッチドHEAD状態に注意
通常、HEADはブランチを指していますが、特定のコミットを直接指すことも可能です。この状態を「デタッチドHEAD(detached HEAD)」と呼びます。
# コミットハッシュを直接指定してcheckout
$ git checkout a1b2c3d
# または
$ git switch --detach a1b2c3d
この状態は過去のコミットの内容を確認するには便利ですが、この状態で新しいコミットを作ってはいけません。デタッチドHEAD状態で作ったコミットは、どのブランチにも属さない「迷子」になります。別のブランチに切り替えると、そのコミットは参照できなくなり、やがてGitのガベージコレクションで消えてしまいます。
デタッチドHEAD状態で開発を始めてしまった場合は、すぐにブランチを作成して作業を保護しましょう。
# 現在のコミットに新しいブランチを作成
$ git switch -c my-new-branch
リポジトリを作成すると、デフォルトでmainブランチが作られます。一般的に、mainブランチには「本番環境で動作する安定したコード」を置きます。
新機能の開発やバグ修正は、mainから分岐した別のブランチで行い、完成したらmainにマージ(統合)するのが標準的なワークフローです。
masterからmainへの移行
以前はデフォルトブランチの名前はmasterでした。2020年頃から、GitHubをはじめとする多くのサービスがmainへの移行を進めました。
この変更の背景には、「master/slave(主人/奴隷)」という用語が持つ歴史的な含意への配慮があります。技術業界全体で、より中立的で包括的な用語を使おうという動きの一環です。
現在のGitHubでは新規リポジトリのデフォルトブランチはmainですが、古いプロジェクトや一部のチュートリアルでは今でもmasterが使われています。どちらも技術的には同じ「デフォルトブランチ」を指しているので、見かけても混乱しないでください。本書では現在の標準に従い、mainを使用します。
実務でのブランチ運用
「branch」は日本語で「枝」を意味します。mainブランチが木の「幹」、そこから伸びるfeatureブランチやbugfixブランチが「枝」というイメージです。
実際のソフトウェア開発現場では、mainブランチ上で直接開発作業をすることはまずありません。多くの企業やチームでは、ブランチの運用ルールが明確に定められています。
典型的なルールの例を挙げましょう。「mainブランチへの直接コミットは禁止。必ず作業用ブランチを作成し、プルリクエスト(PR)経由でマージすること」「PRには最低1人のレビュー承認が必要」「CI(自動テスト)が通らないとマージできない」といった具合です。
なぜここまで厳格なのでしょうか。mainブランチは多くの場合、本番環境に直結しています。ここにバグのあるコードが入ると、ユーザーに影響が出ます。だからこそ、mainは「守るべき聖域」として扱われ、変更を加える際には複数のチェックを通過させるのです。
日常の開発フローはこうなります。まず担当するタスク用のブランチを作成します(feature/user-profileなど)。そのブランチで実装を進め、完成したらプルリクエストを作成。チームメンバーがコードをレビューし、問題がなければmainにマージされます。
個人開発であっても、この習慣を身につけておくことをお勧めします。mainで直接作業する癖がついてしまうと、チーム開発に参加したときに苦労します。また、個人でも「動く状態のmain」を常に維持しておけば、いつでも安心してデプロイできる状態を保てます。
ブランチは用途に応じて命名規則を決めると管理しやすくなります。
| 用途 | 命名例 | 説明 |
|---|---|---|
| 新機能開発 | feature/user-auth |
新しい機能を開発 |
| バグ修正 | bugfix/login-error |
バグを修正 |
| 実験 | experiment/ai-suggestion |
試験的な実装 |
| リリース | release/v1.0 |
リリース準備 |
AI開発での「実験ブランチ」活用法
AIツールが提案したコードを試す際は、必ず実験用のブランチを作成しましょう。
$ git switch -c experiment/copilot-refactor
うまくいけばmainにマージし、うまくいかなければブランチごと削除できます。これにより、mainブランチを常に安全な状態に保ちながら、AIの提案を積極的に試すことができます。
ブランチは「失敗しても大丈夫」という安心感を与えてくれる、AI時代に不可欠な機能です。
Gitには「ステージングエリア」(インデックスとも呼ばれる)という独自の仕組みがあります。他のバージョン管理システムにはない、Git特有の概念です。
ステージングエリアは、Linuxカーネル開発という大規模プロジェクトの要求から生まれました。1日に何百もの変更が発生する環境では、「どの変更を1つのコミットにまとめるか」を細かく制御する必要がありました。
ステージングエリアがないと、作業ディレクトリの変更をすべてまとめて1つのコミットにするか、ファイル単位でしかコミットを分けられません。ステージングエリアがあることで、「意味のある単位」でコミットを作成できます。
状況: 2つのファイルを変更しましたが、1つは完成、もう1つはまだ作業中です。
# 現在の状態を確認
$ git status
Changes not staged for commit:
modified: login.js # ← 完成!コミットしたい
modified: dashboard.js # ← まだ作業中...
# login.js だけをステージング
$ git add login.js
# 再度状態を確認
$ git status
Changes to be committed:
modified: login.js # ← ステージング済み(コミットに含まれる)
Changes not staged for commit:
modified: dashboard.js # ← まだステージングしていない(コミットに含まれない)
# コミット実行
$ git commit -m "Fix login feature"
# → login.js だけがコミットされる
# → dashboard.js は作業中のまま残る
このように、ステージングエリアを使えば「完成した部分だけ」を選んでコミットできます。作業中のファイルを巻き込む心配がありません。
Gitで管理されるファイルは、3つの状態を遷移します。
ワークツリー: 実際にファイルを編集する場所。エディタで開いているファイルはここにあります。
ステージングエリア:
コミットする予定の変更を準備する場所。git addコマンドで変更をここに追加します。
リポジトリ:
コミットされた変更が永続的に保存される場所。git commitコマンドでステージングエリアの内容がここに記録されます。
選択的コミット: 複数のファイルを変更しても、関連する変更だけを選んでコミットできる
部分的ステージング:
1つのファイル内でも、特定の行だけをステージングできる(git add -p)
レビュー機会:
コミット前に「何をコミットしようとしているか」を確認できる(git status、git diff --staged)
作業の中断対応: 開発中に緊急のバグ修正が入っても、現在の作業を一時退避して別のコミットを作成できる
# 1. ファイルを編集(ワークツリーで作業)
$ code feature.js # VS Codeで開いて編集
# 2. 変更をステージング
$ git add feature.js
# 3. ステージングされた内容を確認
$ git status
Changes to be committed:
modified: feature.js
# 4. コミット
$ git commit -m "Add user authentication"
git statusの読み方git statusはGitで最も頻繁に使うコマンドの一つです。出力の読み方を詳しく見てみましょう。
$ git status
On branch main # 現在のブランチ
Changes to be committed: # 緑色で表示
(use "git restore --staged <file>..." to unstage)
modified: completed.js # → コミットに含まれる
Changes not staged for commit: # 赤色で表示
(use "git add <file>..." to update what will be committed)
modified: work-in-progress.js # → コミットに含まれない
Untracked files: # 赤色で表示
(use "git add <file>..." to include in what will be committed)
new-file.js # → Gitで追跡されていない
3つのセクションの意味:
| セクション | 色 | 意味 |
|---|---|---|
| Changes to be committed | 緑 | ステージング済み。次のgit commitでコミットされる |
| Changes not staged | 赤 | 変更はあるがステージングされていない。コミットに含まれない |
| Untracked files | 赤 | 新規ファイル。まだGitで追跡されていない |
コミット前には必ずgit statusを確認し、「緑色のセクションに意図したファイルがあるか」を確認する習慣をつけましょう。
ステージングを忘れると、変更がコミットされない
Gitでは、git addでステージングしない限り、変更はコミットに含まれません。「変更したのにコミットに反映されない」というトラブルのほとんどは、ステージングの忘れが原因です。
コミット前には必ずgit statusで「何がステージングされているか」を確認する習慣をつけましょう。緑色で表示されているファイルがコミットに含まれ、赤色で表示されているファイルは含まれません。
用語解説
| 用語 | 説明 |
|---|---|
| リポジトリ (Repository) | プロジェクトのファイルと変更履歴を保存する場所。.gitフォルダがその実体 |
| ローカルリポジトリ | 自分のPC上に存在するリポジトリ。オフラインでも作業可能 |
| リモートリポジトリ | GitHub等のサーバー上に存在するリポジトリ。チームとの共有に使用 |
| コミット (Commit) | プロジェクトの状態を記録したスナップショット。履歴として永続的に保存される |
| コミットハッシュ | 各コミットに付与される一意のID(例: abc1234) |
| ブランチ (Branch) | コミットへのポインタ。軽量で、瞬時に作成・削除できる |
| HEAD | 現在いる場所(ブランチ)を示すポインタ |
| mainブランチ | デフォルトのブランチ。通常、本番環境の安定したコードを保持 |
| ステージングエリア | コミット予定の変更を準備する場所。インデックスとも呼ばれる |
| ワークツリー | 実際にファイルを編集する作業場所 |
| add | 変更をステージングエリアに追加する操作(git add) |
| push | ローカルの変更をリモートリポジトリに送信する操作 |
| pull | リモートリポジトリの変更をローカルに取得する操作 |
| clone | リモートリポジトリをローカルに複製する操作 |
この章では、Gitの基本概念を学びました。リポジトリ、コミット、ブランチという3つの柱を理解することで、Gitがどのように動作するかがイメージできるようになったはずです。
.gitフォルダがその実体ブランチを使う主な理由として正しいのはどれですか?
次章予告: 第3章では、Git、VS Codeなどの開発環境を整えます。実際にGitを使う準備を進めていきましょう。
本書の無料ダウンロードコンテンツ
本書の読者向けに、学習を加速する5つの特典を無料で提供しています。
ダウンロードURL: https://alphaelements.co.jp/ja/books/why-git-vol1/
合言葉: UnlockGit2026
※ダウンロードには合言葉の入力が必要です