LoginSignup
34
31

More than 5 years have passed since last update.

Git 歴史改変奥義

Last updated at Posted at 2014-04-09

Git のバージョン 1.9.1 で確かめていますが 1.7.12 より新しいなら大丈夫だと思います (根拠: https://raw.github.com/git/git/master/Documentation/RelNotes/1.7.12.txt ).

Git は git rebase で世界線を弄って歴史改変が出来ることで有名ですが (個人の感想です),Initial commit の CommitDate だけは,どうにもしがたいですよね.

そこで環境変数の指定で無理矢理 --committer-date-is-author-date 相当のことを実現する方法です.

git rebase -i --root

まずこれで interactive mode の rebase を始めて,Initial commit を e (もしくは edit) にします.

すると「さぁ git add なり何なりして git rebase --continue して下さいね〜」状態になりますね.ここで

GIT_COMMITTER_DATE='Thu Apr 10 03:21:56 2014 +0900' git commit --amend

としてやります.指定する時間は予め元の Initial commit を見て調べておきましょう.そして git rebase --continue すれば無事 Initial commit を書き換えたのにハッシュが変わっただけで時刻は CommitDate も AuthorDate も変わっていないという状態になります.

そして仕上げに

git rebase <Initial commit のハッシュ値とか master^^^^^... とか指定する> --committer-date-is-author-date

すれば,なんと,ミス修正の痕跡 (CommitDate と AuthorDate のズレ) を一切残さずに修正が完了します.

だから何やねんて言われたら困るんですけど,git push をする前なら自分は一度もミスしてないんだぜ凄いだろと言い張ることが出来ます.

その昔は git rebase では Initial commit だけは操作することが出来なかったので,空の .gitignore を作成しただけの Initial commit を作っておくとかいう姑息なことを自分はやってました.全ては綺麗な歴史のためです.しかし今はもう --root オプションがあるため不要です.Initial commit のミスですらミスしてなかった風に修正することが出来ます.

だから何やねん.

補足のような何か

--root オプションは参考リンク見て貰っても分かる通り引数 (コミット,例えば master とかハッシュ値とか) が取れます.引数があれば Initial commit からそこまでを書き換える…という動作をします (何のために使うのかよく分からん).

参考

34
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
31