【Git】SourceTreeのプルのオプションってなんなの？

# はじめに
SourceTreeでプルをするときに出てくるオプションってなんなの？って方向けの記事です。

# 環境
本記事用に利用した環境です。

- OS : MacOSX HighSierra
- SourceTree : 3.2.1
- Git : 2.22.0 

# プルのオプション 

![スクリーンショット 2019-06-22 10.32.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/23b6ccc4-4845-1089-fa3d-f1214ce96857.png)
こいつらについてまとめていきます

##すぐマージした変更をコミットする
このオプションは**プルで変更を取り込んだ(`git merge`)後にすぐにコミットする**オプション。
マージした後に何か変更を加えてコミットしたい場合などは、チェックを外すとよい。

なお、fast-forwardの場合は後述する**「fast-forwardマージであっても新たにコミットを作成する」にチェック**を入れない限りはこのオプションにチェックを入れても何も起こりません。

※ fast-forwardってなんなのさ？って方はこちらの記事が分かりやすいです。
https://yu8mada.com/2018/08/15/what-is-a-fast-forward-merge-in-git/  

<br>

**ちなみにコマンドだと**

```bash:マージ後にコミットをすぐ"行わない"
git merge --no-commit 【マージ対象のブランチ】

# 例：リモートブランチの最新を取り込んで、すぐコミットしない
git merge --no-commit origin/master
```
コマンドの場合はオプション指定なしがすぐコミットとなっているため、
マージ後コミットをすぐ行わない場合は、`--no-commit`オプションを指定する。

##マージコミットでマージされるコミットからメッセージを読み込む
このオプションはプルで変更を取り込んだ(`git merge`)際にマージされるコミットのコミットメッセージを読み込んで、コミットメッセージを作成するオプション。

![yaruo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/6af84054-be0d-8ec4-05fa-afac02ad53f6.png)


**実際にやってみた**
![スクリーンショット 2019-06-22 12.56.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/2f3d126e-c591-9d60-6996-7256ecfa28d4.png)
ローカルリポジトリが遅れているシチュエーション。
ここで重要なのは、ローカルリポジトリに存在しない上2つのコミットのコミットメッセージ。

**・Update test.編集1回目
・Update test.編集2回目**

プルを押して...
![スクリーンショット 2019-06-22 12.58.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/4833e1c6-d4de-fedb-78c5-ba2e51ca192e.png)
上3つのオプションにチェック。そしてプル。

※ このシチュエーションはfast-forwardのため「**fast-forwardであっても新たにコミットを作成する**」にチェックを入れないと、そもそもマージコミットが作られずコミットメッセージが確認できないためチェック
※ 「**すぐにマージした変更をコミットする**」はチェックを入れなくても、あとでコミットする際の入力欄にマージするコミットのメッセージが取り込まれているが、すぐ確認したいのでチェック

![スクリーンショット 2019-06-22 12.58.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/c3a83137-7fc4-ad66-ae97-79108a7f2187.png)
マージコミットのコミットメッセージを確認すると、今回リモートから取り込んだ2つのコミットのコミットメッセージが含まれている。

後ほど見返した時、マージコミットを見ただけで何の修正がマージされたかが見てわかりやすくなる。

<font color="gray">...これコマンドでやる方法をご存知の人がいたら教えて下さい。</font>

##fast-forwardマージであっても新たにコミットを作成する
名前の通り、fast-forwardでもマージコミットを作成します。

...がマージの時ならともかくPullの度にマージコミットを作るのはコミットログが汚れるので、特別必要な場面以外は利用しないことをおすすめします。

##マージではなくリベースする(警告：変更をプッシュしていないことを確かめて下さい)
リベースを実行します。

リベースってなんやねんって人はこちらの記事が参考になります。
https://qiita.com/panti310/items/e0ec74b47c6c219f2a8b

<font color="red">変更をプッシュしていないことを確かめて下さい</font>という警告が出ている通り、リベースを行うとコミット履歴が改ざんされます。
もしリモートリポジトリにPushしていて誰かが利用していると...。
手元のローカルリポジトリとリモートリポジトリの履歴が合わなくなって、なんもできねー！ってなります。

`git reset --hard origin/【ブランチ】`とかでローカルリポジトリをリモートリポジトリの内容に強制的にあわせたりしないといけなくなる)


といういろいろとめんどくさい操作なので、ちゃんと分かる人だけがやろう！

**実際にやってみた**
今回は以下のような**featureブランチをmasterブランチの最新にリベース**するシチュエーションでやってみる
![スクリーンショット 2019-07-06 12.48.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/5ca6be33-d3d5-881e-ea1b-7344dd76d586.png)

「プル」を押下して
![スクリーンショット 2019-07-06 12.48.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/a6114e30-6a0e-e0bf-1bea-35fb203cc8b1.png)

プルするリモートのブランチで**master**を指定
プルするローカルのブランチは**feature**を指定

OKを押下すると、確認がでるのでOKで進める
![スクリーンショット 2019-07-06 12.49.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/c8340008-30d6-bcdf-66f8-0a6ae6c8c71c.png)

とすると、ちゃんとリベースされている。
![スクリーンショット 2019-07-06 12.49.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/a47452a1-6d7a-5712-647c-7c0105b4ffb9.png)

ここまではローカルリポジトリでのお話なので、リモートリポジトリにPushする必要があるけども...。
リモートのリポジトリとすでにコミット履歴が異なるため普通にPushを行っても弾かれる。
![スクリーンショット 2019-07-06 13.08.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/63c1cab4-10c9-bf76-1430-472ea9a57f3c.png)
強制Push(git push -f)を行う必要があるのですが...
SourceTreeのデフォルト設定では利用することができないので

こちらの記事を参考に強制Pushを行うとよいです。
https://qiita.com/block/items/380015fc66296300f9e9

重ね重ねリモートにPushしているブランチに行うのは十分な注意が必要ですので、注意してください。

**ちなみにコマンドだと**

```bash
# featureブランチに切り替え
git checkout feature
# masterを対象にリベース
git rebase master
# リモートリポジトリに強制Push
git push -f origin feature
```

以上になります。