SVNな現場で自分だけGitを使う方法

# はじめに
SVNが使用されている現場でも、自分のローカル環境だけはGitを使う事ができます。
Gitは分散型リポジトリなので、リポジトリがローカルとリモートに分かれています。この特性を利用して、リモートリポジトリにSVNを使用したまま、ローカルのみGitのリポジトリを導入する事ができるのです。
この記事では、そんな環境を作るための手順と、運用していく上での注意点を記載します。

自分だけGitを使おうとした経緯は、↓の記事に書いてますので、こちらも見てみてください。
[SVNな現場に何も問題を感じていなかった俺が、自分だけGitを使ってみることにした理由](https://qiita.com/suzuq/items/cf0424298b74980316f1)
# 完成イメージ
↓こんな感じの運用を想定します。
![git-svn.png](https://qiita-image-store.s3.amazonaws.com/0/230422/46e16ad1-c393-94a6-bf84-0bdf25af9980.png)
リモートリポジトリは、プロジェクトでずっと使っているSVN。これはそのまま残し、自分以外のチームメンバは従来通りSVNを利用してコミットしてもらいます。
一方、自分のPCにはGitをインストールしてローカルリポジトリを構築。ソースを修正したら、まずこのローカルリポジトリにコミット。それをSVNに反映(DCommit)していく流れになります。
SVNへの反映は、SVNからすると普通のコミットとなんら変わらないので、他のチームメンバにもバレません。別にバレてもいいのですがw

# 環境
- windows10
- eclipse(Neon 4.6.1)
- TortoiseGit(2.6.0.0)
- Git for Windows(2.16.1.4)

# 環境構築手順
## gitクライアントをインストール
windowsでGitを使うために、まずはGitクライアントをインストールします。
実際にGitを操作する時は、私はGUIが好きなのでTortoiseGitを使います。
↓からダウンロードしてインストールしてください。
https://gitforwindows.org/
↓が参考になります。
http://www.curict.com/software/Windows10/Windows10_git.html
## TortoiseGitをインストール
↑というわけなので、TortoiseGitもインストール。
https://tortoisegit.org/download/
↓なんかも参考に
http://www.main-function.com/entry/2017/05/02/001640
## リポジトリをクローン
環境ができたら、SVNのリポジトリをローカルにコピーする事から始めましょう。この操作の事を「クローン」と言います。
私の現場では、いつも直接コミットしているのが「develop」というブランチなので、そこだけ持ってきます。
ローカルリポジトリを作りたいフォルダに移動し、右クリックメニューを開くと、TortoiseGitの操作系がいくつかあるので、「Gitクローン(複製)」を選びます。
↓に注意しながらクローン対象のリポジトリを選択してください。

- developだけクローンしたいので、リポジトリ内のdevelopブランチまでを含めたURLを指定する
- 「From SVN Repository」にチェック
- 「Trunks」、「Tags」等のチェックは全て外す(既にブランチの階層まで指定しているため)

![clone.png](https://qiita-image-store.s3.amazonaws.com/0/230422/94e86efb-cd51-a6d1-e9db-d80ff1df4267.png)

## eclipseにプロジェクトを作成
最近のeclipseにはGitプラグインが最初から入っていますので、インストールする必要はありません。「俺のにはないんだけど」という人は別途インストールしてください。

1. 「Gitパースペクティブ」で「このビューへ既存のローカルGitリポジトリを追加」を押す(右上にアイコンがあるはず)
1. さっきクローンしてきたローカルリポジトリを選択して「完了」
1. ビューにリポジトリが追加されるので、右クリック→プロジェクトをインポート→既存プロジェクトのインポート

これで、プロジェクト・エクスプローラにプロジェクトがインポートされ、ソースを修正する準備ができました。
次から、実際にソースを修正する時の流れを説明します。

# 開発からコミットまで
## トピックブランチ作成
まず最初にやる事は、トピックブランチを作る事です。ソースを触る前に、必ずブランチを切っておく事が重要です。そうする事によって、他の案件での修正には全く影響を及ぼさない、この案件だけの開発環境を保つ事ができます。
ここで言う案件とは、1つのバグ修正、1つの機能追加といった小さな単位を指しています。
例えば、追加機能の開発中にバグを見つけ、そっちを先にリリースする必要が出てきたとします。こういう時には、追加機能の修正はいったんコミットしておいて、バグ用のトピックブランチを作ります。そっちには追加機能の修正は一切反映されていない状態だから、バグの改修に専念する事ができます。バグの改修が終わったら、ブランチを切り替えて、また追加機能の開発に戻ってきましょう。
SVNだと、ブランチの切り替えはファイルのダウンロードや入れ替えが発生し、長い時間がかかりがちですが、Gitではそんな事はありません。すぐに切り替えられます。

eclipseでは、「プロジェクトを右クリック -> チーム -> 切り替え -> 新規ブランチ」で作れます。

![newBranch.png](https://qiita-image-store.s3.amazonaws.com/0/230422/5bc6a90f-f0aa-ec85-d120-12dbe23ac3bb.png)

トピックブランチの名前は、ITS等に登録したIDや案件名を使うと良いでしょう。
このとき、「ソース」をmasterにしておく事を忘れないように。masterとは、全てのトピックブランチの親となる統合的なブランチです。
混乱しないように気を付けてください、masterもローカルリポジトリです。masterブランチとトピックブランチは、下記の役割分担で運用していきます。

- masterブランチ -> リモートSVNとのやり取り、全てのトピックブランチの親
- トピックブランチ -> トピック(案件)ごとの開発

ここがキモですから、何度でも言います。
トピックブランチは開発に専念します。ここから直接SVNにつないではいけません。SVNとのやりとりは、masterに任せます。

## コミット(トピックブランチ)
ソースを修正したらコミットします。
全ての修正が完了するまで待つ必要はありません。どんどんコミットしましょう。だって、これはローカルリポジトリです。誰にも迷惑をかける心配はありません。
それに、コミットしておけば、何か間違えた時にいつでも前のコミットに戻る事ができます。もちろんdiffだって取れますから、小さな作業単位でコミットしておいた方が何かと便利です。このあたりは、GitとSVNで文化が異なる部分ですね。
そうそう、SVNと違って「ステージング」という段階もあるので、事前に理解しておきましょう。

## マージ
トピックブランチでの開発が完了したら、masterにマージします。

1. masterブランチに切り替え
1. 右クリックメニューから「チーム -> マージ」を選択
1. 「ローカル」からマージ対象のトピックブランチを選択、マージオプションは「スカッシュ」を選択

![merge.png](https://qiita-image-store.s3.amazonaws.com/0/230422/d03a5431-79c6-f59e-0a9f-7ad28794fc2a.png)

「スカッシュ」を選択しておく事で、何度もコミットした内容を1つにまとめてマージする事ができます。だから、トピックブランチにどんなにコミットしていても、masterにはきれいに1つのコミットだけを残す事ができます。

## コミット(master)
マージした内容をコミットします。
混乱しないようにしてください。先の手順でコミットしたのは、トピックブランチへのコミット。ここでは、masterブランチにコミットします。どちらもローカルリポジトリの話です。
コミットコメントには、1行目にITSの課題番号を入れておきましょう。次の手順でいよいよSVNへ反映しますが、その時にはここで入れたコメントがそのまま使われるようです。

## SVNにdcommit
SVNにGitのコミットを反映させる事を、dcommitといいます。
ここはeclipseではできないようなので、TortoiseGitを使ってやってみます。
TortoiseGitは、windowsのエクスプローラーに一体化しているので、エクスプローラーでプロジェクトのフォルダを右クリックしてみましょう。
「TortoiseGit」というカテゴリが出てきますので、そこから「ログを表示」を選択します。
おっと、その前にmasterブランチに切り替えておくのを忘れないように。eclipseで切り替えてあれば、TortoiseGitでも切り替えた状態になっています。切り替えてなければ、TortoiseGitでも右クリックメニューから「切り替え」で切り替える事ができます。

![tortoiseGitLog.png](https://qiita-image-store.s3.amazonaws.com/0/230422/85b484b7-00a3-f9b3-9ece-6d7b38fb9aad.png)

「git-svn」と印がついているリビジョンが、現在のSVNのバージョン。「master」は、もちろんmasterブランチのリビジョンです。
「master」リビジョンを選択し、下部ペインでリソースごとの差分を確認。OKなら右クリックメニューから「SVNへコミット(リモートへ反映)」を選んでdcommitします。
SVNを使ってコミットした場合と同じように、SVNにはリビジョンが追加されます。

# その他の運用
## リモートsvnに変更が入ったら
リモート側のSVNは、自分以外の人もコミットしますから、ローカルのGitにないリビジョンがどんどん増えていきます。これはローカル側にも取り込む必要があります。SVNでは「更新」していましたね。
ローカルのみGitを使っている今回のモデルでは、リベースを使います。

1. masterブランチに切り替え
1. エクスプローラーでプロジェクトのフォルダを右クリック
1. TortoiseGit -> SVNリベース(ローカルへ反映)を選択

リベースとは、本来なんぞや?という疑問は、他に良い解説記事があると思いますから、そちらに譲ります。

## さらにトピックブランチへ取り込む
SVNリベースは、masterブランチだけで実施した方が良いようです。
リモートSVNとのやり取りは、masterブランチの担当でしたね。これを守らないと、リビジョンの関係性が複雑になり、最悪リポジトリが壊れる事があるようです。
トピックブランチに最新のリビジョンを取り込むには、SVNリベースしたmasterからリベースします。

1. トピックブランチに切り替え
1. eclipseでプロジェクトを右クリック -> チーム -> リベース
1. リベースのダイアログから、ローカル -> masterを選択
1. 「リベース」ボタンを押下

![rebase.png](https://qiita-image-store.s3.amazonaws.com/0/230422/e5122d48-74a9-ec12-aa95-b826806be153.png)

## 未コミットの変更はスタッシュする
コミットしていない変更がある状態で、ブランチの切り替えやリベースをすると、変更が失われてしまいます。
コミットをしてから切り替えるのが基本ですが、中途半端な状態で切り替えたくない場合もあるでしょう。
そんな時はスタッシュです。
スタッシュをしておくと、未コミットの変更を一時的に保存してくれるので、そのブランチにまた戻ってきた時に元に戻す事ができます。
実際には、特に意識しなくても大丈夫。切り替えやリベースをしようとした時にeclipseが警告してくれるので、指示に従うだけでスタッシュできます。

# 参考になったサイト
[git-svnを使うときのベストプラクティス](http://layzie.hatenablog.com/entry/20121216/1355653349)
[Eclipse EGit の使い方](http://another.maple4ever.net/archives/2060/)