lycheejam's tech log

チラ裏のメモ帳 | プログラミングは苦手、インフラが得意なつもり。

Gitの離れたcommitをまとめる(git rebase -i)

概要

gitのcommitをまとめる過程で、ABCの並び順でコミットが存在しACをまとめるパターンでハマったのでメモです。

単純なことで時間が吸い込まれていきました...

目次

参考サイト様

環境

$ git --version
git version 2.20.1 (Apple Git-117)

※実際にハマった環境はWindowsですが特に環境による差異はないと思います。

前提(コミットログの確認&想定シナリオ)

最初にコミット履歴を確認しておきます。
シナリオとしてはadd ModuleA(249a171)add ModuleB(249a171)のコミット後、PullRequestを行いましたがレビューで指摘事項があったため修正すると言う流れを想定しています。

その、各修正コミットをModuleA/Bそれぞれのaddコミットにまとめます。

  • 249a171 add ModuleB9dc13c0 fix ModuleB
  • 5a43974 add ModuleA2bf2d88 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 ModuleB9dc13c0 fix ModuleB
  • 5a43974 add ModuleA2bf2d88 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後にエディタで編集する部分でコミットの順番を入れ替えると言う発想が全く無かったです。
失った時間プライスレス。