SubversionからGitへの移行ガイド
(トップページはこちら) - (Gitで始める効率的な開発ワークフロー)
1. 用語と概念の対応
SubversionとGitは、バージョン管理という目的は同じですが、設計思想が異なります。まず用語の対応を把握することで、混乱を避けられます。
1.1 基本操作の対応表
| Subversion | Git | 備考 |
|---|---|---|
| svn checkout URL | git clone URL | リポジトリ全体を取得 |
| svn update | git pull | 最新の変更を取得してマージ |
| svn commit | git commit + git push | Gitは2段階 |
| svn add | git add | 変更をステージング |
| svn status | git status | 作業ツリーの状態確認 |
| svn log | git log | コミット履歴の確認 |
| svn diff | git diff | 差分の確認 |
| svn revert | git restore / git checkout | 変更の破棄 |
| svn merge | git merge | ブランチのマージ |
1.2 GUIツールの対応
| Subversion | Git | 備考 |
|---|---|---|
| TortoiseSVN | TortoiseGit | Windowsエクスプローラー統合型 |
| - | SourceTree | クロスプラットフォーム |
| - | GitKraken | クロスプラットフォーム |
| - | GitHub Desktop | シンプルなGUI |
TortoiseSVNユーザーにとって、TortoiseGitは操作感が似ているため、移行しやすいツールです。右クリックメニューからの操作という基本的なUIは共通しています。
1.3 リビジョン管理の違い
Subversion
- リビジョン番号:r1, r2, r3...(連番)
- 中央サーバーで一元管理
- リビジョン番号でバージョンを特定
Git
- コミットハッシュ:a1b2c3d...(SHA-1)
- 分散管理
- ハッシュ値でコミットを特定
コマンドライン
# Subversionでの履歴確認
svn log -r 1234
# Gitでの履歴確認
git log a1b2c3d
git log --oneline # 短縮表示
TortoiseSVN / TortoiseGit
- TortoiseSVN:フォルダを右クリック → 「TortoiseSVN」→「Show log」
- TortoiseGit:フォルダを右クリック → 「TortoiseGit」→「Show log」
操作方法はほぼ同じですが、表示される識別子が異なります。
2. 重要な概念の違い
2.1 中央集権型と分散型
2.2 ステージングエリア(インデックス)
Gitには、Subversionにない「ステージングエリア」という概念があります。
Subversionの場合
コマンドライン:
# 編集したファイルは即座にコミット対象
svn commit -m "メッセージ"
TortoiseSVN:
- フォルダを右クリック
- 「SVN Commit...」を選択
- コミットするファイルを選択してコミット
Gitの場合
コマンドライン:
# ファイルを編集
# ステージング(コミット対象として登録)
git add file.c
# コミット(ローカルリポジトリに記録)
git commit -m "メッセージ"
# リモートに送信
git push origin main
TortoiseGit:
- フォルダを右クリック
- 「Git Commit -> "main"...」を選択
- コミットするファイルにチェックを入れる(これがステージング)
- コミットメッセージを入力して「Commit」ボタン
- 「Push」ボタンでリモートに送信
TortoiseGitでは、ファイルのチェックボックスがステージングに相当します。TortoiseSVNと似ていますが、コミット後にさらにプッシュが必要な点が異なります。
この仕組みにより、以下が可能になります。
- 複数のファイルを編集しても、一部だけをコミットできる
- コミット前に変更内容を整理できる
- ファイルの一部分だけをコミットできる
3. 基本操作の実践
3.1 リポジトリの取得
3.1.1 コマンドライン
Subversion
svn checkout https://svn.example.com/repo/trunk myproject
cd myproject
Git
git clone https://git.example.com/repo.git
cd repo
3.1.2 GUIツール
TortoiseSVN
- 空のフォルダを作成
- フォルダを右クリック
- 「SVN Checkout...」を選択
- URLを入力して「OK」
TortoiseGit
- 空のフォルダを作成
- フォルダを右クリック
- 「Git Clone...」を選択
- URLを入力して「OK」
操作手順はほぼ同じです。
3.2 日常的な作業フロー
3.2.1 コマンドライン
Subversion
# 最新を取得
svn update
# ファイルを編集
vi src/main.c
# 状態確認
svn status
# コミット
svn commit -m "機能Aを追加"
Git
# 最新を取得
git pull origin main
# ファイルを編集
vi src/main.c
# 状態確認
git status
# 差分確認
git diff
# ステージング
git add src/main.c
# コミット(ローカル)
git commit -m "機能Aを追加"
# リモートに送信
git push origin main
3.2.2 GUIツール
TortoiseSVN
- フォルダを右クリック → 「SVN Update」で最新取得
- ファイルを編集
- フォルダを右クリック → 「SVN Commit...」
- コミットメッセージを入力して「OK」
TortoiseGit
- フォルダを右クリック → 「TortoiseGit」→「Pull...」で最新取得
- ファイルを編集
- フォルダを右クリック → 「Git Commit -> "main"...」
- 変更したファイルにチェックを入れる
- コミットメッセージを入力して「Commit」
- 「Push」ボタンをクリック(またはコミット後に右クリック → 「TortoiseGit」→「Push...」)
TortoiseGitでは、コミットとプッシュが分かれている点に注意が必要です。
3.3 ブランチ操作
3.3.1 コマンドライン
Subversion
# ブランチ作成(ディレクトリのコピー)
svn copy https://svn.example.com/repo/trunk \
https://svn.example.com/repo/branches/feature-a \
-m "ブランチ作成"
# ブランチに切り替え
svn switch https://svn.example.com/repo/branches/feature-a
Git
# ブランチ作成と切り替え(瞬時に完了)
git checkout -b feature-a
# または、2段階で
git branch feature-a
git checkout feature-a
# ブランチ一覧
git branch
# リモートブランチを含めた一覧
git branch -a
3.3.2 GUIツール
TortoiseSVN
- フォルダを右クリック → 「TortoiseSVN」→「Branch/tag...」
- From URLとTo URLを指定してブランチ作成
- 別途「Switch...」でブランチに切り替え
TortoiseGit
- フォルダを右クリック → 「TortoiseGit」→「Create Branch...」
- ブランチ名を入力
- 「Switch to new branch」にチェックを入れると、作成と同時に切り替え
TortoiseGitの方が操作が簡単です。Gitのブランチは、Subversionと違いディレクトリのコピーではなく、コミットへのポインタです。そのため、作成・切り替えが高速で、ストレージも消費しません。
3.4 マージ操作
3.4.1 コマンドライン
Subversion
# トランクに切り替え
svn switch https://svn.example.com/repo/trunk
# ブランチからマージ
svn merge https://svn.example.com/repo/branches/feature-a
# コミット
svn commit -m "feature-aをマージ"
Git
# mainブランチに切り替え
git checkout main
# 最新を取得
git pull origin main
# feature-aブランチをマージ
git merge feature-a
# リモートに送信
git push origin main
# 不要になったブランチを削除
git branch -d feature-a
3.4.2 GUIツール
TortoiseSVN
- トランクに切り替え(Switch...)
- フォルダを右クリック → 「TortoiseSVN」→「Merge...」
- マージ元のブランチURLを指定
- マージ実行
- コミット
TortoiseGit
- mainブランチに切り替え(Switch/Checkout...)
- フォルダを右クリック → 「TortoiseGit」→「Merge...」
- マージ元のブランチを選択
- 「OK」をクリック
- コミットとプッシュ
4. 履歴の確認と比較
4.1 ログの確認
4.1.1 コマンドライン
Subversion
# 基本的なログ
svn log
# リビジョン範囲を指定
svn log -r 100:200
# 詳細な差分付き
svn log -v -r 100
Git
# 基本的なログ
git log
# 簡潔な表示
git log --oneline
# グラフ表示
git log --graph --oneline --all
# 特定のファイルの履歴
git log src/main.c
# 最近の10件
git log -10
4.1.2 GUIツール
TortoiseSVN
- フォルダを右クリック → 「TortoiseSVN」→「Show log」
- リビジョン番号、作者、日時、コメントが一覧表示される
- リビジョンをダブルクリックで詳細確認
TortoiseGit
- フォルダを右クリック → 「TortoiseGit」→「Show log」
- コミットハッシュ(短縮形)、作者、日時、コメントが一覧表示される
- グラフビューで視覚的にブランチ構造を確認可能
- コミットをダブルクリックで詳細確認
TortoiseGitのログビューには、ブランチのマージ関係を示すグラフが表示されます。これはTortoiseSVNにはない機能で、複雑なブランチ構造を理解するのに役立ちます。
4.2 差分の確認
4.2.1 コマンドライン
Subversion
# 作業コピーとBASEの差分
svn diff
# 特定リビジョン間の差分
svn diff -r 100:200
Git
# 作業ディレクトリとステージングエリアの差分
git diff
# ステージングエリアとHEADの差分
git diff --cached
# 特定のコミット間の差分
git diff a1b2c3d..d4e5f6g
# ブランチ間の差分
git diff main..feature-a
4.2.2 GUIツール
TortoiseSVN
- ファイルを右クリック → 「TortoiseSVN」→「Diff」
- 差分表示ツール(TortoiseMerge)が起動
TortoiseGit
- ファイルを右クリック → 「TortoiseGit」→「Diff」
- 差分表示ツール(TortoiseGitMerge)が起動
- または、Show logから2つのコミットを選択して「Compare revisions」
差分表示ツールの使い方は、TortoiseSVNとTortoiseGitでほぼ同じです。
5. コンフリクトの解決
5.1 コマンドライン
5.1.1 Subversion
svn update
# コンフリクトが発生
# ファイルを編集して解決
vi conflicted-file.c
# 解決を宣言
svn resolved conflicted-file.c
# コミット
svn commit -m "コンフリクトを解決"
5.1.2 Git
git pull origin main
# コンフリクトが発生
# コンフリクトしているファイルを確認
git status
# ファイルを編集して解決
vi conflicted-file.c
# 解決したファイルをステージング
git add conflicted-file.c
# コミット
git commit -m "コンフリクトを解決"
# リモートに送信
git push origin main
5.2 GUIツール
5.2.1 TortoiseSVN
- Update時にコンフリクトが発生
- コンフリクトしたファイルを右クリック → 「TortoiseSVN」→「Edit conflicts」
- TortoiseMergeが起動し、3ペイン表示(自分の変更、元の状態、他人の変更)
- 手動で解決を選択
- 保存後、「Mark as resolved」
- コミット
5.2.2 TortoiseGit
- Pull時にコンフリクトが発生
- コンフリクトしたファイルを右クリック → 「TortoiseGit」→「Resolve conflict」
- 解決方法を選択:
- 「Edit conflicts」:TortoiseGitMergeで手動解決
- 「Resolve using 'mine'」:自分の変更を採用
- 「Resolve using 'theirs'」:相手の変更を採用
- 手動解決の場合、TortoiseGitMergeで編集
- 保存後、「Mark as resolved」
- コミットとプッシュ
解決の流れはTortoiseSVNとほぼ同じです。
コンフリクトマーカーは両方とも同じ形式です。
<<<<<<< HEAD
// 自分の変更
int result = calculate_new_way();
=======
// 他の人の変更
int result = calculate_old_way();
>>>>>>> branch-name
6. よくある操作の対応
6.1 ファイルの追加
6.1.1 コマンドライン
Subversion
vi new-file.c
svn add new-file.c
svn commit -m "新しいファイルを追加"
Git
vi new-file.c
git add new-file.c
git commit -m "新しいファイルを追加"
git push origin main
6.1.2 GUIツール
TortoiseSVN
- 新しいファイルを作成
- ファイルを右クリック → 「TortoiseSVN」→「Add...」
- フォルダを右クリック → 「SVN Commit...」
TortoiseGit
- 新しいファイルを作成
- フォルダを右クリック → 「Git Commit -> "main"...」
- 新しいファイルが自動的に表示される(チェックを入れる)
- コミットしてプッシュ
TortoiseGitでは、明示的な「Add」操作が不要な場合が多く、コミット時に新しいファイルが自動的にリストアップされます。
6.2 ファイルの削除
6.2.1 コマンドライン
Subversion
svn delete old-file.c
svn commit -m "不要なファイルを削除"
Git
git rm old-file.c
git commit -m "不要なファイルを削除"
git push origin main
6.2.2 GUIツール
TortoiseSVN
- ファイルを右クリック → 「TortoiseSVN」→「Delete」
- フォルダを右クリック → 「SVN Commit...」
TortoiseGit
- ファイルを右クリック → 「TortoiseGit」→「Delete and add to commit」
- または、通常の削除後、コミット時に削除として認識される
- コミットしてプッシュ
6.3 ファイルの移動・リネーム
6.3.1 コマンドライン
Subversion
svn move old-name.c new-name.c
svn commit -m "ファイル名を変更"
Git
git mv old-name.c new-name.c
git commit -m "ファイル名を変更"
git push origin main
6.3.2 GUIツール
TortoiseSVN
- ファイルを右クリック → 「TortoiseSVN」→「Rename...」
- 新しい名前を入力
- コミット
TortoiseGit
- ファイルを右クリック → 「TortoiseGit」→「Rename...」
- 新しい名前を入力
- コミットしてプッシュ
または、Windowsエクスプローラーで通常のリネームをしても、Gitが自動的に移動として認識します。
6.4 変更の取り消し
6.4.1 コマンドライン
Subversion
# 特定のファイルを元に戻す
svn revert modified-file.c
# すべてのファイルを元に戻す
svn revert -R .
Git
# 特定のファイルを元に戻す(ステージング前)
git restore modified-file.c
# 特定のファイルをステージングから外す
git restore --staged staged-file.c
# すべてのファイルを元に戻す
git restore .
6.4.2 GUIツール
TortoiseSVN
- ファイルを右クリック → 「TortoiseSVN」→「Revert...」
- 元に戻すファイルを選択して「OK」
TortoiseGit
- ファイルを右クリック → 「TortoiseGit」→「Revert...」
- 元に戻すファイルを選択して「OK」
操作方法は同じです。
7. タグ付け
7.1 コマンドライン
7.1.1 Subversion
# タグの作成(ディレクトリのコピー)
svn copy https://svn.example.com/repo/trunk \
https://svn.example.com/repo/tags/release-1.0 \
-m "バージョン1.0リリース"
7.1.2 Git
# 軽量タグの作成
git tag v1.0
# 注釈付きタグの作成(推奨)
git tag -a v1.0 -m "バージョン1.0リリース"
# タグ一覧
git tag
# タグをリモートに送信
git push origin v1.0
# すべてのタグを送信
git push origin --tags
7.2 GUIツール
7.2.1 TortoiseSVN
- フォルダを右クリック → 「TortoiseSVN」→「Branch/tag...」
- From URLにtrunkを指定
- To URLにtagsディレクトリ配下のパスを指定
- ログメッセージを入力して「OK」
7.2.2 TortoiseGit
- フォルダを右クリック → 「TortoiseGit」→「Create Tag...」
- タグ名を入力(例:v1.0)
- メッセージを入力(注釈付きタグになります)
- 「OK」をクリック
- 右クリック → 「TortoiseGit」→「Push...」
- 「Push all tags」にチェックを入れてプッシュ
Gitのタグは、Subversionと違い特定のコミットへの参照です。ディレクトリのコピーではありません。
8. 移行時の注意点
8.1 .gitignoreファイル
Subversionのsvn:ignoreプロパティに相当するのが.gitignoreファイルです。
8.1.1 コマンドライン
svn:ignoreの確認
svn propget svn:ignore .
Gitでの設定
# .gitignoreファイルを作成
cat > .gitignore << EOF
*.o
*.so
*.a
build/
EOF
git add .gitignore
git commit -m ".gitignoreを追加"
8.1.2 GUIツール
TortoiseSVN
- フォルダを右クリック → 「TortoiseSVN」→「Properties」
- 「svn:ignore」プロパティを編集
TortoiseGit
- フォルダ内に
.gitignoreファイルを作成 - テキストエディタで無視するパターンを記述
- コミット
または、TortoiseGitの設定ダイアログから:
- 無視したいファイルを右クリック → 「TortoiseGit」→「Add to ignore list」
- このリポジトリのみ、またはグローバルを選択
8.2 改行コードの扱い
Subversionではsvn:eol-styleプロパティで管理していました。Gitでは.gitattributesファイルで管理します。
8.2.1 コマンドライン
# .gitattributesファイルを作成
cat > .gitattributes << EOF
*.c text
*.h text
*.txt text
*.sh text eol=lf
*.bat text eol=crlf
EOF
git add .gitattributes
git commit -m ".gitattributesを追加"
8.2.2 GUIツール
TortoiseSVN
- ファイルを右クリック → 「TortoiseSVN」→「Properties」
- 「svn:eol-style」プロパティを設定(native、LF、CRLFなど)
TortoiseGit
- フォルダ内に
.gitattributesファイルを作成 - テキストエディタで設定を記述
- コミット
8.3 大きなファイルの扱い
Subversionは大きなバイナリファイルを扱うのが得意でした。Gitは履歴全体をクローンするため、大きなファイルには不向きです。
対策として、Git LFS(Large File Storage)を使用します。
8.3.1 コマンドライン
# Git LFSのインストール(初回のみ)
git lfs install
# 大きなファイルを追跡
git lfs track "*.zip"
git lfs track "*.iso"
# .gitattributesが自動生成される
git add .gitattributes
git commit -m "Git LFSを設定"
8.3.2 GUIツール
TortoiseGit
- フォルダを右クリック → 「TortoiseGit」→「Settings」
- 「Git」→「Git LFS」でLFSを有効化
- コマンドラインで
git lfs trackを実行(GUIからは設定不可) - または、
.gitattributesを直接編集
Git LFSの初期設定は、コマンドラインの方が簡単です。
9. リポジトリの変換
既存のSubversionリポジトリをGitに変換する場合、git svnコマンドを使用します。この作業はコマンドラインで行います。
9.1 基本的な変換
# Subversionリポジトリをクローン
git svn clone https://svn.example.com/repo/trunk myproject
# ディレクトリに移動
cd myproject
9.2 標準的なレイアウトの場合
trunk、branches、tagsの標準的なレイアウトの場合:
git svn clone -s https://svn.example.com/repo myproject
-sオプションは--stdlayoutの省略形で、trunk、branches、tagsを自動認識します。
9.3 作者情報のマッピング
SubversionのユーザーIDをGitの形式に変換します。
# authors.txtファイルを作成
cat > authors.txt << EOF
tanaka = 田中太郎 <tanaka@example.com>
sato = 佐藤花子 <sato@example.com>
suzuki = 鈴木次郎 <suzuki@example.com>
EOF
# 作者情報を指定してクローン
git svn clone -s --authors-file=authors.txt \
https://svn.example.com/repo myproject
9.4 リモートリポジトリへの登録
# リモートリポジトリを追加
git remote add origin https://git.example.com/myproject.git
# プッシュ
git push -u origin main
変換後は、通常のGitリポジトリとして、TortoiseGitなどのGUIツールで操作できます。
10. TortoiseGit固有の便利機能
TortoiseSVNユーザーがTortoiseGitに移行する際、新しく使える便利な機能があります。
10.1 コミットグラフの可視化
TortoiseGitのログビューには、ブランチのマージ履歴を視覚的に表示するグラフ機能があります。
- フォルダを右クリック → 「TortoiseGit」→「Show log」
- 左側のグラフでブランチの分岐とマージが視覚化される
- 複雑なブランチ構造を理解しやすい
10.2 Stash機能
作業中の変更を一時的に退避する機能です。TortoiseSVNにはない機能です。
使用場面
- 作業中に別のブランチに切り替える必要がある場合
- 作業中に緊急のバグ修正が必要になった場合
コマンドライン
# 変更を一時退避
git stash
# 正しいブランチに切り替え
git checkout correct-branch
# 変更を復元
git stash pop
TortoiseGit
- フォルダを右クリック → 「TortoiseGit」→「Stash Save」
- 変更が退避される
- フォルダを右クリック → 「TortoiseGit」→「Switch/Checkout...」
- 正しいブランチに切り替え
- フォルダを右クリック → 「TortoiseGit」→「Stash Pop」
11. まとめ
SubversionからGitへの移行で押さえるべきポイント:
11.1 概念の違いを理解する
- 中央集権型から分散型への変更
- ステージングエリアという中間層
- コミットが2段階(commit + push)
11.2 基本操作の対応を把握する
- checkout → clone
- update → pull
- commit → commit + push
11.3 ブランチの扱いの違い
- Gitではブランチが軽量
- 頻繁な作成・削除が推奨される
11.4 移行ツールの活用
- git svnでの変換
- 作者情報のマッピング
11.5 段階的な移行
- 小さなプロジェクトから開始
- チーム全体で理解を深める
11.6 GUIツールの活用
- TortoiseSVNユーザーはTortoiseGitへの移行がスムーズ
- 基本的な操作感は似ている
- コミット後のプッシュ操作に注意
11.7 コマンドラインとGUIの使い分け
- 日常的な操作:GUIツールが便利
- リポジトリ変換:コマンドラインのみ
- 両方を理解することで柔軟に対応できる
技術的な観点から見ると、Gitは分散型の特性により、より柔軟で効率的な開発が可能になります。TortoiseSVNユーザーであれば、TortoiseGitを使用することで、操作の違いによる混乱を最小限に抑えられます。最初は操作の違いに戸惑うかもしれませんが、基本を押さえれば、Subversionと同様に使えるようになります。