#はじめに
SVNが使用されている現場でも、自分のローカル環境だけはGitを使う事ができます。
Gitは分散型リポジトリなので、リポジトリがローカルとリモートに分かれています。この特性を利用して、リモートリポジトリにSVNを使用したまま、ローカルのみGitのリポジトリを導入する事ができるのです。
この記事では、そんな環境を作るための手順と、運用していく上での注意点を記載します。
自分だけGitを使おうとした経緯は、↓の記事に書いてますので、こちらも見てみてください。
SVNな現場に何も問題を感じていなかった俺が、自分だけGitを使ってみることにした理由
#完成イメージ
↓こんな感じの運用を想定します。
リモートリポジトリは、プロジェクトでずっと使っている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」等のチェックは全て外す(既にブランチの階層まで指定しているため)
##eclipseにプロジェクトを作成
最近のeclipseにはGitプラグインが最初から入っていますので、インストールする必要はありません。「俺のにはないんだけど」という人は別途インストールしてください。
- 「Gitパースペクティブ」で「このビューへ既存のローカルGitリポジトリを追加」を押す(右上にアイコンがあるはず)
- さっきクローンしてきたローカルリポジトリを選択して「完了」
- ビューにリポジトリが追加されるので、右クリック→プロジェクトをインポート→既存プロジェクトのインポート
これで、プロジェクト・エクスプローラにプロジェクトがインポートされ、ソースを修正する準備ができました。
次から、実際にソースを修正する時の流れを説明します。
#開発からコミットまで
##トピックブランチ作成
まず最初にやる事は、トピックブランチを作る事です。ソースを触る前に、必ずブランチを切っておく事が重要です。そうする事によって、他の案件での修正には全く影響を及ぼさない、この案件だけの開発環境を保つ事ができます。
ここで言う案件とは、1つのバグ修正、1つの機能追加といった小さな単位を指しています。
例えば、追加機能の開発中にバグを見つけ、そっちを先にリリースする必要が出てきたとします。こういう時には、追加機能の修正はいったんコミットしておいて、バグ用のトピックブランチを作ります。そっちには追加機能の修正は一切反映されていない状態だから、バグの改修に専念する事ができます。バグの改修が終わったら、ブランチを切り替えて、また追加機能の開発に戻ってきましょう。
SVNだと、ブランチの切り替えはファイルのダウンロードや入れ替えが発生し、長い時間がかかりがちですが、Gitではそんな事はありません。すぐに切り替えられます。
eclipseでは、「プロジェクトを右クリック -> チーム -> 切り替え -> 新規ブランチ」で作れます。
トピックブランチの名前は、ITS等に登録したIDや案件名を使うと良いでしょう。
このとき、「ソース」をmasterにしておく事を忘れないように。masterとは、全てのトピックブランチの親となる統合的なブランチです。
混乱しないように気を付けてください、masterもローカルリポジトリです。masterブランチとトピックブランチは、下記の役割分担で運用していきます。
- masterブランチ -> リモートSVNとのやり取り、全てのトピックブランチの親
- トピックブランチ -> トピック(案件)ごとの開発
ここがキモですから、何度でも言います。
トピックブランチは開発に専念します。ここから直接SVNにつないではいけません。SVNとのやりとりは、masterに任せます。
##コミット(トピックブランチ)
ソースを修正したらコミットします。
全ての修正が完了するまで待つ必要はありません。どんどんコミットしましょう。だって、これはローカルリポジトリです。誰にも迷惑をかける心配はありません。
それに、コミットしておけば、何か間違えた時にいつでも前のコミットに戻る事ができます。もちろんdiffだって取れますから、小さな作業単位でコミットしておいた方が何かと便利です。このあたりは、GitとSVNで文化が異なる部分ですね。
そうそう、SVNと違って「ステージング」という段階もあるので、事前に理解しておきましょう。
##マージ
トピックブランチでの開発が完了したら、masterにマージします。
- masterブランチに切り替え
- 右クリックメニューから「チーム -> マージ」を選択
- 「ローカル」からマージ対象のトピックブランチを選択、マージオプションは「スカッシュ」を選択
「スカッシュ」を選択しておく事で、何度もコミットした内容を1つにまとめてマージする事ができます。だから、トピックブランチにどんなにコミットしていても、masterにはきれいに1つのコミットだけを残す事ができます。
##コミット(master)
マージした内容をコミットします。
混乱しないようにしてください。先の手順でコミットしたのは、トピックブランチへのコミット。ここでは、masterブランチにコミットします。どちらもローカルリポジトリの話です。
コミットコメントには、1行目にITSの課題番号を入れておきましょう。次の手順でいよいよSVNへ反映しますが、その時にはここで入れたコメントがそのまま使われるようです。
##SVNにdcommit
SVNにGitのコミットを反映させる事を、dcommitといいます。
ここはeclipseではできないようなので、TortoiseGitを使ってやってみます。
TortoiseGitは、windowsのエクスプローラーに一体化しているので、エクスプローラーでプロジェクトのフォルダを右クリックしてみましょう。
「TortoiseGit」というカテゴリが出てきますので、そこから「ログを表示」を選択します。
おっと、その前にmasterブランチに切り替えておくのを忘れないように。eclipseで切り替えてあれば、TortoiseGitでも切り替えた状態になっています。切り替えてなければ、TortoiseGitでも右クリックメニューから「切り替え」で切り替える事ができます。
「git-svn」と印がついているリビジョンが、現在のSVNのバージョン。「master」は、もちろんmasterブランチのリビジョンです。
「master」リビジョンを選択し、下部ペインでリソースごとの差分を確認。OKなら右クリックメニューから「SVNへコミット(リモートへ反映)」を選んでdcommitします。
SVNを使ってコミットした場合と同じように、SVNにはリビジョンが追加されます。
#その他の運用
##リモートsvnに変更が入ったら
リモート側のSVNは、自分以外の人もコミットしますから、ローカルのGitにないリビジョンがどんどん増えていきます。これはローカル側にも取り込む必要があります。SVNでは「更新」していましたね。
ローカルのみGitを使っている今回のモデルでは、リベースを使います。
- masterブランチに切り替え
- エクスプローラーでプロジェクトのフォルダを右クリック
- TortoiseGit -> SVNリベース(ローカルへ反映)を選択
リベースとは、本来なんぞや?という疑問は、他に良い解説記事があると思いますから、そちらに譲ります。
##さらにトピックブランチへ取り込む
SVNリベースは、masterブランチだけで実施した方が良いようです。
リモートSVNとのやり取りは、masterブランチの担当でしたね。これを守らないと、リビジョンの関係性が複雑になり、最悪リポジトリが壊れる事があるようです。
トピックブランチに最新のリビジョンを取り込むには、SVNリベースしたmasterからリベースします。
- トピックブランチに切り替え
- eclipseでプロジェクトを右クリック -> チーム -> リベース
- リベースのダイアログから、ローカル -> masterを選択
- 「リベース」ボタンを押下
##未コミットの変更はスタッシュする
コミットしていない変更がある状態で、ブランチの切り替えやリベースをすると、変更が失われてしまいます。
コミットをしてから切り替えるのが基本ですが、中途半端な状態で切り替えたくない場合もあるでしょう。
そんな時はスタッシュです。
スタッシュをしておくと、未コミットの変更を一時的に保存してくれるので、そのブランチにまた戻ってきた時に元に戻す事ができます。
実際には、特に意識しなくても大丈夫。切り替えやリベースをしようとした時にeclipseが警告してくれるので、指示に従うだけでスタッシュできます。
#参考になったサイト
git-svnを使うときのベストプラクティス
Eclipse EGit の使い方