Edited at

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

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

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


develop「に」feature/dev_#60「を」マージする

フィーチャーブランチで作業してて、作業が終わったのでdevelopにマージしようって時のオペ。具体的にはdevelop上での

# git merge --no-ff feature/dev_#60

このオペです

この状態を、

この状態にするのが目標です。

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


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

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

Gitリポジトリの初期化

mkdir sample && cd $_

git init

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

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 でそれぞれ修正してコミット

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を通してみてみると、、

初めのキャプチャと同じになりました。。。

何度もやり直してみる場合は、

rm -fr .git

rm *.java

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

さてやってみましょう。


コマンドで

$ 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上で見てみるとこんな感じ。


SourceTreeで

さて本題のSourceTreeでのオペです。

develop をダブルクリックしてcheckoutして(太字状態)、dev_#60 を右クリックして「dev_#60 を developへマージ」を選択します。

Fast Forwardになってしまいましたが、とりあえずマージはできたようです。

ちなみにFast Forwardにならないようにするには、環境設定で「fast-forwardでマージに問題がなくてもコミットを作成」にチェックを入れておけばよいようです。


feature/dev_#50「に」develop「を」リベースする

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

下記のように、dev_#50よりdevelopが進んでる状況ってことですね。


コマンドで

$ 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に取り込まれ、リベースすることが出来ました。


SourceTreeで

SourceTreeでは以下の通り。

dev_#50をダブルクリックしてcheckoutして(太字状態)、developを右クリックして「現在の変更を developへリベース」を選択します。

コマンドと同じ結果が得られました。

おつかれさまでした。


関連リンク