Gitのコミットの日付を書き換える

# やりたいこと

- コミット毎に記録されている日付を手動で修正したい

# 前提知識

- Gitのコミットにはコミットの著者である `Author` とコミットを取り込んだ人を表す `Committer` の2つの属性が記録されている
- そしてそれぞれに `Date`(`AuthorDate`) と `CommiterDate` という2種類の日付も記録されている
- デフォルトの `git log` では `Committer` と `CommitterDate` は表示されない

```bash
$ git log
commit 264d947583584b21164580d07defc5a460073cb8
Author: Kazuki Tobita <kazukiti201@gmail.com>
Date:   Mon Jan 30 15:38:14 2023 +0900

    Add c.txt

commit 03003ecd20b6cc1ec960a59a6f751b248b4fda0c
Author: Kazuki Tobita <kazukiti201@gmail.com>
Date:   Mon Jan 30 15:37:55 2023 +0900

    Add b.txt

commit 57ea3e9bb2a102d012b407f480b53c9902846660
Author: Kazuki Tobita <kazukiti201@gmail.com>
Date:   Mon Jan 30 15:36:40 2023 +0900

    Add a.txt
```

- `--pretty=fuller` オプションを付与すると `Committer` と `CommitterDate` も表示される

```bash
$ git log --pretty=fuller
commit 264d947583584b21164580d07defc5a460073cb8
Author:     Kazuki Tobita <kazukiti201@gmail.com>
AuthorDate: Mon Jan 30 15:38:14 2023 +0900
Commit:     Kazuki Tobita <kazukiti201@gmail.com>
CommitDate: Mon Jan 30 15:38:14 2023 +0900

    Add c.txt

commit 03003ecd20b6cc1ec960a59a6f751b248b4fda0c
Author:     Kazuki Tobita <kazukiti201@gmail.com>
AuthorDate: Mon Jan 30 15:37:55 2023 +0900
Commit:     Kazuki Tobita <kazukiti201@gmail.com>
CommitDate: Mon Jan 30 15:37:55 2023 +0900

    Add b.txt

commit 57ea3e9bb2a102d012b407f480b53c9902846660
Author:     Kazuki Tobita <kazukiti201@gmail.com>
AuthorDate: Mon Jan 30 15:36:40 2023 +0900
Commit:     Kazuki Tobita <kazukiti201@gmail.com>
CommitDate: Mon Jan 30 15:36:48 2023 +0900

    Add a.txt
```

# 書き換えてみる

- 直前2つのコミットを対象に、 `Date`(`AuthorDate`) を書き換えてみる

```bash
$ git rebase -i HEAD~2
Stopped at 03003ec...  Add b.txt
You can amend the commit now, with

  git commit --amend '-S'

Once you are satisfied with your changes, run

  git rebase --continue
```

- Vim(環境によっては別のエディタ)が起動する

```vim
pick 03003ec Add b.txt
pick 264d947 Add c.txt
```

- `pick` を `edit` に変更して保存する

```vim
edit 03003ec Add b.txt
edit 264d947 Add c.txt
```

- `date` コマンドの `-R` オプションは、RFC 2822形式で日付を出力するオプション
- 他の形式でもGitが上手くパースしてくれる可能性もある(が、日本語の日付だと上手くパースしてくれなかったりする)
- 基本的に `date -R` と `git commit --ammend --date="xxxx"` と `git rebase --continue` を繰り返して書き換えていくイメージ

```bash
$ date -R
Mon, 30 Jan 2023 16:54:23 +0900

$ git commit --amend --date="Mon, 30 Jan 2023 16:54:23 +0900"
[detached HEAD e8a0462] Add b.txt
 Date: Mon Jan 30 16:54:23 2023 +0900
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 b.txt

$ git rebase --continue
Stopped at 264d947...  Add c.txt
You can amend the commit now, with

  git commit --amend '-S'

Once you are satisfied with your changes, run

  git rebase --continue

$ date -R
Mon, 30 Jan 2023 16:57:21 +0900

$ git commit --amend --date="Mon, 30 Jan 2023 16:57:21 +0900"
[detached HEAD cd69867] Add c.txt
 Date: Mon Jan 30 16:57:21 2023 +0900
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 c.txt
```

- `Successfully rebased and updated refs/heads/master.` が出力されれば終了

```bash
$ git rebase --continue
Successfully rebased and updated refs/heads/master.
```

- ちなみに以下のようにワンライナーにすることもできる

```bash
$ git commit --amend --date="$(date -R)" && git rebase --continue
```

- `CommitterDate` をまとめて書き換える

```
$ git rebase HEAD~2 --committer-date-is-author-date
Current branch master is up to date, rebase forced.
Successfully rebased and updated refs/heads/master.
```

- コミットの日付が書き換えられたことが確認できる

```bash
$ git log --pretty=fuller
commit e80caa5e879eb47c0c6923e403b0729764214e6d (HEAD -> master)
Author:     Kazuki Tobita <kazukiti201@gmail.com>
AuthorDate: Mon Jan 30 16:57:21 2023 +0900
Commit:     Kazuki Tobita <kazukiti201@gmail.com>
CommitDate: Mon Jan 30 16:57:21 2023 +0900

    Add c.txt

commit 8f3dfafd7192b139cbed755d84579aecd80d2343
Author:     Kazuki Tobita <kazukiti201@gmail.com>
AuthorDate: Mon Jan 30 16:54:23 2023 +0900
Commit:     Kazuki Tobita <kazukiti201@gmail.com>
CommitDate: Mon Jan 30 16:54:23 2023 +0900

    Add b.txt

commit 57ea3e9bb2a102d012b407f480b53c9902846660
Author:     Kazuki Tobita <kazukiti201@gmail.com>
AuthorDate: Mon Jan 30 15:36:40 2023 +0900
Commit:     Kazuki Tobita <kazukiti201@gmail.com>
CommitDate: Mon Jan 30 15:36:48 2023 +0900

    Add a.txt
```