Gitの離れたcommitをまとめる(git rebase -i)
概要
gitのcommitをまとめる過程で、A
・B
・C
の並び順でコミットが存在しA
とC
をまとめるパターンでハマったのでメモです。
単純なことで時間が吸い込まれていきました...
目次
参考サイト様
環境
- Mac OS X Mojave 10.14.4
$ git --version git version 2.20.1 (Apple Git-117)
※実際にハマった環境はWindowsですが特に環境による差異はないと思います。
前提(コミットログの確認&想定シナリオ)
最初にコミット履歴を確認しておきます。
シナリオとしてはadd ModuleA(249a171)
とadd ModuleB(249a171)
のコミット後、PullRequestを行いましたがレビューで指摘事項があったため修正すると言う流れを想定しています。
その、各修正コミットをModuleA/Bそれぞれのadd
コミットにまとめます。
249a171 add ModuleB
←9dc13c0 fix ModuleB
5a43974 add ModuleA
←2bf2d88 fix ModuleA
$ ls -l total 24 -rw-r--r-- 1 z staff 49 5 22 00:01 ModuleA.txt -rw-r--r-- 1 z staff 49 5 22 00:02 ModuleB.txt -rw-r--r-- 1 z staff 16 5 21 23:58 README.md $ git log --oneline 9dc13c0 (HEAD -> master) fix ModuleB 2bf2d88 fix ModuleA 249a171 add ModuleB 5a43974 add ModuleA 65ef5c7 first commit
直前のコミットをまとめる(基本)
散々いろいろなところで紹介されているのでつまりどころはないと思います。
# ~4はHEADから数えて4つ前までを編集する。 $ git rebase -i HEAD~4
コマンドを実行するとエディタが起動します。
pick 5a43974 add ModuleA pick 249a171 add ModuleB pick 2bf2d88 fix ModuleA pick 9dc13c0 fix ModuleB //以下省略
pick
がコミットとコミットメッセージがそのまま残ります。
これを下記の様に変更すると9dc13c0 fix ModuleB
のコミットが2bf2d88 fix ModuleA
にまとめられます。
pick 5a43974 add ModuleA pick 249a171 add ModuleB pick 2bf2d88 fix ModuleA fixup 9dc13c0 fix ModuleB //以下省略
コミットがまとめられたことが確認できます。
$ git log --oneline 8d7ef76 (HEAD -> master) fix ModuleA 249a171 add ModuleB 5a43974 add ModuleA 65ef5c7 first commit
離れたコミットをまとめる
前庭の部分で説明済みですが下記の様にコミットをまとめます。
249a171 add ModuleB
←9dc13c0 fix ModuleB
5a43974 add ModuleA
←2bf2d88 fix ModuleA
手順は基本形と同様です。
$ git rebase -i HEAD~4
pick 5a43974 add ModuleA pick 249a171 add ModuleB pick 2bf2d88 fix ModuleA pick 9dc13c0 fix ModuleB //以下省略
上記までは先程と同様です。
これを下記の様に編集します。
pick 5a43974 add ModuleA fixup 2bf2d88 fix ModuleA pick 249a171 add ModuleB fixup 9dc13c0 fix ModuleB //以下省略
コミットの順序も入れ替えてしまうことが可能でこれでまとめたいコミットの間に別コミットがあった場合でもまとめることが可能です。
雑感
今、ブログを書くために参考サイトを見ていたら普通にやり方書いてありました。
git rebase
後にエディタで編集する部分でコミットの順番を入れ替えると言う発想が全く無かったです。
失った時間プライスレス。