1. 概要
作業ブランチの開発が完了したらmainなど共有できるブランチに適用が必要です。そのときに行うのがマージ(merge)です。マージの方法はいくつが有りますが今回はsquashについて整理してみたいとおもいます。
squashマージはコミットを一つに纏めてマージする方法です。次の例から確認できると思います。
2. squashマージの例
2.1 mainと作業ブランチを用意
三つのファイルを作成したmainブランチの一つ目のコミットを作成します。
~/work/devl/git_merge (main)$ git log --graph
* <99a1f99> 2023-12-04 [Your Name] (HEAD -> main) init
~/work/devl/git_merge (main)$ ls -l
total 0
-rw-r--r-- 1 twonine 197121 0 Dec 4 21:46 test_master_01.txt
-rw-r--r-- 1 twonine 197121 0 Dec 4 21:46 test_master_02.txt
-rw-r--r-- 1 twonine 197121 0 Dec 4 21:46 test_master_03.txt
~/work/devl/git_merge (main) $
2.2 作業ブランチ
作業ブランチの名前は”branchA-from-main”です。
~/work/devl/git_merge (branchA-from-main)$ git checkout -b branchA-from-main
Switched to a new branch 'branchA-from-main'
~/work/devl/git_merge (branchA-from-main)$
2.3 ファイルを作成して2個のコミットを作成
新規ファイルを作成。
コミットする
~/work/devl/git_merge (branchA-from-main)$ git commit -m "new file" ./test-branchA-01.text
[branchA-from-main 9ac4267] new file
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 test-branchA-01.text
~/work/devl/git_merge (branchA-from-main)$
新規ファイルをgitで管理下に置く。
~/work/devl/git_merge (branchA-from-main)$ git add ./test-branchA-01.text
コミットする。
~/work/devl/git_merge (branchA-from-main)$ git commit -m "new file" ./test-branchA-01.text
[branchA-from-main 9ac4267] new file
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 test-branchA-01.text
~/work/devl/git_merge (branchA-from-main)$
2個目のファイルを作成とコミットします。
~/work/devl/git_merge (branchA-from-main)
$ touch add ./test-branchA-02.text
~/work/devl/git_merge (branchA-from-main)
$ git add ./test-branchA-02.text
~/work/devl/git_merge (branchA-from-main)
$ git commit -m "2nd new file" ./test-branchA-02.text
[branchA-from-main dd04b9b] 2nd new file
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 test-branchA-02.text
~/work/devl/git_merge (branchA-from-main)
$
2.4 squashマージ
グラフで現在の状況を確認、ファイル作成の2個のコミットがあります、その2個のコミットを纏めてみたいと思います。”rebase -I”から2個のコミットを合体する方法もありますがここではsquashでまとめてみたいと思います。
マージ前の状況
~/work/devl/git_merge (branchA-from-main)
$ git graph
* <dd04b9b> 2023-12-04 [Your Name] (HEAD -> branchA-from-main) 2nd new file
* <9ac4267> 2023-12-04 [Your Name] new file
* <99a1f99> 2023-12-04 [Your Name] (main) init
~/work/devl/git_merge (branchA-from-main)
mainブランチをcheckout
~/work/devl/git_merge (branchA-from-main)
$ git checkout main
Switched to branch 'main'
~/work/devl/git_merge (main)$
squashマージ
~/work/devl/git_merge (main)
$ git merge --squash branchA-from-main
Updating 99a1f99..dd04b9b
Fast-forward
Squash commit -- not updating HEAD
test-branchA-01.text | 0
test-branchA-02.text | 0
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 test-branchA-01.text
create mode 100644 test-branchA-02.text
~/work/devl/git_merge (main)
$ git commit
『viのエディターウィンドウが開かれます』
[main 3776b2d] Squashed commit of the following:
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 test-branchA-01.text
create mode 100644 test-branchA-02.text
~/work/devl/git_merge (main)
$ git log --graph --date-order -C -M --pretty=format:"<%h> %ad [%an] %Cgreen%d%Creset %s" --all --date=short
* <3776b2d> 2023-12-04 [Your Name] (HEAD -> main) Squashed commit of the following:
| * <dd04b9b> 2023-12-04 [Your Name] (branchA-from-main) 2nd new file
| * <9ac4267> 2023-12-04 [Your Name] new file
|/
* <99a1f99> 2023-12-04 [Your Name] init
twonine@TwoNine01 MINGW64 ~/work/devl/git_merge (main)
$
squashマージ後の状況
~/work/devl/git_merge (main)$ git graph
* <3776b2d> 2023-12-04 [Your Name] (HEAD -> main) Squashed commit of the following:
| * <dd04b9b> 2023-12-04 [Your Name] (branchA-from-main) 2nd new file
| * <9ac4267> 2023-12-04 [Your Name] new file
|/
* <99a1f99> 2023-12-04 [Your Name] init
~/work/devl/git_merge (main)$
一番目のコミット”new file”と二番目のコミット”2nd new file”がsquashマージを実行したことでmainブランチに”Squashed commit of the following:…”の一個のコミットに纏められたことが確認できると思います。
※viが開かれるときの様子
Squashed commit of the following:
commit dd04b9bb0d400e7696f0f8204181449c179a51b5
Author: Your Name <you@example.com>
Date: Mon Dec 4 22:07:21 2023 +0900
2nd new file
commit 9ac4267b4b1a2c42d4e33616b153f4d566690134
Author: Your Name <you@example.com>
Date: Mon Dec 4 22:03:41 2023 +0900
new file
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch main
# Changes to be committed:
# new file: test-branchA-01.text
# new file: test-branchA-02.text
#