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'.
プルリクエストを作成.
コミットが 5 つ並んでいることがわかります.
イケメンエンジニアに怒られる
コミットをまとめる
まずは, コミットをまとめる際, コミットのログを確認してコミット 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
...
pick d5e24c5 test2
から pick db271fb test5
を以下のように修正して保存します.
pick d5e24c5 test1
s b7b065e test2
s ac826c4 test3
s 1d33ea4 test4
s db271fb test5
...
保存すると, さらに以下のように, まとめるコミットの全てのコミットメッセージを修正する為にエディタが開きます.
test1
test2
test3
test4
test5
...
これを以下のように修正して保存します.
まとめてしまいます.
test1 (まとめられます)
test2 (まとめられます)
test3 (まとめられます)
test4 (まとめられます)
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'.
完
プルリクエストでコミットがまとめられていることを確認出来ました!
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 は clone
か push
か pull
くらいしか使ったこと無かったけど, 自分でやってみるとなんとなく理解しました. ありがとう, S 氏.