ようへいの日々精進XP

よかろうもん

社のイケメンエンジニアにコミットをまとめて下さいと怒られたので git rebase -i でコミットをまとめるチュートリアル

tl;dr

ある日, 社のイケメンエンジニア S 氏に「かっぱさんのプルリク, コミットまとめてくださいねー」とカジュアルに言われて, 「こ, コミットをまとめる??そんなん, やったことない」な状態になってしまったので, 手元の練習リポジトリでプルリクエストのコミットをまとめるチュートリアルをやったのでメモしておきます.

チュートリアル

ブランチを切る

チュートリアルで利用するリポジトリは以下のリポジトリ.

github.com

$ git clone git@github.com:inokappa/test001.git
$ git checkout -b 'matome-test'

修正する -> コミット -> 修正する -> コミット...

$ echo 'test1' >> README.md
$ git add README.md
$ git commit -m 'test1'
$ echo 'test2' >> README.md
$ git add README.md
$ git commit -m 'test2'
$ echo 'test3' >> README.md
$ git add README.md
$ git commit -m 'test3'
$ echo 'test4' >> README.md
$ git add README.md
$ git commit -m 'test4'
$ echo 'test5' >> README.md
$ git add README.md
$ git commit -m 'test5'

リポジトリにプッシュしてプルリクエストを作成

$ git push -u origin matome-test
Enumerating objects: 17, done.
Counting objects: 100% (17/17), done.
Delta compression using up to 12 threads
Compressing objects: 100% (15/15), done.
Writing objects: 100% (15/15), 1.56 KiB | 1.56 MiB/s, done.
Total 15 (delta 4), reused 0 (delta 0)
remote: Resolving deltas: 100% (4/4), done.
remote:
remote: Create a pull request for 'matome-test' on GitHub by visiting:
remote:      https://github.com/inokappa/test001/pull/new/matome-test
remote:
To github.com:inokappa/test001.git
 * [new branch]      matome-test -> matome-test
Branch 'matome-test' set up to track remote branch 'matome-test' from 'origin'.

プルリクエストを作成.

f:id:inokara:20200623234545p:plain

コミットが 5 つ並んでいることがわかります.

イケメンエンジニアに怒られる

f:id:inokara:20200623234657p:plain

コミットをまとめる

まずは, コミットをまとめる際, コミットのログを確認してコミット ID を確認します.

$ git log



commit db271fb99382d122fdfe398dfb4cf6bd37374ae0 (HEAD -> matome-test, origin/matome-test)
Author: inokappa <inokara@gmail.com>
Date:   Tue Jun 23 23:40:01 2020 +0900

    test5

commit 1d33ea46079f3dc2ee2d560e26cdfd49cb44af01
Author: inokappa <inokara@gmail.com>
Date:   Tue Jun 23 23:40:01 2020 +0900

    test4

commit ac826c4eb710838a7195e5d0f1723d04bf14689a
Author: inokappa <inokara@gmail.com>
Date:   Tue Jun 23 23:40:01 2020 +0900

    test3

commit b7b065e1a40f829db2ae0718bc92f05d7dd94f66
Author: inokappa <inokara@gmail.com>
Date:   Tue Jun 23 23:40:01 2020 +0900

    test2

commit d5e24c5f8837d26f81e02cb9ec2eaf93300c7831
Author: inokappa <inokara@gmail.com>
Date:   Tue Jun 23 23:40:01 2020 +0900

    test1

commit 483d4d6f0b4e697b876b4d27bce64a73d7106938 (origin/master, origin/HEAD, master)
Merge: 12cee31 e5d0bad

コミットログ test1 (コミット ID: d5e24c5f8837d26f81e02cb9ec2eaf93300c7831) からコミットログ test5 (コミット ID: db271fb99382d122fdfe398dfb4cf6bd37374ae0) について, コミットログ test1 に全部まとめたいと思います. そうすれば, 5 つ登録されていたコミットを 1 つにまとめることが出来そうです.

以下のように git rebase -i ${まとめるコミットの 1 つ前のコミット ID} を実行します. ちなみに -i--interactive の省略オプションです.

$ git rebase --interactive 483d4d6f0b4e697b876b4d27bce64a73d7106938

コミットログ test1 (コミット ID: d5e24c5f8837d26f81e02cb9ec2eaf93300c7831) にまとめる為, その一つ前のコミット ID: 483d4d6f0b4e697b876b4d27bce64a73d7106938 を指定しています. コマンドを実行すると以下のように出力されます.

pick d5e24c5 test1
pick b7b065e test2
pick ac826c4 test3
pick 1d33ea4 test4
pick db271fb test5

# Rebase 483d4d6..db271fb onto 483d4d6 (5 commands)
#
# Commands:

...

pick d5e24c5 test2 から pick db271fb test5 を以下のように修正して保存します.

pick d5e24c5 test1
s b7b065e test2
s ac826c4 test3
s 1d33ea4 test4
s db271fb test5

# Rebase 483d4d6..db271fb onto 483d4d6 (5 commands)
#
# Commands:

...

保存すると, さらに以下のように, まとめるコミットの全てのコミットメッセージを修正する為にエディタが開きます.

# This is a combination of 5 commits.
# This is the 1st commit message:

test1

# This is the commit message #2:

test2

# This is the commit message #3:

test3

# This is the commit message #4:

test4

# This is the commit message #5:

test5
...

これを以下のように修正して保存します.

まとめてしまいます.
# This is a combination of 5 commits.
# This is the 1st commit message:

test1 (まとめられます)

# This is the commit message #2:

test2 (まとめられます)

# This is the commit message #3:

test3 (まとめられます)

# This is the commit message #4:

test4 (まとめられます)

# This is the commit message #5:

test5 (まとめられます)
...

保存すると, 以下のように出力されました.

[detached HEAD c0f7634] まとめてしまいます.
 Date: Tue Jun 23 23:40:01 2020 +0900
 1 file changed, 5 insertions(+)
Successfully rebased and updated refs/heads/matome-test.

リポジトリに Force プッシュ

あとは, 以下のようにリポジトリに Force プッシュします. (既にリポジトリにプッシュしている為)

$ git push -u origin matome-test --force
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 12 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 440 bytes | 440.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:inokappa/test001.git
 + db271fb...c0f7634 matome-test -> matome-test (forced update)
Branch 'matome-test' set up to track remote branch 'matome-test' from 'origin'.

プルリクエストでコミットがまとめられていることを確認出来ました!

f:id:inokara:20200624000245p:plain

git log でも以下のように確認出来ます.

$ git log
commit c0f7634eb0614b82de332534cb928aa7fb353170 (HEAD -> matome-test, origin/matome-test)
Author: inokappa <inokara@gmail.com>
Date:   Tue Jun 23 23:40:01 2020 +0900

    まとめてしまいます.

    test1 (まとめられます)

    test2 (まとめられます)

    test3 (まとめられます)

    test4 (まとめられます)

    test5 (まとめられます)

以上

コミットをまとめてもイケメンにはなれませんでしたが, 今まで, git は clonepushpull くらいしか使ったこと無かったけど, 自分でやってみるとなんとなく理解しました. ありがとう, S 氏.