第2部:基礎知識 / 第4章:バージョン管理

バージョン管理の基礎

ソフトウェア開発で必須の「バージョン管理」の基本的な考え方と目的を理解しましょう。

📖 読了目安 約12分 対象:開発の基本を学びたい全ての方

バージョン管理とは

バージョン管理とは、ファイルの変更履歴を記録し、管理する仕組みです。

バージョン管理がない場合の問題

バージョン管理がない状態で複数人が開発すると、こんな問題が起きます。

プロジェクト/
├── main_最新.java
├── main_最新_修正版.java
├── main_最新_修正版_田中確認済.java
├── main_最新_修正版_田中確認済_佐藤修正.java
├── main_バックアップ_0515.java
└── main_本番用_最終版_本当の最終版.java

よくある問題

  • どれが最新か分からない
  • 誰が何を変更したか分からない
  • 過去の状態に戻せない
  • 複数人の変更が上書きされる
  • 「動いていたのに動かなくなった」原因が分からない

バージョン管理があると

バージョン管理システムを使うと、これらの問題が解決します。

main.java(常に1つ)
    ↓
履歴が自動で記録される
    ├── 変更1: 「ログイン機能追加」田中 2024/01/15
    ├── 変更2: 「バグ修正」佐藤 2024/01/16
    ├── 変更3: 「パスワード検証追加」田中 2024/01/17
    └── ...

バージョン管理の目的

バージョン管理が必要なのは、以下のような課題に対応するためです。

1. 変更履歴の記録

いつ、誰が、何を変更したかが記録されます。

記録される情報
いつ2024/01/15 10:30
誰が田中太郎
何をログイン機能を追加
どこをLoginController.java、User.java
なぜ(コミットメッセージに記載)

この情報があれば、後から「このコード、なぜこう書いてあるんだろう?」と思ったときに、変更当時の背景や理由が分かります。

2. 過去の状態に戻せる

問題が起きたとき、動いていた時点の状態に戻せます

今日のバージョン → 動かない
    ↓ 戻す
昨日のバージョン → 動く!
  • 「昨日は動いていた」→ 昨日の状態に戻せる
  • 「この変更が原因だ」→ その変更前に戻せる
  • 「やっぱり前のほうがよかった」→ 元に戻せる

開発中は試行錯誤がつきものですが、バージョン管理があれば安心して実験できます。問題があってもいつでも戻れるので、恐れず新しいことに挑戦できるのです。

3. 複数人での同時作業

バージョン管理がないと、同じファイルを複数人が編集すると上書きされてしまいます。

バージョン管理なし:
田中: ファイルAを編集 → 保存
佐藤: 同じファイルAを編集 → 保存(田中の変更が消える)

バージョン管理があると、変更を統合(マージ)できます。

バージョン管理あり:
田中: ファイルAを編集 → 記録
佐藤: 同じファイルAを編集 → 記録
      ↓
システムが両方の変更を統合

複数人が同じファイルに手を入れても、両方の変更が失われません。場合によっては自動的に統合でき、競合が発生しても解決できます。

4. ブランチによる並行開発

ブランチを使うと、メインの開発と別に作業できます。

flowchart TD
    A["本番用メイン"] -->|新機能開発| B["新機能ブランチ"]
    A -->|バグ修正| C["バグ修正ブランチ"]
    B -->|完成| D["メインに統合"]
    C -->|完成| E["メインに統合"]
  • 新機能を開発中でも、本番用のバグ修正ができる
  • 試験的な変更を、本番に影響なく試せる
  • 完成したらメインに統合(マージ)

ブランチなしでは、すべての開発が本番のファイルに反映されるため、不完全な新機能が本番環境に行ってしまう危険があります。ブランチを使うことで、完成した機能だけを本番に入れるという制御ができます。

バージョン管理システムの種類

集中型と分散型

種類特徴代表例
集中型サーバーで履歴を一元管理SVN(Subversion)
分散型各自のPCにも履歴があるGit

現在の主流:Git

Gitが現在のデファクトスタンダードです。

  • ほとんどの現場で使われている
  • GitHub、GitLabなどのサービスと連携
  • オープンソースプロジェクトの標準

ただし、古いプロジェクトや大企業ではSVNが使われていることもあります。両方の基本を知っておくと、どちらの現場でも対応できます。

バージョン管理の基本用語

リポジトリ(Repository)

変更履歴を保存する場所です。「履歴の倉庫」と考えてください。

  • リモートリポジトリ:サーバー上のリポジトリ(チームで共有)
  • ローカルリポジトリ:自分のPC上のリポジトリ(Gitの場合)

コミット(Commit)

変更を記録することです。「セーブポイント」のようなものです。

コミット1: 「ログイン機能追加」
    ↓
コミット2: 「バグ修正」
    ↓
コミット3: 「パスワード検証追加」

コミットごとに、その時点のファイル状態が記録されます。

ブランチ(Branch)

開発の分岐です。メインとは別に作業できます。

main ──────────────────────────→
       │                    ↑
       └── feature-login ───┘(完成したら統合)

マージ(Merge)

分岐したブランチを統合することです。

プル/プッシュ(Pull/Push)

  • プル:リモートの変更を取得する(ダウンロード)
  • プッシュ:ローカルの変更を送信する(アップロード)

バージョン管理を使うメリット

開発者にとって

メリット説明
安心して変更できる失敗しても戻せる
変更理由が分かるなぜこう書いたか履歴を見れば分かる
複数人で作業できる同じファイルを同時に編集しても大丈夫
問題の原因を特定できるいつの変更で壊れたか分かる

チームにとって

メリット説明
コードレビューができる変更内容を確認してからマージ
責任の明確化誰が何を変更したか記録される
並行開発ができる複数の機能を同時に開発
リリース管理ができるバージョンごとにタグをつけて管理

1年目エンジニアが意識すること

基本的な操作を覚える

  1. プル:作業前に最新を取得
  2. 変更:コードを編集
  3. コミット:変更を記録(意味のあるメッセージをつける)
  4. プッシュ:リモートに送信

コミットメッセージを丁寧に書く

  • ❌ 悪い例:「修正」「fix」「更新」
  • ⭕ 良い例:「ログイン時のパスワード検証を追加」
  • ❌ NullPointerExceptionを修正
  • ⭕ NullPointerExceptionを修正(ユーザーが未登録の場合)
  • ❌ 商品一覧を修正
  • ⭕ 商品一覧の表示速度を改善

後から履歴を見たときに何をしたか分かるようにします。これは自分の為にもなりますし、チーム全体の知的資産になります。

こまめにコミットする

  • 1つの作業単位でコミット
  • 「動く状態」でコミット
  • 長時間コミットしないと、問題の特定が難しくなる

困ったら先輩に聞く

  • コンフリクト(競合)が起きたら
  • プッシュできないとき
  • 履歴がおかしくなったとき

バージョン管理の操作を間違えると影響が大きいので、分からないときは必ず確認しましょう。

まとめ

概念説明
バージョン管理ファイルの変更履歴を記録・管理する仕組み
リポジトリ履歴を保存する場所
コミット変更を記録すること
ブランチ開発の分岐、並行作業ができる
マージブランチを統合すること
プル/プッシュリモートとの同期

バージョン管理で得られること

  • 変更履歴の記録(いつ、誰が、何を)
  • 過去の状態に戻せる
  • 複数人での同時作業
  • ブランチによる並行開発

具体的なツールの使い方は以下を参照してください: