開発ツール

Gitの仕組み

「Git?バージョン管理?」と聞いてもピンとこない。
ひとことで言うと ──

Git = コードの「タイムマシン」

いつでも過去の状態に戻れて、複数人で同時に安全に作業できる仕組み

作業ディレクトリ
ファイルを編集
git add
ステージング
記録する変更を選ぶ
「次のセーブに含める」
commit
リポジトリ
変更履歴を保管
push でクラウドへ送信 / pull でクラウドから取得
似た体験、ありますよね
ゲームのセーブ&ロード
Googleドキュメントの変更履歴
Ctrl+Z で「元に戻す」
Dropboxの過去バージョン復元

ここから先で、この仕組みをひとつずつ丁寧に解説していきます。

そもそもGitって何?

Gitはコードの「セーブ&ロード」ができるツールです。

ゲームで考えるGitの役割

RPG — ボス戦前
セーブデータ
セーブ
ロード
Slot 1 5分前 — ボス戦前
Slot 2 3時間前 — 街の探索中
Slot 3 昨日 — 前の街

Gitはこの「セーブ&ロード」を、コードに対してやってくれるツール

もしGitがなかったら、コードの管理はこうなります。

BEFORE — Gitがない世界
  • ファイル名が「企画書_最終版_v2_本当の最終版.docx」だらけになる
  • 同僚の変更で自分が書いたコードが上書きされて消える
  • 「昨日まで動いてたのに...」と途方に暮れる
  • なぜこの変更をしたのか、理由を誰も覚えていない
元に戻したくても戻せない。原因の特定に何時間もかかる。
AFTER — Gitがある世界
  • すべての変更に日時・作者・説明メッセージが自動で付く
  • 複数人が同時に編集しても安全に統合(マージ)できる
  • 任意の過去の状態にいつでも一瞬で戻せる
  • 「誰が、いつ、なぜ変えたか」が全部記録されている
怖がらずに変更でき、問題があってもすぐ原因を特定できる。
技術的な定義

Git = ファイルの変更履歴を記録・追跡し、 いつでも過去の状態に復元できる分散型バージョン管理システム

出典: git-scm.com — About Git

Gitは2005年に、Linux(リナックス)というOSを開発したリーナス・トーバルズが作りました。Linuxは世界中の何百人もの開発者が同時にコードを変更するプロジェクトです。その膨大な変更を安全に管理するために生まれたのがGitでした。つまりGitは最初から、大規模なチーム開発のために設計されたツールなのです。

ここがポイント

Gitは「コードのタイムマシン」であり、同時に「チームの交通整理係」でもあります。過去に戻る力と、複数人の作業を安全にまとめる力。この2つがGitの本質です。現在、プロの開発者の96%がGitを使っています

出典: Stack Overflow Developer Survey 2022

Gitの「3つの場所」を理解する

Gitを使うとき、ファイルは3つの場所を行き来します。この3つの関係がわかれば、Gitの仕組みの大半は理解できたと言っても過言ではありません。

わかりやすいように、「手紙を書いて送る」プロセスにたとえてみましょう。

Gitの3つの場所 — 手紙で考える

作業ディレクトリ
Working Directory
手紙を書いている机
git add
ステージング
Staging Area
封筒に入れた手紙
commit
リポジトリ
Repository
郵便局の配達記録
過去のどの記録にも、いつでも戻れる

作業ディレクトリ(Working Directory)

あなたが実際にファイルを編集している場所です。手紙のたとえで言えば、机の上で手紙を書いたり、消しゴムで書き直したりしている段階です。この段階の変更はまだGitに記録されていません。ただの「書きかけ」の状態です。自由に書き直し、試行錯誤できます。

ステージングエリア(Staging Area)

「次のコミットに含める変更」を選んで置いておく場所です。手紙のたとえで言えば、書き終わった手紙を封筒に入れた状態です。まだポストに投函していないので、「やっぱりこの手紙は出さない」と封筒から出すこともできます。「10ファイル変更したけど、今回は3ファイルだけ記録したい」ということが可能になるのが、この場所の存在意義です。

リポジトリ(Repository)

変更履歴が永久に保管される場所です。手紙のたとえで言えば、郵便局が「いつ、誰が、どんな手紙を送ったか」をすべて記録しているのと同じです。リポジトリに記録された変更(これをコミット(Commit)と呼びます)は消えることがなく、いつでも確認でき、いつでもその時点の状態に戻れます。

なぜ「ステージング」が必要なの?

