Git ブランチとマージ

マージ・コンフリクト時各種コマンドの備忘録
・Automatic merge
・git diff
・git log --graph


## ■Automatic mergeとは
各コミットが異なる箇所を変更している場合、自動でマージしてくれる機能。
マージするブランチ同士がぶつからないケース。
逆にマージするブランチのファイルの差分が同じ場所だとGitがどちらのブランチの差分を採用すればいいかわからない（＝Merge Conflict）

コミットが各ブランチで枝分かれしている場合、git logコマンドで他のブランチの情報が出てこない　
※↓mainブランチのログしか表示されず、no-fast-fowardブランチが表示されない。
```
$ git log --oneline
8112ceb (HEAD -> main) make new file for automatic merge
1329e82 update readme
47a43df (origin/main, origin/HEAD) add gitignore
3282559 new file
6bb1377 delete file
ee0dfb8 make new file
728c928 changed name2
70d2c42 change name
c1632c9 add newfile
b52de06 Initial commit

```
この場合、「--all」を追加する」。
↓でno-fast-fowardブランチの情報も確認可能に

```
$ git log --all --oneline
8112ceb (HEAD -> main) make new file for automatic merge
377f6db (no-fast-forward) update readme for automatic merge
1329e82 update readme
47a43df (origin/main, origin/HEAD) add gitignore
3282559 new file
6bb1377 delete file
ee0dfb8 make new file
728c928 changed name2
70d2c42 change name
c1632c9 add newfile
b52de06 Initial commit
```
更に「--graph」を追加すると、コミットの親子関係を可視化してくれる※枝分かれしてるのがわかりやすい。

```
$ git log --all --oneline --graph
* 8112ceb (HEAD -> main) make new file for automatic merge
| * 377f6db (no-fast-forward) update readme for automatic merge
|/
* 1329e82 update readme
* 47a43df (origin/main, origin/HEAD) add gitignore
* 3282559 new file
* 6bb1377 delete file
* ee0dfb8 make new file
* 728c928 changed name2
* 70d2c42 change name
* c1632c9 add newfile
* b52de06 Initial commit

```

## mergeする前に、差分の確認

```
$ git diff main no-fast-forward
diff --git a/README.md b/README.md
index bb97474..4c373cd 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
 # git-practice
 このリポジトリはGit動画講座用です．
 ローカルリポで変更　　
-new-featureブランチで変更
\ No newline at end of file
+no-fast-branchでブランチで変更
\ No newline at end of file
diff --git a/newfile.txt b/newfile.txt
deleted file mode 100644
index 6704adb..0000000
--- a/newfile.txt
+++ /dev/null
@@ -1 +0,0 @@
-created new file!
\ No newline at end of file

```
差分を見て問題なければ、mergeしていく

## Merge
mainのブランチに移動し、mergeしたいブランチを指定してgit mergeコマンドを入力

```
git merge no-fast-forward
Merge made by the 'ort' strategy.
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

```
上記コマンドでデフォルトのエディタが開き、コミットメッセージを入力を求められるが、自動で記述されているのでメモ不要でクローズ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935967/b929a528-e462-9dcd-30e5-f5a9d7a54123.png)

git logで確認

```
$ git log --oneline --all --graph
*   d1dc2b0 (HEAD -> main) Merge branch 'no-fast-forward'
|\
| * 377f6db (no-fast-forward) update readme for automatic merge
* | 8112ceb make new file for automatic merge
|/
* 1329e82 update readme
* 47a43df (origin/main, origin/HEAD) add gitignore
* 3282559 new file
* 6bb1377 delete file
* ee0dfb8 make new file
* 728c928 changed name2
* 70d2c42 change name
* c1632c9 add newfile
* b52de06 Initial commit

```
現状の親子関係は以下グラフのようになっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935967/b17da31b-094e-9a21-7aff-abe76c4e4e50.png)




mergeできたこと確認したら、不要なブランチ（no-fast-branch）を削除

```
$ git branch
* main
  no-fast-forward
~/Desktop/git-practice (main)
$ git branch -d no-fast-forward
Deleted branch no-fast-forward (was 377f6db).
~/Desktop/git-practice (main)
$ git branch
* main
```