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でのオペです。
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へリベース」を選択します。
おつかれさまでした。
##関連リンク