バージョン管理の基礎
ソフトウェア開発で必須の「バージョン管理」の基本的な考え方と目的を理解しましょう。
バージョン管理とは
バージョン管理とは、ファイルの変更履歴を記録し、管理する仕組みです。
バージョン管理がない場合の問題
バージョン管理がない状態で複数人が開発すると、こんな問題が起きます。
プロジェクト/
├── 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. ブランチによる並行開発
ブランチを使うと、メインの開発と別に作業できます。
メインの開発(本番用)─────────────────→
│
└── 新機能の開発(別ブランチ)──→ 完成したらメインに統合
│
└── バグ修正(別ブランチ)────→ 完成したらメインに統合
- 新機能を開発中でも、本番用のバグ修正ができる
- 試験的な変更を、本番に影響なく試せる
- 完成したらメインに統合(マージ)
バージョン管理システムの種類
集中型と分散型
| 種類 | 特徴 | 代表例 |
|---|---|---|
| 集中型 | サーバーで履歴を一元管理 | SVN(Subversion) |
| 分散型 | 各自のPCにも履歴がある | Git |
現在の主流:Git
Gitが現在のデファクトスタンダードです。
- ほとんどの現場で使われている
- GitHub、GitLabなどのサービスと連携
- オープンソースプロジェクトの標準
ただし、古いプロジェクトや大企業ではSVNが使われていることもあります。
バージョン管理の基本用語
リポジトリ(Repository)
変更履歴を保存する場所です。「履歴の倉庫」と考えてください。
- リモートリポジトリ:サーバー上のリポジトリ(チームで共有)
- ローカルリポジトリ:自分のPC上のリポジトリ(Gitの場合)
コミット(Commit)
変更を記録することです。「セーブポイント」のようなものです。
コミット1: 「ログイン機能追加」
↓
コミット2: 「バグ修正」
↓
コミット3: 「パスワード検証追加」
コミットごとに、その時点のファイル状態が記録されます。
ブランチ(Branch)
開発の分岐です。メインとは別に作業できます。
main ──────────────────────────→
│ ↑
└── feature-login ───┘(完成したら統合)
マージ(Merge)
分岐したブランチを統合することです。
プル/プッシュ(Pull/Push)
- プル:リモートの変更を取得する(ダウンロード)
- プッシュ:ローカルの変更を送信する(アップロード)
バージョン管理を使うメリット
開発者にとって
| メリット | 説明 |
|---|---|
| 安心して変更できる | 失敗しても戻せる |
| 変更理由が分かる | なぜこう書いたか履歴を見れば分かる |
| 複数人で作業できる | 同じファイルを同時に編集しても大丈夫 |
| 問題の原因を特定できる | いつの変更で壊れたか分かる |
チームにとって
| メリット | 説明 |
|---|---|
| コードレビューができる | 変更内容を確認してからマージ |
| 責任の明確化 | 誰が何を変更したか記録される |
| 並行開発ができる | 複数の機能を同時に開発 |
| リリース管理ができる | バージョンごとにタグをつけて管理 |
1年目エンジニアが意識すること
基本的な操作を覚える
- プル:作業前に最新を取得
- 変更:コードを編集
- コミット:変更を記録(意味のあるメッセージをつける)
- プッシュ:リモートに送信
コミットメッセージを丁寧に書く
悪い例:
「修正」
「fix」
「更新」
良い例:
「ログイン時のパスワード検証を追加」
「NullPointerExceptionを修正(ユーザーが未登録の場合)」
「商品一覧の表示速度を改善」
後から履歴を見たときに何をしたか分かるようにします。
こまめにコミットする
- 1つの作業単位でコミット
- 「動く状態」でコミット
- 長時間コミットしないと、問題の特定が難しくなる
困ったら先輩に聞く
- コンフリクト(競合)が起きたら
- プッシュできないとき
- 履歴がおかしくなったとき
バージョン管理の操作を間違えると影響が大きいので、分からないときは必ず確認しましょう。
まとめ
| 概念 | 説明 |
|---|---|
| バージョン管理 | ファイルの変更履歴を記録・管理する仕組み |
| リポジトリ | 履歴を保存する場所 |
| コミット | 変更を記録すること |
| ブランチ | 開発の分岐、並行作業ができる |
| マージ | ブランチを統合すること |
| プル/プッシュ | リモートとの同期 |
バージョン管理で得られること:
- 変更履歴の記録(いつ、誰が、何を)
- 過去の状態に戻せる
- 複数人での同時作業
- ブランチによる並行開発
具体的なツールの使い方は以下を参照してください: