git branchとgit merge

2021-07-20 hit count image

Gitを使ってバージョンを管理する時、ブランチを作ってマージ(Merge)する方法について説明します。

概要

Gitでソースコードのバージョンを管理する時、mainブランチを最終バージョンのソースコード(本番にデプロイしたソースコード)を管理します。そして、mainブランチではないブランチを生成して新しい機能を開発した後、開発が完了されたら、mainブランチにマージ(Merge)をします。

今回のブログポストではgit branchgit mergeを使ってブランチを生成してマージをする方法について説明して、git loggit diffを使ってブランチ間違さを確認する方法について説明します。

ブランチ確認

次のコマンドを使って現在ローカル(Wroking directory)に存在するブランチを確認します。

git branch

git branchコマンドを実行すると下記のようにローカルに存在するブランチリストが表示されます。そして、現在選択されたブランチ(checkoutされたブランチ)の前に*マークが表示されます。

* main
(END)

ブランチ生成

次のコマンドを使うと新しいブランチを生成することができます。

git branch BRANCH_NAME

このように新しく生成されたブランチを選択するためには次のようにgit checkoutを使う必要があります。

git checkout BRANCH_NAME

次のコマンドを使うと、新しいブランチを生成して、同時にそのブランチを選択することができます。

git checkout -b BRANCH_NAME

ブランチの履歴や違さの確認

Gitでは新しいブランチを作って、修正した後、ブランチの履歴を確認したり、ブランチの間で違さを比較することができます。

git log

次のコマンドを使うと、現在ブランチの修正事項を確認することができます。

git log

次のように現在ブランチの修正内容が表示されます。

commit 18be2fdd7c312cb834610baff4b9388b9d719dce (HEAD -> develop)
Author: dev-yakuza <[email protected]>
Date:   Sat Jul 17 19:53:13 2021 +0900

    Modify example file

commit da360f74c8227716fa6f005808480bef8811c6b8
Author: dev-yakuza <[email protected]>
Date:   Sat Jul 17 19:52:07 2021 +0900

    Add a file

ここで--branchesオプションを使うと、ローカルに存在されたす全てのブラインチの履歴を確認することができます。

git log --branches

次のように全てのブランチの修正内容が表示されます。

commit 8c591d99fd58229d6b600a2e9560b21b8e2181be (main)
Author: dev-yakuza <[email protected]>
Date:   Sat Jul 17 19:55:42 2021 +0900

    Add a new file

commit 18be2fdd7c312cb834610baff4b9388b9d719dce (HEAD -> develop)
Author: dev-yakuza <[email protected]>
Date:   Sat Jul 17 19:53:13 2021 +0900

    Modify example file

commit da360f74c8227716fa6f005808480bef8811c6b8
Author: dev-yakuza <[email protected]>
Date:   Sat Jul 17 19:52:07 2021 +0900

    Add a file

次のように--graphオプションを使うと、もっと分かりやすく表示されます。

git log --branches --graph

次のようにグラフで表示されます。

* commit 8c591d99fd58229d6b600a2e9560b21b8e2181be (main)
| Author: dev-yakuza <[email protected]>
| Date:   Sat Jul 17 19:55:42 2021 +0900
|
|     Add a new file
|
| * commit 18be2fdd7c312cb834610baff4b9388b9d719dce (HEAD -> develop)
|/  Author: dev-yakuza <[email protected]>
|   Date:   Sat Jul 17 19:53:13 2021 +0900
|
|       Modify example file
|
* commit da360f74c8227716fa6f005808480bef8811c6b8
  Author: dev-yakuza <[email protected]>
  Date:   Sat Jul 17 19:52:07 2021 +0900

      Add a file

最後に--onelineオプションを使うと、簡単にブランチとメッセージだけ確認することができます。

git log --branches --graph --oneline

次のように簡単にブランチとメッセージが表示されます。

* 8c591d9 (main) Add a new file
| * 18be2fd (HEAD -> develop) Modify example file
|/
* da360f7 Add a file

git logでブラインチ比較

次のコマンドを実行すると、現在ブランチとmainブランチのコミットの違さを確認することができます。

git log main..BRANCH_NAME

次のようにmainと特定したブラインチの間の違さが表示されます。

commit 8c591d99fd58229d6b600a2e9560b21b8e2181be (main)
Author: dev-yakuza <[email protected]>
Date:   Sat Jul 17 19:55:42 2021 +0900

    Add a new file