「編集したら即座に記録すればいいのでは?」と思うかもしれません。しかし実際の開発では、バグ修正と新機能の追加を同時進行していることがよくあります。ステージングがあることで、「バグ修正だけ先に記録して、新機能の開発は後から記録する」という意味のある単位で履歴を残すことができるのです。これにより、後から「どの変更が原因でバグが起きたか」を特定しやすくなります。

基本操作の流れ — edit, add, commit, push

Gitの日常的な作業は、たった4つのステップの繰り返しです。開発者が毎日何十回と繰り返すこの流れを、順番に見ていきましょう。

Gitの基本サイクル

1
ファイルを編集
コードを書く・修正する
(ここはGit関係なし)
2
git add
記録したいファイルを
ステージングに追加する
3
git commit
ステージングの内容を
メッセージ付きで記録
4
git push
ローカルの記録を
クラウドに送信する

では実際に、ターミナル(コマンドを入力する黒い画面)で打つコマンドを見てみましょう。たったこれだけのコマンドで、変更が記録されてクラウドに送信されます。

ターミナル — Gitの基本操作
# 1. ファイルを編集する(普通にコードを書く。Gitの操作は不要)

# 2. 変更したファイルをステージングに追加する
$ git add index.html

# 3. メッセージ付きで変更を記録する
$ git commit -m "ログインページのデザインを変更"

# 4. 記録をリモート(クラウド)に送信する
$ git push origin main

コマンドの解説(1つずつ読み解く)

add git add index.html は「index.htmlの変更を、次のコミットに含める」という宣言です。複数ファイルをスペース区切りで指定したり、git add . で全ファイルを一括追加することもできます。手紙のたとえで言えば「この手紙を封筒に入れる」にあたります。
commit git commit -m "メッセージ" は「ステージングの内容を、説明メッセージ付きで永久に記録する」コマンドです。-m はmessage(メッセージ)の頭文字。ゲームで言えば「セーブする」瞬間です。メッセージには「何を、なぜ変えたか」を簡潔に書きます。
push git push origin main は「自分のパソコンに記録した履歴を、GitHubなどのクラウドに送信する」コマンドです。origin はリモートリポジトリのデフォルト名、main はブランチ名(次のセクションで説明します)です。

逆に、チームメンバーがクラウドに送った変更を自分のパソコンに取り込むときは、git pull を使います。

ターミナル — 履歴の取得と確認
# リモートの最新状態を自分のパソコンに取り込む
$ git pull origin main

# 変更履歴を確認する(誰が何をしたか一覧で見える)
$ git log --oneline
a1b2c3d ログインページのデザインを変更
e4f5g6h ユーザー登録機能を追加
i7j8k9l データベース接続設定を修正

覚えるのは4つだけ

日常的に使うGitコマンドは、add(選ぶ) → commit(記録する) → push(送る) → pull(もらう)の4つです。この4つさえ覚えれば、基本的なバージョン管理はすぐに始められます。実際の開発で使うコマンドの大半は、この4つの組み合わせです。

ブランチ — 平行世界で安全に実験する

Gitの最も強力な機能のひとつがブランチ(Branch = 枝)です。ブランチとは、開発のメインラインから「枝分かれ」して、独立した作業空間を作る仕組みのことです。

たとえ話で考えてみましょう。あなたは小説を書いています。本筋はほぼ完成していますが、「この登場人物を追加したらどうなるだろう?」と実験したい。でも本筋を直接書き換えて失敗したら大変です。そこで原稿をまるごとコピーして、コピーの方で思い切り実験する。うまくいったら本筋に反映する。ダメだったらコピーを捨てるだけ。これがブランチの考え方です。

ブランチの流れ — 3ステップ

1
枝分かれ(branch)
mainブランチから
新しいブランチを作成
(コピーのようなもの)
2
自由に開発
ブランチ上で自由に
コードを変更する
(mainには一切影響なし)
3
統合(merge)
完成したらmainに
マージして合流
(失敗なら捨てるだけ)

ここでのポイントは、featureブランチでの作業中も、mainブランチには一切影響がないということです。小説のたとえで言えば、コピー原稿をどんなに書き換えても、金庫にしまった本筋の原稿は無傷のまま。だからこそ安心して大胆な実験ができるのです。

ターミナル — ブランチの基本操作
# 新しいブランチを作って、そこに切り替える
$ git switch -c feature-login

# ブランチ上で自由にコードを書く(mainには影響しない)
$ git add login.html
$ git commit -m "ログイン機能を実装"

