1.2.1 Git の基礎概念

このページを終えたら、この evidence card を残します。
- リポジトリ状態
- 操作前後の git status
- 操作
- init、add、commit、branch、merge、remote、pull、またはpushコマンドを使用
- 履歴
- 何が変わったかを示す git log またはブランチグラフ
- 失敗確認
- 未追跡ファイル、誤ったブランチ、マージ衝突、またはリモート/認証の問題
- 期待される成果
- 別の学習者が安全に再実行できる、きれいな Git の trace
この節の位置づけ
Section titled “この節の位置づけ”この節ではまず、なぜコードにバージョン管理が必要なのかを理解します。「ファイル名が増えすぎてわからない」「壊してしまって元に戻せない」「複数人での共同作業が難しい」といった実際の悩みから出発して、リポジトリ、ステージングエリア、コミット、ブランチの基本を身につけます。
- なぜバージョン管理が必要なのかを理解する(実際の困りごとを通して)
- Git の4つの核心概念を身につける:リポジトリ、ステージングエリア、コミット、ブランチ
- Git のインストールと初期設定を完了する
Git がない世界
Section titled “Git がない世界”Git を学ぶ前に、Git がないとき開発者はどのようにコードを管理していたのかを見てみましょう。
悩み1:ファイル名地獄
Section titled “悩み1:ファイル名地獄”AI モデルの学習スクリプトを書いて、何度も修正しては保存していきます。
train.pytrain_v2.pytrain_v2_final.pytrain_v2_final_ほんとうの最終版.pytrain_v2_final_ほんとうの最終版_bug修正.pytrain_v2_final_ほんとうの最終版_bug修正_上司がもう少し直してと言った.py1週間後に「最初の bug 修正の前の版」に戻りたくなったら、いったいどのファイルでしょうか?
悩み2:壊したら戻れない
Section titled “悩み2:壊したら戻れない”意気込んで model.py をリファクタリングし、200行もコードを変えました。実行すると——エラー。さらに直すと——もっとエラー。元の状態に戻したいのに、すでに何度も Ctrl+S で保存してしまっていて、戻れません。
悩み3:共同作業は大混乱
Section titled “悩み3:共同作業は大混乱”あなたと同僚が同じファイルを同時に編集しています。あなたは前半を、相手は後半を変更しました。それぞれ保存したあと、微信でファイルを送り合います。誰がまとめるのでしょう? どうやってまとめるのでしょう? 相手の変更を上書きしてしまったらどうしますか?
Git は、この3つの問題を解決します。
| 悩み | Git はどう解決するか |
|---|---|
| ファイル名地獄 | 変更のたびに自動で版を記録するので、手動で名前を変える必要がない |
| 壊したら戻れない | いつでも過去の好きな版に戻せる |
| 共同作業が難しい | それぞれが自分のブランチで作業し、最後に自動で統合できる |
Git とは?
Section titled “Git とは?”一言で言うと、Git はコードのバージョン管理ツールです。コードの変更を1つ1つ記録してくれるので、履歴の確認、版の巻き戻し、他人との共同作業がいつでもできます。
重要なポイントは次のとおりです。
- Git は無料のオープンソースです
- Git はローカルで使えるツールです。ネットにつながっていなくても使えます(GitHub は Git のオンラインホスティングサービスであり、Git そのものではありません)
- Git は業界標準です。ほとんどすべてのソフトウェア企業、ほとんどすべてのオープンソースプロジェクトが Git を使っています
- Git は Linux の生みの親 Linus Torvalds によって 2005 年に作られました
Git の4つの核心概念
Section titled “Git の4つの核心概念”Git を賢い保存システムだと考えてみましょう。あなたが大きなゲーム(コードを書くこと)を遊んでいるとき、Git がいつでもセーブとロードを手伝ってくれます。
概念1:リポジトリ(Repository)
Section titled “概念1:リポジトリ(Repository)”リポジトリ = Git に管理されているプロジェクトフォルダです。
普通のフォルダと Git リポジトリの違いは、ふつうのノートと「すべての変更履歴」が残る魔法のノートの違いのようなものです。
# ある普通のフォルダを Git リポジトリにするcd my-projectgit initgit init を実行すると、フォルダの中に隠しディレクトリ .git が追加されます。ここが Git がすべての版情報を保存する場所です。中を開く必要はありません。そこにあると知っていれば十分です。
概念2:ステージングエリア(Staging Area)
Section titled “概念2:ステージングエリア(Staging Area)”これは Git のとても独特な設計です。ステージングエリアは「コミットする準備」をする中間地点です。
引っ越しにたとえると、
- 部屋の中にたくさん物がある(作業ディレクトリ —— 今まさに編集しているファイル)
- その中から運ぶ物を選んで玄関に置く(ステージングエリア —— 選んで、記録する準備ができたファイル)
- 引っ越し業者が来て、玄関の物をトラックに積んで運ぶ(コミット —— 変更を正式に記録する)
# 3つのファイルを変更した:model.py、train.py、notes.txt
# model.py と train.py だけを「玄関」(ステージングエリア)に置くgit add model.py train.py
# notes.txt はまだ「部屋の中」に残す。今回はコミットしないなぜステージングエリアが必要なのでしょうか? 5つのファイルを同時に変更していても、今回記録したいのはそのうち2つだけ、ということがあるからです。ステージングエリアがあることで、毎回のコミットに含める変更を正確にコントロールできます。
概念3:コミット(Commit)
Section titled “概念3:コミット(Commit)”コミット = 1回分の正式な版記録です。ゲームのセーブポイントのようなものです。
各コミットには次の情報が含まれます。
- どのファイルが変更されたか
- 具体的に何が変わったか(どの行に何を追加したか、何を削除したか)
- いつコミットしたか
- 誰がコミットしたか
- どんな内容かを説明するメッセージ
git commit -m "モデル学習時の学習率が大きすぎる bug を修正"-m の後ろの文字列はコミットメッセージで、今回の変更内容を説明します。よいコミットメッセージは、自分以外の人(未来の自分も含む)が見ても、何を変えたのかすぐわかるものです。
プロジェクトのコミット履歴は、たとえば次のようになります。
| 順番 | メッセージ | 位置 |
|---|---|---|
| コミット #5 | データ拡張機能を追加 | 最新 |
| コミット #4 | 学習率が大きすぎる bug を修正 | |
| コミット #3 | CNN モデル定義を追加 | |
| コミット #2 | データ読み込みモジュールを完成 | |
| コミット #1 | プロジェクト初期化、README を追加 | 最初 |
いつでも好きなコミットに戻れます。ゲームのセーブデータを読み込むようなものです。
概念4:ブランチ(Branch)
Section titled “概念4:ブランチ(Branch)”ブランチ = 独立した開発ラインです。平行世界のようなものです。
あなたのプロジェクトを1本のメイン道路(main ブランチ)だと想像してください。新しい機能(たとえばモデル構造を変える)を試したいけれど、成功するかはまだわかりません。メインの道路をいじりたくはありません。壊れたら困るからです。
そんなときは、メイン道路から新しい道(新しいブランチ)を分岐させます。その道で自由に試せます。うまくいったらメイン道路に戻して統合し、失敗したらその道を削除するだけです。メイン道路にはまったく影響しません。
main ブランチ: ● ─── ● ─── ● ─── ● ─── ● (安定したコード) \ ↗feature ブランチ: ● ─── ● (新機能を試す)ブランチについては後の章で詳しく説明します。今は存在だけ覚えておけば大丈夫です。
完全な作業フロー(まず全体像を見る)
Section titled “完全な作業フロー(まず全体像を見る)”Git でコードを管理する一連の流れは次のとおりです。
ファイルを変更する → 記録するファイルを選ぶ(add) → 正式に記録する(commit) → クラウドへ送る(push) 作業ディレクトリ ステージングエリア ローカルリポジトリ リモートリポジトリ(GitHub)具体例を見てみましょう。
# 1. 新しいモデルファイルを書いた# (このときファイルは「作業ディレクトリ」にあり、Git は変更を知っているが、まだ記録していない)
# 2. ステージングエリアに入れるgit add model.py
# 3. 正式にコミットする(この変更を記録する)git commit -m "ResNet モデル定義を追加"
# 4. GitHub に push する(クラウド側にもこの記録を置く)git pushGit のインストール
Section titled “Git のインストール”# 方法1:Homebrew を使う(おすすめ)brew install git
# 方法2:ターミナルで git を直接入力すると、macOS が Xcode Command Line Tools のインストールを案内するgit --versionUbuntu / Debian
Section titled “Ubuntu / Debian”sudo apt updatesudo apt install gitWindows
Section titled “Windows”# winget を使うwinget install Git.Git
# インストール後にターミナルを再起動して、確認するgit --versionまた、git-scm.com からインストーラーをダウンロードすることもできます。インストール中は基本的にデフォルトのままで大丈夫です。
インストール確認
Section titled “インストール確認”git --version# 例: git version 2.43.0バージョン番号が表示されれば、インストール成功です。
Git をインストールしたら、まず「あなたが誰か」を Git に伝える必要があります。この情報は、今後のコミット記録に表示されます。
# 名前を設定する(英語推奨。GitHub に表示されます)git config --global user.name "Zhang San"
# メールアドレスを設定する(GitHub 登録時と同じものがおすすめ)
# デフォルトのブランチ名を main に設定する(新しい Git の標準)git config --global init.defaultBranch main
# 設定を確認するgit config --listちょっと試してみよう
Section titled “ちょっと試してみよう”では、最初の Git リポジトリを作って、全体の流れを体験してみましょう。
# 新しいプロジェクトを作るmkdir my-first-repocd my-first-repo
# Git リポジトリを初期化するgit init# 出力: Initialized empty Git repository in .../my-first-repo/.git/
# ファイルを作るecho "# 私の最初の Git リポジトリ" > README.mdecho "print('Hello Git!')" > hello.py
# 状態を確認する——Git はどのファイルに変更があるか教えてくれるgit status# README.md と hello.py が赤色(未追跡ファイル)で表示される
# ファイルをステージングエリアに追加するgit add .# "." は現在のディレクトリ内のすべてのファイルを意味する
# もう一度状態を確認する——ファイルが緑色(ステージ済み、コミット準備完了)になるgit status
# コミットする!git commit -m "プロジェクト初期化:README と hello.py を追加"# 出力: [main (root-commit) abc1234] プロジェクト初期化:README と hello.py を追加
# コミット履歴を見るgit log --oneline# 出力: abc1234 プロジェクト初期化:README と hello.py を追加おめでとうございます。これで初めての Git コミットが完了しました。
次に、ファイルを少し変更して、もう1回コミットしてみましょう。
# hello.py を変更するecho "print('Hello Git! I am learning AI.')" > hello.py
# 何が変わったかを見るgit diff# 変更内容が赤/緑でハイライト表示される
# 追加してコミットするgit add hello.pygit commit -m "挨拶文を更新する"
# 履歴を確認する——これで2件の記録があるgit log --oneline# 出力:# def5678 挨拶文を更新する# abc1234 プロジェクト初期化:README と hello.py を追加2回コミットすれば、2つのセーブポイントができたことになります。いつでもどちらにも戻れます。
レビュー観点と通過基準
このページの合格基準は、コマンドを入力したことではなく、Git の 3 つの状態の流れを説明できることです。
最小証拠は次の通りです。
- 最初の commit 後、
git log --onelineに初期 commit がある。 - 2 回目の変更後、
git diffが具体的な差分を示す。 git add後、git statusで staged 状態を説明できる。- 2 回目の commit 後、履歴に 2 件の commit がある。
- 各 commit 後、
git statusが clean に戻る。
modified や untracked が残る場合は、branch に進む前に working tree -> staging area -> committed history の流れを確認します。
| 概念 | 一言でいうと | たとえ |
|---|---|---|
| リポジトリ | Git に管理されているプロジェクトフォルダ | 「やり直し履歴」がある魔法のノート |
| ステージングエリア | コミット準備中の中間地点 | 引っ越しで玄関に置いて積み込み待ちの物 |
| コミット | 1回分の正式な版記録 | ゲームのセーブ |
| ブランチ | 独立した開発ライン | 平行世界 |
| 作業ディレクトリ | いま編集しているファイル | いま書いている下書き |