commit 18be2fdd7c312cb834610baff4b9388b9d719dce (HEAD -> develop)
Author: dev-yakuza <[email protected]>
Date:   Sat Jul 17 19:53:13 2021 +0900

    Modify example file

次のように-pオプションを使うと、修正した内容も表示することができます。

git log -p main..BRANCH_NAME

次のように修正した内容を確認することができます。

commit 18be2fdd7c312cb834610baff4b9388b9d719dce (HEAD -> develop)
Author: dev-yakuza <[email protected]>
Date:   Sat Jul 17 19:53:13 2021 +0900

    Modify example file

diff --git a/example.txt b/example.txt
index d00491f..1191247 100644
--- a/example.txt
+++ b/example.txt
@@ -1 +1,2 @@
 1
+2

git diffでブランチ比較

git diffのコマンドを使ってもっと簡単に二つのブランチの違さを確認することができます。

git diff main..BRANCH_NAME

次のようにファイル名と修正内容を確認することができます。

diff --git a/example b/example
deleted file mode 100644
index d00491f..0000000
--- a/example
+++ /dev/null
@@ -1 +0,0 @@
-1
diff --git a/example.txt b/example.txt
index d00491f..1191247 100644
--- a/example.txt
+++ b/example.txt
@@ -1 +1,2 @@
 1
+2
diff --git a/example2.txt b/example2.txt
deleted file mode 100644
index e69de29..0000000

git merge

新しいブランチを作って、新しい機能を開発して完成したら、当該機能をmainブランチ(本番用のブランチ)にマージ(Merge)して新しい機能をユーザに提供しなければならないです。

そしたら、開発した新しい機能が含まれたBRANCH_NAMEmainブランチにマージする方法について説明します。BRANCH_NAMEmainブランチにマージするためにはまず、mainブランチに移動する必要があります。

git checkout main

その後、git mergコマンドを使ってmainブランチにマージしようと思ってるブランチをマージします。

git merge BRANCH_NAME

ブランチが無事にマージされたら次のようなメッセージが確認されます。

Merge made by the 'recursive' strategy.
 example.txt | 1 +
 1 file changed, 1 insertion(+)

最後に、次のコマンドを実行してマージされたブランチを削除します。

git branch -d BRANCH_NAME

ここで使った-dオプションはマージされたブランチを消すとき使います。もし、マージされなかったブランチを消す時は-Dオプションを使います。

git branch -D BRANCH_NAME

コンフリクト(Conflict)

git mergeコマンドを使ってブランチをマージする時、同じファイルを修正した場合、下記のようにコンフリクト(Conflict)でマージに失敗することが確認できます。

Auto-merging example2.txt
CONFLICT (content): Merge conflict in example2.txt
Automatic merge failed; fix conflicts and then commit the result.

git statusコマンドを実行して現在の状態を確認すると次のようにマージされなかったファイルを確認することができます。

On branch main
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)
  both modified:   example2.txt

no changes added to commit (use "git add" and/or "git commit -a")

当該ファイルを開いて見ると、次のように2つのブランチがコンフリクトされた内容が<<<<<<< HEAD=======、そして>>>>>>> developで別れて表示され照ることが確認できます。

# vi example2.txt
<<<<<<< HEAD
main
=======
develop
>>>>>>> develop

HEADは現在のブランチ、つまりgit mergeのコマンドを実行してブランチ(main)です。>>>>>>> developgit mergeコマンドの対象になるブランチ(git merge BRANCH_NAMEBRANCH_NAME)です。

私たちは2つの内容を確認して、必要な部分だけ残す修正をする必要があります。ここではHEADの内容だけ残す修正をしました。

main

このように修正をした後、次のコマンドを実行して、コンフリクトされた内容をコミットします。

git commit

次のように自動で生成されたコミットメッセージの内容が確認できます。

Merge branch 'develop' into main

# Conflicts:
#       example2.txt
#
# It looks like you may be committing a merge.
# If this is not correct, please remove the file
#       .git/MERGE_HEAD
# and try again.


# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch main
# All conflicts fixed but you are still merging.

この後、:wqを入力してコミットメッセージを保存すると、うまくマージされたことが確認できます。

完了

これでGitで新しいブランチを生成して、新しいブランチで修正した内容をマージする方法についてみてみました。皆さんも今から色んなブランチの戦略を使って、ソースコードのバージョン管理をしてみてください。

私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!

Posts