自分用 Gitコンフリクトガイド


毎回ググっているような気がしたのでメモ。

## ブランチを切ってpushしたらpullreqで自動mergeできないって言われた・・・

![リモートで自動mergeできない状態](https://raw.githubusercontent.com/ryurock/qiita_images/master/git-leaning/_WIP__branch_experiment8_A_by_ryurock_%C2%B7_Pull_Request__8_%C2%B7_ryurock_git-leaning.png)

対処方法として ``` git merge ``` と ``` git rebase ``` の２つの方法がある
git 使い始めの人には ``` git merge ``` を進めて慣れてる人には ``` git rebase ``` を進める

## get mergeでの解決方法


### 参考

* [【git】git pushがrejectされたときの対応方法](https://www.softel.co.jp/blogs/tech/archives/3569)

### リモートから最新のmasterを取得してブランチにorigin/masterをmergeする

以下手順

### リモートを取得

```
git fetch
```

### pushしたブランチにいることを確認

```
git branch

#* experiment8
#  master
```

### リモートの内容をブランチにmergeする

このときGithub側で自動mergeできなかった内容でコンフリクトする

```
git merge origin/master
                                                                                                                                                     git-leaning/git/experiment8
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
```

差分を見ると自動mergeできないものが出てきている

```
git diff README.md

git-leaning/git/experiment8 !+ (merge)
diff --cc README.md
index 3a9017e,4ef9294..0000000
--- a/README.md
+++ b/README.md
@@@ -30,4 -30,4 +30,8 @@@ branch experiment
  リモートの編集1
  ブランチでの編集

++<<<<<<< HEAD
 +## ブランチでの編集
++=======
+ ## リモートの履歴を進めてみるその9
++>>>>>>> origin/master
```

### 編集してconflictを直してコミット

```
vim README.md
git add .
# -mオプションなどでコンフリクトのログを消さないように注意
git commit
```

### conflictを解消した上で再度push

```
git push orign experiment8
```

これでpullreq画面を再度見ると衝突が解消されたことがわかる

![conflict解消後](https://raw.githubusercontent.com/ryurock/qiita_images/master/git-leaning/conflict2.png)

これで引き続き開発をすればよい




## git rebase での解決方法

![リモートでconflict](https://raw.githubusercontent.com/ryurock/qiita_images/master/git-leaning/conflict3.png)

``` git rebase --continue ``` と場合によっては ``` git rebase --skip ``` を使う

またrebaseの状態がよくわからなくなったら ``` git rebase --abort ``` をすればrebase前に戻れる。rebaseを試しにやってみて、やっぱ難しい場合は ``` abort ``` 後mergeをすればよい

### 参考

* [Git開発でmasterの内容を開発ブランチに反映させる方法](http://sota1235.com/blog/2015/03/19/git-rebase.html)
* [rebase について](http://bleis-tift.hatenablog.com/entry/20100219/1266552535)


### リモートから最新のmasterを取得してブランチにorigin/masterをrebaseする


以下手順

### リモートを取得

```
git fetch
```


### pushしたブランチにいることを確認

```
git branch

#* experiment8
#  master
```

### リモートの内容をブランチにmergeする

```
git rebase origin/master
```

このときGithub側で自動mergeできなかった内容でコンフリクトする
(ここまではmergeと同じ)

### 編集してconflictを直してadd

```
vim README.md
git add .
```

このときに自分の編集とリモート側の内容が一致した場合(つまり自分の編集を全く反映せずにリモート側の編集を全て反映させたい場合)はgit statusが変更したってことにならない

#### 自分の編集を全て捨てた場合

自分の編集がリモートと一致しているから何もない

```
git st                                                                                                                                                            git-leaning/git/experiment13  (rebase)
rebase in progress; onto 939c6d7
You are currently rebasing branch 'experiment13' on '939c6d7'.
  (all conflicts fixed: run "git rebase --continue")
```

この場合は ``` git rebase --skip ``` を使用する

```
git rebase --skip
```


#### 自分の編集が反映される場合

自分の編集が入っているからmodfiedがある

```
git st                                                                                                                                                           git-leaning/git/experiment13 + (rebase)
rebase in progress; onto 939c6d7
You are currently rebasing branch 'experiment12' on 'b230439'.
  (all conflicts fixed: run "git rebase --continue")

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   README.md
```

この場合は ``` git rebase --continue ``` を使用する

```
git rebase --continue
```

### pushには -f が必要なことを忘れずに


mergeと同じ感覚でpushしてもリジェクトされてしまう

```
git push origin experiment13                                                                                                                                              

git-leaning/git/experiment13
To git@github.com:ryurock/git-leaning.git
 ! [rejected]        experiment13 -> experiment13 (non-fast-forward)
error: failed to push some refs to 'git@github.com:ryurock/git-leaning.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

この場合は強制 push オプション -f を使用する

```
git push -f origin experiment13

Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 347 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To git@github.com:ryurock/git-leaning.git
 + 1bebf33...3df9914 experiment13 -> experiment13 (forced update)
``` 

pullreq画面を再度見ると衝突が解消されたことがわかる

![push後のpullreq](https://raw.githubusercontent.com/ryurock/qiita_images/master/git-leaning/conflict4.png)

これで引き続き開発を行えばよい