git rebaseでsquashしつつ、コミット日時の時系列も整えたい
「git rebaseを使って過去のコミットをまとめつつ、そのコミットの日時を操作できるのかの確認」
をしたのでそのメモ
やりたいこと
git rebaseで任意のコミットをスカッシュしつつ、コミット日時の時系列も整えたい
Summary
・コミット日時を保ちたい場合、--committer-date-is-author-date
オプションを利用する。
・オプションを利用して複数コミットをsquashする場合、最も新しいコミットのauthor dateが採用される
・オプションを利用して複数コミットをsquashする場合で、どうしても全体の時系列を崩したくないときには、squashするコミットのうち最も新しいコミットのauthor dateを予め書き換えておく
Step1. squash対象のコミットのうち、最も新しいコミットのauthor dateを書き換える(ここでもgit rebaseを利用)
Step2. squashする
※Step1、Step2どちらも--commiter-date-is-author-date
は付ける
Ex1 ,
A -> B -> C -> Dとコミットが並んでいた場合で、B〜Dを改変したい時は
git rebase -i <Commit A hash> --committer-date-is-autor-date
とする
Ex2 ,
A -> B -> C -> D -> E -> FをA -> (C, D, E) -> B -> Fとする場合で時系列も保ちたい場合
Step1. git rebase -i <Commit D hash> --committer-date-is-author-date
editでコミットEの日時を書き換えるgit commit --amend --no-edit --data="2024-10--01T10:10:00+0900"
Step2. git rebase -i <Commit A hash> --committer-date-is-author-date
C, D, Eをsquashでまとめる(まとめる先はC, D, Eのいづれか任意)
git rebaseをこれまで使ってこなかったので基礎的なことのキャッチアップから行った
git rebaseは何をするのか?
→特定時点からのコミットの生やし直し
→特定時点をベースにして、そこから先に、操作対象のコミットを生やし直す
→「生やし直す」過程で、コミット同士をまとめたり(squash)、コミットメッセージを変更したり出来る
使い方
git rebase -i <commit hash>
もっぱらClaudeとの対話を通して理解&手を動かす、、でやってたのでネット上の記事は
ほぼ見ていないのだけど、こちらの記事は良くまとまっていて読みやすかったのでおいておく
「コミットを生やし直す」ものなので以下の性質がある
・操作対象のコミットはコミットハッシュが新しくなる
→「-i で指定したコミット」より先のコミットのベースを新しくする(re base)
→ベースを新しくする=異なる変更として扱われる=コミットハッシュが新しくなる
・コミットハッシュが新しくなるほか、コミット日時についても操作時点の日時となる
「git rebaseでコミット日時を変えたくない場合にどうしたら良いか」をClaudeに聞いたら
--committer-date-is-author-date
オプションを使えと言われた
gitのコミットにはcomitter dateとauthor dateの2つがあるみたい。
ネット上だとこちらの記事が分かりやすかった。
以前にgitのコミット日時を弄ったときの記事にしっかり言及されてた
git rebaseの操作に慣れてきたところで肝心のsquash操作をしたら、まとめたコミットの日時は、まとめる対象のうち最も新しいものが使用されるという仕様が分かった。
複数まとめるときに、まとめる対象のうち、最も新しいコミットの日時をeditで書き換えてもsquashしたらeditで書き換える前のものが使われた。(多分、記憶違いかも知れない
複数まとめる前に、予め、まとめる対象のうち最も新しいコミットの日時をeditで書き換えておく。
そのうえで複数まとめる操作をしたら上手くいった。
→edtiで書き換える操作とsquashする操作とで、2回のgit rebaseをする