Gitとgit-svn環境におけるマージの挙動を、コマンド(CUI)／TortoiseGit／SourceTreeで比較した結果


## はじめに
社内でSubversionを使っていて、そろそろGitへ移行しようかな？との考えへ至りました。
そこで、移行の足掛かりとして、まずはGitに慣れてもらうためにgit-svnの運用を開始。

「git-svn。。。闇だな。。。」とか言わない。

元々社内全員がWindows環境なので、リポジトリの操作はTortoiseSVNで統一しています。
ということで、git-svnの操作も同じUIであるTortoiseGitを選択しました。

「社内全員がWindows環境。。。TortoiseSVNにTortoiseGit。。。闇だな。。。」とか言わない。

エンジニアメンバーについては、Subversion → git-svn → Gitと次々に移行しても説明さえしてしまえば、運用方法の差異や[git-svn特有の「git svn clone」、「git svn rebase」、「git svn dcommit」といったコマンドが「git clone」、「git pull」、「git push」と同じである](http://qiita.com/mapyo/items/36d6e1ab085eb4cb206f)ということはほぼ理解してもらえます。

しかし、非エンジニアなデザイナーにとって、このような急激な変化は受け入れられるでしょうか？
Subversionを社内に導入した時もかなりなインパクトだったみたいで、バージョン管理システムの仕組みを理解してもらうのもかなりの時間を要しました。というより、恐らくまだ完全には理解してもらえてないような気がします。

そこで、移行によって覚えてもらうことを減らすために、Subversion → git-svn → Gitではなく、Subversion → Gitのような環境を提供できないかと考え、その解決方法としてSourceTreeを利用してもらうことにしました。

ご存じの方もいらっしゃるかもしれませんが、[SourceTreeはgit-svnのリポジトリを操作することが可能](http://qiita.com/amay077/items/263577c8cc4e1c65b19b)で、しかも、git-svn特有のコマンド(git svn rebaseやgit svn dcommitなどなど)が表に出てくることなく、あたかもGitとして振る舞ってくれます。これを利用しない手はありません。

---

## これから何をやるの？

さて、前置きがかなり長くなってしまいましたが、ここではGit及びgit-svnの環境でマージ操作を行った場合に、コマンド(CUI)、TortoiseGit、SourceTreeで、それぞれどのような挙動の違いが発生するのかを見ていきたいと思います。

---

## Git環境での検証前提と作業内容
 - 中央リポジトリはGit。（今回の検証には[GitHub](https://github.com/)を利用しました）
 - ローカルに「git clone」する。
 - cloneした直後のmasterブランチからfeatureブランチ（ローカルブランチ）を作成する。
 - featureブランチで3回コミットする。
 - masterブランチでfeatureブランチのコミット内容をマージする。
 - マージは「--ff(Fast-Forward)」と「--no-ff(Non Fast-Forward)」の両方のパターンを実行する。
 - マージ後「git push」でGitに反映。
 - Git側で増えたコミット数を確認。

---

## Git環境での検証結果

| ツール | コマンド | コマンド | TortoiseGit | TortoiseGit | SourceTree | SourceTree |
|:--|:-:|:-:|:-:|:-:|:-:|:-:|
| Fast-Forward |--ff|--no-ff|--ff|--no-ff|--ff|--no-ff|
|増えたコミット数|3|4|3|4|3|4|
|マージコミット|なし|あり|なし|あり|なし|あり|

上記の通り、Git環境下ではツールによって動作の差異はありませんでした。（当然か）

---

## git-svn環境での検証前提と作業内容
 - 中央リポジトリはSubversion。（今回の検証には[Assembla](http://www.assembla.com/)を利用しました）
 - ローカルに「git svn clone」する。
 - cloneした直後のmasterブランチからfeatureブランチ（ローカルブランチ）を作成する。
 - featureブランチで3回コミットする。
 - masterブランチでfeatureブランチのコミット内容をマージする。
 - マージは「--ff(Fast-Forward)」と「--no-ff(Non Fast-Forward)」の両方のパターンを実行する。
 - マージ後「git svn dcommit」でSubversionに反映。
 - Subversion側で増えたコミット数を確認。

---

## git-svn環境での検証結果

| ツール | コマンド | コマンド | TortoiseGit | TortoiseGit | SourceTree | SourceTree |
|:--|:-:|:-:|:-:|:-:|:-:|:-:|
| Fast-Forward |--ff|--no-ff|--ff|--no-ff|--ff|--no-ff|
|増えたコミット数|3|**1**|3|**1**|3|**3**|
|マージコミット|なし|あり|なし|あり|なし|**なし**|

Git環境と大きく異なるのは、「--no-ff」オプションの場合の挙動です。
Subversionのマージでは「--no-ff」が表現できないためか、**マージコミット「のみ」を反映**するようです。

もう一点、特筆すべきはSourceTreeの挙動で、**「--ff」と「--no-ff」の動作に差異がありません。**
このような動作に関連するか分かりませんが、SourceTreeでgit-svnのマージを行おうとすると、以下のような警告が表示されます。

![st4.png](https://qiita-image-store.s3.amazonaws.com/0/23093/cf5fb6e5-d1c7-55be-c3f2-5d330b701585.png)

ということは、git-svn環境でのマージをSourceTree自体があまりオススメしていないのかもしれません。

しかも、「--no-ff」の場合にマージコミットが作られないので、「SourceTreeを使うことであたかもGitとして振る舞ってくれる」という当初の目論見は外れてしまい、結局Gitとgit-svn環境で差異が出てしまうなーと気づいてしまいました。。。

## おまけ

 - TortoiseGitで「--ff」オプションによるマージ方法

![git-svn-ff.png](https://qiita-image-store.s3.amazonaws.com/0/23093/688075e3-7638-0f41-e885-941a8f2c613c.png)

 - TortoiseGitで「--no-ff」オプションによるマージ方法

![git-svn-noff.png](https://qiita-image-store.s3.amazonaws.com/0/23093/18d937e8-2623-841e-d0b2-54dc2cc25bd2.png)

 - SourceTreeで「--ff」オプションによるマージ方法

![sourcetree-ff.png](https://qiita-image-store.s3.amazonaws.com/0/23093/13f201fb-b34b-54f5-61f8-3963cf8d219f.png)

 - SourceTreeで「--no-ff」オプションによるマージ方法

![sourcetree-noff.png](https://qiita-image-store.s3.amazonaws.com/0/23093/e1ab0c01-b318-609e-49b1-e35f02bbadbd.png)


## 参考URL

 - [ブランチの統合](http://www.backlog.jp/git-guide/stepup/stepup1_4.html)
 - [図で分かるgit-mergeの--ff, --no-ff, --squashの違い](http://d.hatena.ne.jp/sinsoku/20111025/1319497900)
 - [【git】分かりやすく！mergeは「合流」、rebaseは「付け替え」!](http://nullnote.com/web/git/merge_rebase/)
 - [git-svnでsvnから緩やかにgitに移行しよう(基本手順編)](http://qiita.com/razokulover/items/a12fb22290c513cfe4b5)
 - [git-svnでブランチ使って開発](http://qiita.com/eri/items/ce01115d575e3ad88d4d)
 - [git-svnを利用した運用を考える](http://qiita.com/hikaruworld@github/items/0a67da8f5f2af2549c94)