git rebaseでconflictした際の対応をシンプルに確認

# 概要

下記のように、ある地点からfeatureブランチを切って開発を進めている間に、masterブランチにもcommitが行われるような状況はよくあると思います。 
![分岐.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441085/2dad3b49-89ec-eabf-ecee-403b0d92670d.png)

この状況にて、featureブランチからPRを出すときには、feature側にてmasterの先頭から変更コミットを生やすようにすることが多いと思います（fast-forward？）。
![fast-forward.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441085/17151712-2c40-fc90-dee9-a746ec81f43e.png)

このときmasterのコミットとfeatureのコミットがコンフリクトした場合の`git rebase --continue`、`git rebase --skip`の挙動を確認していきます。

## 状況

下記のようなgit logの状況から、featureブランチ側で`git rebase master`をしていきます。

![スクリーンショット 2021-06-04 23.51.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441085/89ec6f41-f45c-0cde-9d29-b9decf6f0c2a.png)

* `target1 in feature`、`target2 in feature`のコミットはmasterのコミットとコンフリクトしています。
* `target3 in feature`のコミットはコンフリクトしません。

## rebaseしてみる

### `git rebase master`する

featureブランチにて、`git rebase master`をすると以下のようになります。

```
[nannany@minamiyoshihikonoMacBook-Pro practice-git (feature)]$ git rebase master    
First, rewinding head to replay your work on top of it...
Applying: target1 in feature
Using index info to reconstruct a base tree...
M       target1.md
Falling back to patching base and 3-way merge...
Auto-merging target1.md
CONFLICT (content): Merge conflict in target1.md
error: Failed to merge in the changes.
Patch failed at 0001 target1 in feature
hint: Use 'git am --show-current-patch' to see the failed patch
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
```

上記の状況はmasterブランチの先端に`target1 in feature`のコミットをつけようとしてコンフリクトしている状況です。

![conflict.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441085/6b46ea97-742d-58f2-3dc8-1232e367998f.png)

コンフリクトを解消したら`git add .`します。

```
[nannany@minamiyoshihikonoMacBook-Pro practice-git (feature *+|REBASE 1/3)]$ git add .   
```

### `git rebase --continue`

1つ目のコミットのコンフリクトを解消して`git add .`したら、rebaseを続けるため`git rebase --continue`します。

```
[nannany@minamiyoshihikonoMacBook-Pro practice-git (feature +|REBASE 1/3)]$ git rebase --continue 
Applying: target1 in feature
Applying: target2 in feature
Using index info to reconstruct a base tree...
M       target2.md
Falling back to patching base and 3-way merge...
Auto-merging target2.md
CONFLICT (content): Merge conflict in target2.md
error: Failed to merge in the changes.
Patch failed at 0002 target2 in feature
hint: Use 'git am --show-current-patch' to see the failed patch
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
```

上記は2つ目のコミットを先ほどつけたコミットのさらに先端につけようとしてコンフリクトしている状況です。

![conflict2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441085/76dbcdaa-4567-c72f-5375-5c6466243c7a.png)


ここでもコンフリクトするので解消します。ただし、今回はmaster側の変更を取り込むこととします。コンフリクト解消したら、`git add .`します。

### `git rebase --skip`

先ほどの、`target2 in feature`コミットは結局反映しないので、コミット履歴には残さないようにしたいです。そのような時は`git rebase --skip`をします。

```
[nannany@minamiyoshihikonoMacBook-Pro practice-git (feature *+|REBASE 2/3)]$ git rebase --skip       
Applying: target3 in feature
```

これで`target2 in feature`はコミット履歴には残らないようになります。

### `target3 in feature`のコミットは？

`target3 in feature`のコミットはコンフリクトしないので、何もせずともそのままコミット履歴に残ります。

### 最終的なコミット履歴は？

コミット履歴は最終的に下記のようになります。

![スクリーンショット 2021-06-05 0.23.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441085/ff7d4c43-6d71-64bb-7bfe-92ea0060251f.png)

masterブランチの先にskipした`target2 in feature`以外のコミットがくっついていることが分かります。