SourceTreeで、マージとリベースを行う


SourceTreeでGitを操作する際にGUI上で「あれ、どれを選択状態にして、どっちを右クリックしてマージするんだっけ？？」などと操作に戸惑うことがちょくちょくあります。。コマンドでやればイイじゃんって話なのですが、ターミナルに慣れてない人がGUIでやりたいってニーズもあるようで、、。


ということで、マージとリベースについて、コマンドに対応するSourceTreeのオペを整理しておきます。

## develop「に」feature/dev_#60「を」マージする
フィーチャーブランチで作業してて、作業が終わったのでdevelopにマージしようって時のオペ。具体的にはdevelop上での

```
# git merge --no-ff feature/dev_#60
```
このオペです

この状態を、
![01.png](https://qiita-image-store.s3.amazonaws.com/0/73777/ce8e1a56-73f4-729f-d050-08c69b8f605d.png)

この状態にするのが目標です。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/73777/b2b56c60-59d8-db58-9f0f-aa715e9c553a.png)

あ、ちなみに、developへのマージをプルリクエストで行う開発スタイルの場合は、もちろんコマンドやSourceTreeではなく、GitHub上でプルリクを発行してください。。

### まずはこのコミット済み環境を整備

このテストを実施するための環境を作ります。

Gitリポジトリの初期化

```bash
mkdir sample && cd $_
git init
```

Calc.java/Calc2.javaを作成し、masterブランチでコミットします。そのあと必要なブランチを作成します。

```bash
echo "hello" >> Calc.java
echo "hello" >> Calc2.java
git add Calc.java && git add Calc2.java   && git commit -m 'initial'
git checkout -b develop && git checkout -b feature/dev_#50 && git checkout -b feature/dev_#60
```

feature/dev_#60 と feature/dev_#50 でそれぞれ修正してコミット

```bash
git checkout feature/dev_#60
echo "hello from feature/dev_#60" >> Calc.java
git commit -a -m '消費税対応1.05倍 #60 2016/12/26'

git checkout feature/dev_#50
echo "hello from feature/dev_#50" >> Calc2.java
git commit -a -m '消費税対応1.08倍 #50 2016/12/26'

git checkout develop
```


SourceTreeを通してみてみると、、

![2e10b4c1-86f1-05c1-609f-dc74534b2fc6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/70af5b51-ccd4-2a38-19bd-b3489722da50.png)



初めのキャプチャと同じになりました。。。
何度もやり直してみる場合は、

```bash
rm -fr .git
rm *.java
```

してなかったことにして、``git init``からやり直せばOKです。

さてやってみましょう。



### コマンドで

```bash
$ git branch
* develop
  feature/dev_#50
  feature/dev_#60
  master
$ git merge --no-ff feature/dev_#60
Already up to date!
Merge made by the 'recursive' strategy.
$ git branch
* develop
  feature/dev_#50
  feature/dev_#60
  master
$
$ git log --oneline --graph
*   2be95c9 (HEAD -> develop) Merge branch 'feature/dev_#60' into develop
|\
| * 72bafd1 (feature/dev_#60) 消費税対応1.05倍 #60 2016/12/26
|/
* 0ad8ea7 (master) initial
$
```

feature/dev_#60 ブランチを develop ブランチにマージすることができました。

SourceTree上で見てみるとこんな感じ。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/73777/b2b56c60-59d8-db58-9f0f-aa715e9c553a.png)


### SourceTreeで
さて本題のSourceTreeでのオペです。
develop をダブルクリックしてcheckoutして(太字状態)、dev_#60 を右クリックして「dev_#60 を developへマージ」を選択します。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/73777/d0e23e90-5d75-c410-27e9-0363dc66e395.png)


Fast Forwardになってしまいましたが、とりあえずマージはできたようです。
![04.png](https://qiita-image-store.s3.amazonaws.com/0/73777/b19575aa-b398-bf3d-c43b-6462d6832a51.png)

ちなみにFast Forwardにならないようにするには、環境設定で「fast-forwardでマージに問題がなくてもコミットを作成」にチェックを入れておけばよいようです。
![05.png](https://qiita-image-store.s3.amazonaws.com/0/73777/5888195f-94a4-801e-0209-0ab3ccd34ffc.png)



## feature/dev_#50「に」develop「を」リベースする
次はリベースです。dev_#60が先にマージされてdevelopが進んでしまったため、その**「(dev_#60修正分の)developの変更」**を自分のブランチ(dev_#50) へリベースするシーンを想定します。

下記のように、dev_#50よりdevelopが進んでる状況ってことですね。
![06.png](https://qiita-image-store.s3.amazonaws.com/0/73777/3b37bbd3-25db-6085-f818-ed4aa8319bad.png)

### コマンドで

```bash
$ git branch
  develop
* feature/dev_#50
  feature/dev_#60
  master
$ git rebase develop
First, rewinding head to replay your work on top of it...
$ git branch
  develop
* feature/dev_#50
  feature/dev_#60
  master
$ git log --oneline --graph
*   325aedc (HEAD -> feature/dev_#50, develop) Merge branch 'feature/dev_#60' into develop
|\
| * 72bafd1 (feature/dev_#60) 消費税対応1.05倍 #60 2016/12/26
|/
* 0ad8ea7 (master) initial
$
```

下記の通り、developの変更分がdev_#50に取り込まれ、リベースすることが出来ました。
![07.png](https://qiita-image-store.s3.amazonaws.com/0/73777/10750ec3-e08c-ca84-150e-e96cdbfa8bcf.png)



### SourceTreeで

SourceTreeでは以下の通り。
dev_#50をダブルクリックしてcheckoutして(太字状態)、developを右クリックして「現在の変更を developへリベース」を選択します。
![08.png](https://qiita-image-store.s3.amazonaws.com/0/73777/d640a7b6-8d81-931b-8a21-448ec659a891.png)


コマンドと同じ結果が得られました。
![09.png](https://qiita-image-store.s3.amazonaws.com/0/73777/7378b5aa-d411-9ca4-100e-7dea14ba1848.png)


おつかれさまでした。


##関連リンク
- [GitHubのマージとリベースについて](https://qiita.com/masatomix/items/4bdb5f25de632c97f37f)
- [SourceTree上でGit Flowを動かしてみる](https://qiita.com/masatomix/items/5e520591695f21769f11)