# mainブランチに戻る
$ git switch main

# featureブランチの変更をmainに統合する
$ git merge feature-login

mainを壊さない安全性

実験的な変更はブランチ上で行い、完成してからmainに統合する。本番環境が壊れるリスクを大幅に減らせます。

同時並行で作業できる

Aさんはログイン機能、Bさんは検索機能と、それぞれ別のブランチで独立して開発を進められます。お互いの作業が衝突しません。

GitとGitHubは別物

「Git」と「GitHub(ギットハブ)」は名前が似ていますが、まったく別のものです。混同している人がとても多いので、ここで明確に区別しておきましょう。ひとことで言えば、GitはWordのような「ツール」、GitHubはGoogle Driveのような「サービス」です。

Git

ツール(ソフトウェア)
  • 自分のパソコンにインストールして使う
  • ファイルのバージョン管理機能を提供
  • コマンドライン(ターミナル)で操作
  • 完全無料のオープンソースソフトウェア
インターネットなしでも使える

GitHub

Webサービス(プラットフォーム)
  • インターネット上で動くクラウドサービス
  • Gitリポジトリのホスティング(保管場所)を提供
  • ブラウザ上でコードレビューや議論ができる
  • 無料プランと有料プランがある
世界で1億人以上の開発者が利用

身近なたとえで整理すると

Git
Wordのような
「文書作成ツール」
:
GitHub
Google Driveのような
「クラウド保管&共有サービス」

Wordがなくてもファイルは作れるし、Google Driveがなくてもファイルは保存できる。でも両方使うと圧倒的に便利。

GitHub以外の選択肢もある

GitHubは最も有名ですが、同じ「Gitリポジトリのホスティングサービス」にはGitLabBitbucketもあります。どれも中身で使っている技術はGitです。Gmail、Outlook、Yahoo!メールのように、「サービスは違うけど、やっていることは同じ(メールの送受信)」というイメージに近いです。

よくある誤解

Gitについて学び始めると、多くの人が同じところでつまずきます。ここでは、よくある3つの誤解を取り上げて、正しい理解に修正します。

誤解: 「Gitはプログラマーだけが使うもの」

実際は:

Gitはテキストファイルならなんでもバージョン管理できます。デザイナーがデザインデータを管理したり、ライターが原稿の変更履歴を追ったり、研究者が論文の共同執筆に使ったり。「ファイルの変更を追いたい」すべての人にとって有益なツールです。

誤解: 「一度削除したファイルは戻せない」

実際は:

Gitで一度コミットした変更は、事実上消えません。ファイルを削除しても、過去のコミットにそのファイルが存在していた記録が残っています。git checkoutgit restore コマンドで、過去の状態からいつでも復元できます。まさに「タイムマシン」の真骨頂です。

誤解: 「Gitを使うにはインターネットが必要」

実際は:

Gitは「分散型」のバージョン管理システムです。「分散型」とは、リポジトリの完全なコピーが自分のパソコンにあるという意味です。だからインターネットに接続していなくても、コミット(記録)も履歴の確認もブランチの作成もすべてできます。インターネットが必要になるのは、pushやpullでクラウド上のリモートリポジトリとやり取りするときだけです。飛行機の中でもコーディングとコミットは問題なくできます。

まとめ — 覚えておきたい3つのこと

最後に、この図解で伝えたかったことを3つに絞ってまとめます。

01

Gitは「コードのタイムマシン」

ファイルの変更を「いつ、誰が、何を、なぜ」変えたかという情報とともに記録し、いつでも過去の状態に戻れます。ゲームのセーブ&ロードを、コードの世界で実現する仕組みです。

02

基本は「add → commit → push → pull」の4つ

作業ディレクトリ・ステージング・リポジトリの3つの場所を、4つのコマンドでファイルが行き来する。この流れさえ理解すれば、Gitの基本操作は身につきます。

03

ブランチで「安全な実験場」を作れる

メインの開発ラインを壊さずに新しい機能を試せるブランチの仕組みが、Gitの最大の武器です。チーム全員が安心して同時に開発を進められます。

Gitは、現代のソフトウェア開発を支える「共通言語」です。

世界中の開発者の96%が使うGit。最初はコマンドに戸惑うかもしれませんが、基本の4つのコマンドを覚えれば、もう「最終版_v2_本当の最終版」に悩まされることはありません。まずは小さなプロジェクトで git init と打つところから始めてみてください。

出典: git-scm.com / Stack Overflow Developer Survey 2022