Closed8

git rebaseでsquashしつつ、コミット日時の時系列も整えたい

Gekitenius.YGekitenius.Y

「git rebaseを使って過去のコミットをまとめつつ、そのコミットの日時を操作できるのかの確認」
をしたのでそのメモ

やりたいこと
git rebaseで任意のコミットをスカッシュしつつ、コミット日時の時系列も整えたい

Gekitenius.YGekitenius.Y

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のいづれか任意)

Gekitenius.YGekitenius.Y

git rebaseをこれまで使ってこなかったので基礎的なことのキャッチアップから行った

git rebaseは何をするのか?
→特定時点からのコミットの生やし直し
→特定時点をベースにして、そこから先に、操作対象のコミットを生やし直す
→「生やし直す」過程で、コミット同士をまとめたり(squash)、コミットメッセージを変更したり出来る

使い方
git rebase -i <commit hash>

Gekitenius.YGekitenius.Y

「コミットを生やし直す」ものなので以下の性質がある
・操作対象のコミットはコミットハッシュが新しくなる
 →「-i で指定したコミット」より先のコミットのベースを新しくする(re base)
 →ベースを新しくする=異なる変更として扱われる=コミットハッシュが新しくなる

・コミットハッシュが新しくなるほか、コミット日時についても操作時点の日時となる

Gekitenius.YGekitenius.Y

「git rebaseでコミット日時を変えたくない場合にどうしたら良いか」をClaudeに聞いたら
--committer-date-is-author-dateオプションを使えと言われた

gitのコミットにはcomitter dateとauthor dateの2つがあるみたい。

ネット上だとこちらの記事が分かりやすかった。
https://vividcode.hatenablog.com/entry/git/author-date-and-committer-date

Gekitenius.YGekitenius.Y

git rebaseの操作に慣れてきたところで肝心のsquash操作をしたら、まとめたコミットの日時は、まとめる対象のうち最も新しいものが使用されるという仕様が分かった。

複数まとめるときに、まとめる対象のうち、最も新しいコミットの日時をeditで書き換えてもsquashしたらeditで書き換える前のものが使われた。(多分、記憶違いかも知れない

複数まとめる前に、予め、まとめる対象のうち最も新しいコミットの日時をeditで書き換えておく。
そのうえで複数まとめる操作をしたら上手くいった。
→edtiで書き換える操作とsquashする操作とで、2回のgit rebaseをする

このスクラップは10日前にクローズされました