1205

The answers to How to modify existing, unpushed commits? describe a way to amend previous commit messages that haven't yet been pushed upstream. The new messages inherit the timestamps of the original commits. This seems logical, but is there a way to also re-set the times?

5
  • Related: How to change git log date formats
    – kenorb
    Commented Mar 14, 2018 at 11:52
  • 158
    git commit --amend --reset-author Commented Mar 6, 2019 at 1:17
  • 3
    The comment above ^^ (@ErickM.Sprengel) should be the accepted answer. Easy to run, specially to the latest commit. Commented Jul 6, 2020 at 20:45
  • 1
    @WesleyGonçalves that is only a partial answer. What if you don’t want to set the commit time to right now? Your use case is not everyone’s use case. Commented Oct 16, 2023 at 8:57
  • The real question seems to be: Why do you want to do that? Is it because your clock was significantly wrong?
    – U. Windl
    Commented Apr 3 at 7:39

31 Answers 31

1301

You can do an interactive rebase and choose edit for the commit whose date you would like to alter. When the rebase process stops for amending the commit you type in for instance:

git commit --amend --date="Wed Feb 16 14:00 2011 +0100" --no-edit

P.S. --date=now will use the current time.

Afterward, you continue your interactive rebase.

To change the commit date instead of the author date:

GIT_COMMITTER_DATE="Wed Feb 16 14:00 2011 +0100" git commit --amend --no-edit

The lines above set an environment variable GIT_COMMITTER_DATE which is used in amending commit.

Everything is tested in Git Bash.

16
  • 24
    @nschum --date="" and --data"non-date-text" all yield the same, taking the date of now. Commented Nov 18, 2011 at 9:34
  • 17
    on git version 1.7.7.1 using --date="now" gives fatal: invalid date format: now
    – Aragorn
    Commented Jan 10, 2012 at 17:58
  • 10
    When the commit whose date you want to change is the most recent commit, you don't have to do the rebase, you can just do the git commit --amend
    – Eponymous
    Commented May 2, 2012 at 13:09
  • 7
    Instead of export GIT_COMMITTER_DATE="", try unset GIT_COMMITTER_DATE. Commented May 30, 2012 at 13:39
  • 3
    Thanks! I just use --date=now and it worked. No need to bother with guessing formats when I want the current time
    – coladict
    Commented Nov 17, 2020 at 18:54
673
+50

Use git filter-branch with an env filter that sets GIT_AUTHOR_DATE and GIT_COMMITTER_DATE for the specific hash of the commit you're looking to fix.

This will invalidate that and all future hashes.

Example:

If you wanted to change the dates of commit 119f9ecf58069b265ab22f1f97d2b648faf932e0, you could do so with something like this:

git filter-branch --env-filter \
    'if [ $GIT_COMMIT = 119f9ecf58069b265ab22f1f97d2b648faf932e0 ]
     then
         export GIT_AUTHOR_DATE="Fri Jan 2 21:38:53 2009 -0800"
         export GIT_COMMITTER_DATE="Sat May 19 01:01:01 2007 -0700"
     fi'

NOTE: When you make a commit in git the first time, both the author and committer date are set, to the same value. As soon you or someone else rebases or cherry-picks that commit, the committer date gets updated of the newly created commit.

19
  • 7
    See "DATE FORMATS" kernel.org/pub/software/scm/git/docs/git-commit.html
    – Dustin
    Commented Mar 14, 2013 at 21:31
  • 11
    That found the correct value, but just setting those variables didn't actually seem to affect the date of the old commit.
    – IQAndreas
    Commented May 10, 2014 at 20:17
  • 51
    What do you mean by "This will invalidate that and all future hashes."?
    – EpicDavi
    Commented May 12, 2014 at 12:13
  • 26
    EpicDavi: It means that you will have to force push to any remote repository, and anyone who has pulled the commit or any future commits will have to reset and pull, or delete and clone from scratch. As far as I know, there is no method that gets around this.
    – EriF89
    Commented Sep 9, 2014 at 9:12
  • 8
    Just as a note for beginners, the short hash does not work in the if statement, use the long SHA-1 Commented Mar 19, 2019 at 15:57
458

A better way to handle all of these suggestions in one command is

LC_ALL=C GIT_COMMITTER_DATE="$(date)" git commit --amend --no-edit --date "$(date)"

This will set the last commit's commit and author date to "right now."

10
  • 24
    This works great to edit specific commits during an interactive rebase. Commented Dec 9, 2013 at 1:21
  • 20
    It seems that Git isn't locale-aware of date format, so to be completely correct, you'll have to make it something like this: LANG= GIT_COMMITTER_DATE="`date`" git commit --amend --date "`date`" Commented May 27, 2015 at 19:53
  • 21
    you can also just do --date "now". Git >= 2 will interpret that.
    – wisbucky
    Commented Mar 7, 2018 at 22:17
  • 17
    What does LC_ALL=C do?
    – stwykd
    Commented May 5, 2020 at 6:25
  • 6
    @stwykd it ensures that $(date) uses a format that Git can understand, by temporarily overriding the system locale
    – pxeger
    Commented Jul 4, 2021 at 15:09
368

Just do git commit --amend --reset-author --no-edit. For older commits, you can do an interactive rebase and choose edit for the commit whose date you want to modify.

git rebase -i <ref>

Then amend the commit with --reset-author and --no-edit to change the author date to the current date:

git commit --amend --reset-author --no-edit

Finally continue with your interactive rebase:

git rebase --continue
9
  • 8
    good call on using --reset-author, it's new in git 1.6.6 (ref gitlog.wordpress.com/2010/01/13/git-1-6-6 )
    – Tim Abell
    Commented Aug 25, 2015 at 12:57
  • 2
    This works nicely to make Github show the commits of a rebased PR in the correct order, since they order them by timestamp and without this trick, the timestamps may all be the same. Commented Mar 2, 2017 at 9:32
  • 10
    note --reset-author will reset both the Author and the Author Date to now.
    – wisbucky
    Commented Mar 8, 2018 at 0:22
  • 2
    will this change the "COMMITTER DATE" at the same time? Commented Apr 16, 2020 at 14:48
  • 1
    On git 2.39.0 at least, --reset-author also resets the CommitDate
    – Hart Simha
    Commented Jul 26, 2023 at 9:51
228

I wrote a script and Homebrew package for this. Super easy to install, you can find it on GitHub PotatoLabs/git-redate page.

Syntax:

git redate -c 3

You just have to run git redate and you'll be able to edit all the dates in vim of the most recent 5 commits (there's also a -c option for how many commits you want to go back, it just defaults to 5). Let me know if you have any questions, comments, or suggestions!

enter image description here

16
  • 5
    Great stuff, even though I had to use vim rather than nano Commented Mar 25, 2017 at 16:51
  • 7
    completely agree with Mina and @howdoyouturnthison here, why don't you make it editor agnostic via EDITOR environment variable? (also I'm on linux, not mac...)
    – ympostor
    Commented Jun 21, 2017 at 10:46
  • 3
    Thanks @Edmund! Just in case, you script has a problem with handling default value for COMMITS. If it's not set, the following code applies filters just to (I guess/found) the last commit. "git filter-branch -f --env-filter "$ENVFILTER" HEAD~$COMMITS..HEAD >/dev/null" Commented Oct 30, 2017 at 4:42
  • 1
    Nope. Not working.
    – Hitesh
    Commented Dec 28, 2022 at 6:41
  • 2
    Not working as of 2024. Commented Jul 30 at 6:49
195

Each commit is associated with two dates, the committer date and the author date. You can view these dates with:

git log --format=fuller

If you want to change the author date and the committer date of the last 6 commits, you can simply use an interactive rebase :

git rebase -i HEAD~6

.

pick c95a4b7 Modification 1
pick 1bc0b44 Modification 2
pick de19ad3 Modification 3
pick c110e7e Modification 4
pick 342256c Modification 5
pick 5108205 Modification 6

# Rebase eadedca..5108205 onto eadedca (6 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit

For all commits where you want to change the date, replace pick by edit (or just e), then save and quit your editor.

You can now amend each commit by specifying the author date and the committer date in ISO-8601 format:

GIT_COMMITTER_DATE="2017-10-08T09:51:07" git commit --amend --date="2017-10-08T09:51:07"

The first date (GIT_COMMITTER_DATE=) is the commit date, the second one (--date=) is the author date.

Then go to the next commit with :

git rebase --continue

Repeat the process until you amend all your commits. Check your progression with git status.

9
  • 1
    I followed this and ended up on a 'detatched head'!
    – Simon H
    Commented Apr 3, 2017 at 6:16
  • 13
    This is the best and the easiest answer. Small tip: use --no-edit in git commit --amend --no-edit --date=2017-10-08T09:51:07 to keep the old commit message. Commented Apr 16, 2018 at 11:16
  • 3
    You might also want to update GIT_COMMITTER_DATE as described here eddmann.com/posts/…
    – smihael
    Commented Apr 26, 2018 at 16:11
  • 2
    @smihael Thanks for the link. I've included your suggestion in my answer. Commented Jul 31, 2018 at 19:57
  • 3
    Great answer due to git log --format=fuller and the ability to change both dates in one command. Commented Feb 23, 2020 at 10:08
138
git commit --amend --date="now"
2
  • 3
    Thanks! Works great, although it works only for the most recent commit.
    – banan3'14
    Commented Mar 7, 2022 at 15:00
  • This is perfect for when squashing multiple commits into a single one, that always leaves the last commit's date, thanks! Commented Jan 25, 2023 at 11:42
132

How to Edit Multiple Commit Dates

Other answers aren't very convenient for editing several commit dates. I've come back to this question after a few years to share a technique.

To change the dates of the last 4 commits:

git rebase -i HEAD~4

Edit the rebase as follows, inserting exec lines to modify dates as needed:

pick 4ca564e Do something
exec git commit --amend --no-edit --date "1 Oct 2019 12:00:00 PDT"
pick 1670583 Add another thing
exec git commit --amend --no-edit --date "2 Oct 2019 12:00:00 PDT"
pick b54021c Add some tests
exec git commit --amend --no-edit --date "3 Oct 2019 12:00:00 PDT"
pick e8f6653 Fix the broken thing
exec git commit --amend --no-edit --date "4 Oct 2019 12:00:00 PDT"

Update (Sep. 2021):

If you want to see the original commit date in the rebase instruction list (Git 2.6+):

git config --add rebase.instructionFormat "[%ai] %s"

Then you'll see something like

pick 4f5a371f [2021-09-08 02:56:50 -0700] Add npm events
pick 67937227 [2021-09-09 03:05:42 -0700] Fixup
5
  • 1
    Is it possible to use current date/time as parameter?
    – qwerty
    Commented Dec 8, 2019 at 18:55
  • 3
    Re. 'Is it possible to use current date/time as parameter?': "now" is understood as a valid date, so the exec lines above would become exec git commit --amend --no-edit --date "now" Commented May 17, 2020 at 19:01
  • As a addition I wrote a bash script which combines this answer (multiple commits) with the accepted answer (filter): gist.github.com/pixelbrackets/e2c2b451b77516e69377ecb4fd6f3a0d Commented Sep 2, 2020 at 8:19
  • for current date, you can do exec git commit --amend --reset-author --no-edit
    – sziraqui
    Commented Feb 23, 2022 at 9:38
  • To set the commit date and the author date together, you'll need to combine this with the answer from Ortomala Lokni. So you will have to use commands like this: exec GIT_COMMITTER_DATE="1 Oct 2019 12:00:00 PDT" git commit --amend --no-edit --date "1 Oct 2019 12:00:00 PDT"
    – Mr-IDE
    Commented Mar 16 at 13:42
50

After reading all the answers I came up with a more succinct and convenient way of editing the date of multiple commits at once without the need of rebasing interactively:

git rebase HEAD~4 --exec "git commit --amend --no-edit --date 'now'"

It changes both the committer and author dates.

5
  • 3
    I liked your answer, I needed all local commits so I did: git rebase origin/main --exec "git commit --amend --reset-author --no-edit"
    – A1rPun
    Commented Jun 14, 2021 at 13:48
  • Great solution. But I experience a strange issue. When I change all the dates and push it to a remote branch with git push -f -u origin bugfix and see it on Bitbucket page it still contains the previous commit dates. However it's reproducible not only with this solution but with others too. It looks like Git still holds the previous dates somewhere.
    – ka3ak
    Commented Nov 10, 2022 at 14:14
  • 2
    @ka3ak I see a commit has 2 dates/timestamps, AuthorDate and CommitDate, which can be shown using git log --pretty=fuller command, as explained here. I guess Bitbucket shows the CommitDate instead of the AuthorDate. In this particular case I suggest using this command (where t is the date you want to set):t='2017-09-01 12:34:56'; GIT_COMMITTER_DATE="$t" git commit --amend --no-edit --date="$t". This command will change both the AuthorDate and the CommitDate. Commented Nov 16, 2022 at 16:18
  • @PereJoanMartorell I'll try. But in the meantime I used the following approach: While being on branch bugfix I executed git checkout -b bugfix_copy; git reset bugfix; git rebase ...(change commit dates) ; git push origin +bugfix_copy:bugfix. After the last command even Bitbucket showed current time for each commit on its page. I used this approach also because I wanted to keep the branch bugfix whose commit dates would be unchanged.
    – ka3ak
    Commented Nov 17, 2022 at 17:20
  • 3
    Contrary to what the answer claims, this does not change both committer and author dates. I wanted to edit in a change to make it so but "there are too many pending edits, please try again later." Here is an amended solution that follows the same approach: t='2023-06-01T13:12:04'; git rebase HEAD~2 --exec "GIT_COMMITTER_DATE='$t' git commit --amend --no-edit --date '$t'". Replace date string with now or whatever date you want to use instead.
    – Chrisuu
    Commented Jun 2, 2023 at 18:59
47

Building on theosp's answer, I wrote a script called git-cdc (for change date commit) that I put in my PATH.

The name is important: git-xxx anywhere in your PATH allows you to type:

git xxx
# here
git cdc ... 

That script is in bash, even on Windows (since Git will be calling it from its msys environment)

#!/bin/bash
# commit
# date YYYY-mm-dd HH:MM:SS

commit="$1" datecal="$2"
temp_branch="temp-rebasing-branch"
current_branch="$(git rev-parse --abbrev-ref HEAD)"

date_timestamp=$(date -d "$datecal" +%s)
date_r=$(date -R -d "$datecal")

if [[ -z "$commit" ]]; then
    exit 0
fi

git checkout -b "$temp_branch" "$commit"
GIT_COMMITTER_DATE="$date_timestamp" GIT_AUTHOR_DATE="$date_timestamp" git commit --amend --no-edit --date "$date_r"
git checkout "$current_branch"
git rebase  --autostash --committer-date-is-author-date "$commit" --onto "$temp_branch"
git branch -d "$temp_branch"

With that, you can type:

git cdc @~ "2014-07-04 20:32:45"

That would reset author/commit date of the commit before HEAD (@~) to the specified date.

git cdc @~ "2 days ago"

That would reset author/commit date of the commit before HEAD (@~) to the same hour, but 2 days ago.


Ilya Semenov mentions in the comments:

For OS X you may also install GNU coreutils (brew install coreutils), add it to PATH (PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH") and then use "2 days ago" syntax.

6
  • 1
    For me this only worked with quoting the date and the time into one quote: git cdc @~ "2014-07-04 20:32:45 otherwise it would not recognize the time and hence obtain time 00:00:00 (it becomes the third argument).
    – peschü
    Commented Nov 12, 2014 at 9:40
  • 3
    For OS X you may also install GNU coreutils (brew install coreutils), add it to PATH (PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH") and then use "2 days ago" syntax. Commented Dec 4, 2015 at 10:26
  • 2
    @IlyaSemenov Interesting. I have included your comment in the answer for more visibility.
    – VonC
    Commented Dec 4, 2015 at 11:47
  • I am trying to use your first example but I keep getting "fatal: invalid date format:". What date format is Mac OS X expecting?
    – user94547
    Commented Jun 11, 2016 at 19:25
  • @usbsnowcrash not sure on mac. Does the second example "2 days ago" work?
    – VonC
    Commented Jun 11, 2016 at 19:51
31

Information from July 2022:

This one working amazing with current timestamp:

git commit --amend --date=now --no-edit

And this one - with any date format:

git commit --amend --date="Mon Jul 25 10:37:36 2022 +0300" --no-edit
27

To change both the author date and the commit date:

GIT_COMMITTER_DATE="Wed Sep 23 9:40 2015 +0200" git commit --amend --date "Wed Sep 23 9:40 2015 +0200"
1
  • 3
    I’d just add --no-edit to this command, to avoid changing the commit message. Good job!
    – fitojb
    Commented Jan 1, 2022 at 1:52
27

I created this npm package to change date of old commits.

https://github.com/bitriddler/git-change-date

Sample Usage:

npm install -g git-change-date
cd [your-directory]
git-change-date

You will be prompted to choose the commit you want to modify then to enter the new date.

If you want to change a commit by specific hash run this git-change-date --hash=[hash]

3
  • I just wanted to say that this is great and worked beautifully. Thank you, you saved me a great deal of time!
    – panza
    Commented Apr 26, 2020 at 14:35
  • 2
    @Kareem Elbahrawy I am getting following error: Please help me (Git + Windows 10) Command failed: cd C:\D\Projects\Git\xx-xx && git filter-branch -f --env-filter 'if [ $GIT_COMMIT = xxxxxx ] then export GIT_AUTHOR_DATE="Wed Jan 27 16:00:00 2021 +0530" export GIT_COMMITTER_DATE="Wed Jan 27 16:00:00 2021 +0530" fi' fatal: $GIT_COMMIT: no such path in the working tree. Use 'git <command> -- <path>...' to specify paths that do not exist locally. Commented Feb 1, 2021 at 6:47
  • I just wanted to say that it stuck on simple count = 3 and modifying second commit. the error is stdout maxBuffer length exceeded. So I don't recommend this package. Just avoid it.
    – Alexey Sh.
    Commented Jul 27, 2023 at 7:20
23

if it is previous last commit.

git rebase  -i HEAD~2
git commit --amend --date=now

if you already push to orgin and can force use:

git push --force 

if you can't force the push and if it is pushed, you can't change the commit! .

22

The most simple way to modify the date and time of the last commit

git commit --amend --date="12/31/2021 @ 14:00"
2
  • 3
    This changes only the AuthorDate, not the CommitDate. You can see that it does not work by typing git log --format=fuller. Commented Jun 17, 2021 at 13:52
  • 9
    To also change the commit date after this: git rebase --committer-date-is-author-date HEAD^
    – krubo
    Commented May 18, 2022 at 6:22
20

Here is a convenient alias that changes both commit and author times of the last commit to a time accepted by date --date:

[alias]
    cd = "!d=\"$(date -d \"$1\")\" && shift && GIT_COMMITTER_DATE=\"$d\" \
            git commit --amend --date \"$d\""

Usage: git cd <date_arg>

Examples:

git cd now  # update the last commit time to current time
git cd '1 hour ago'  # set time to 1 hour ago

Edit: Here is a more-automated version which checks that the index is clean (no uncommitted changes) and reuses the last commit message, or fails otherwise (fool-proof):

[alias]
    cd = "!d=\"$(date -d \"$1\")\" && shift && \
        git diff-index --cached --quiet HEAD --ignore-submodules -- && \
        GIT_COMMITTER_DATE=\"$d\" git commit --amend -C HEAD --date \"$d\"" \
        || echo >&2 "error: date change failed: index not clean!"
1
  • And the author change, @eold?
    – Oo'-
    Commented Jan 28, 2022 at 12:22
19

The following bash function will change the time of any commit on the current branch.

Be careful not to use if you already pushed the commit or if you use the commit in another branch.

# rewrite_commit_date(commit, date_timestamp)
#
# !! Commit has to be on the current branch, and only on the current branch !!
# 
# Usage example:
#
# 1. Set commit 0c935403 date to now:
#
#   rewrite_commit_date 0c935403
#
# 2. Set commit 0c935403 date to 1402221655:
#
#   rewrite_commit_date 0c935403 1402221655
#
rewrite_commit_date () {
    local commit="$1" date_timestamp="$2"
    local date temp_branch="temp-rebasing-branch"
    local current_branch="$(git rev-parse --abbrev-ref HEAD)"

    if [[ -z "$date_timestamp" ]]; then
        date="$(date -R)"
    else
        date="$(date -R --date "@$date_timestamp")"
    fi

    git checkout -b "$temp_branch" "$commit"
    GIT_COMMITTER_DATE="$date" git commit --amend --date "$date"
    git checkout "$current_branch"
    git rebase "$commit" --onto "$temp_branch"
    git branch -d "$temp_branch"
}
4
  • 1
    You have a bug in there: if [[ -z "$commit" ]] -> if [[ -z "$date_timestamp" ]]
    – blueFast
    Commented Apr 14, 2016 at 8:31
  • Nice! I would recommend setting GIT_COMMITTER_DATE= at the end of the method to prevent any further manual commits to keep the date specified.
    – scharette
    Commented Sep 26, 2019 at 17:56
  • @loopkin, GIT_COMMITTER_DATE is set just for the "git commit" command so no need to clear it afterwards
    – nimrodm
    Commented Apr 26, 2020 at 5:05
  • @nimrodm, I just tested again and you are correct. Thanks for pointing that out.
    – scharette
    Commented Apr 27, 2020 at 13:44
11

If you want to get the exact date of another commit (say you rebase edited a commit and want it to have the date of the original pre-rebase version):

git commit --amend --date="$(git show -s --format=%ai a383243)"

This corrects the date of the HEAD commit to be exactly the date of commit a383243 (include more digits if there are ambiguities). It will also pop up an editor window so you can edit the commit message.

That's for the author date which is what you care for usually - see other answers for the committer date.

0
11

If commit not yet pushed then I can use something like that:

git commit --amend --date=" Wed Mar 25 10:05:44 2020 +0300"

after that git bash opens editor with the already applied date so you need just to save it by typing in the VI editor command mode ":wq" and you can push it

2
  • 2
    Just adding to the nice answer: if you don't want to edit the commit message (if you just want to change the commit date), use the --no-edit option. Commented Jan 15, 2020 at 1:53
  • Also, if the commit has already been pushed, you can still push the changed commit using git push -f (forced update). That may have side effects, though. (especially if many people have local clones of the repository) Commented Jan 15, 2020 at 1:56
11

For updating the date of the 5 last commits to the current date (this method doesn't allow to update the initial commit):

git rebase HEAD~5 --exec "git commit --amend --no-edit --date 'now'"

For all commits after commit 95f5074…15074db2:

git rebase 95f5074…15074db2 --exec "git commit --amend --no-edit --date 'now'"

For all commits (including the initial commit):

git rebase --root --exec "git commit --amend --no-edit --date 'now'"

Add -i for the interactive mode.

Run git log --format=fuller --show-signature to validate the changes.

Run git push -f to update the remote repository (⚠️Danger zone)

There are implications. For instance:

  • Commit IDs will change, so you will have to recreate tags
  • You will lose original signatures
  • This will use your .gitconfig, this means your key will be used for signing commits (if Git is configured to sign commits)
1
  • Instead of changing the date of the last 3 commits, is it possible to change the --date and env variable GIT_COMMITTER_DATE of only the THIRD commit with a single command?
    – the_RR
    Commented Apr 8, 2022 at 18:16
11
GIT_COMMITTER_DATE="Sun Nov 20 21:02 2022 +0530" git commit --amend --no-edit --date="Sun Nov 20 21:02 2022 +0530"
git push -f

Works everytime.

2
  • 1
    why do we need to specify the time twice?
    – Franz Wong
    Commented Dec 16, 2022 at 4:44
  • 1
    This is my guess: there are two timestamps in git: committer date and authoring date. GIT_COMMITTER_DATE takes care of the former and --date takes care of the latter. Commented Dec 16, 2022 at 10:11
9

Set the date of the last commit to the current date

GIT_COMMITTER_DATE="$(date)" git commit --amend --no-edit --date "$(date)"

Set the date of the last commit to an arbitrary date

GIT_COMMITTER_DATE="Mon 20 Aug 2018 20:19:19 BST" git commit --amend --no-edit --date "Mon 20 Aug 2018 20:19:19 BST"

Set the date of an arbitrary commit to an arbitrary or current date

Rebase to before said commit and stop for amendment:

  1. git rebase <commit-hash>^ -i
  2. Replace pick with e (edit) on the line with that commit (the first one)
  3. quit the editor (ESC followed by :wq in VIM)
  4. Either:
  • GIT_COMMITTER_DATE="$(date)" git commit --amend --no-edit --date "$(date)"
  • GIT_COMMITTER_DATE="Mon 20 Aug 2018 20:19:19 BST" git commit --amend --no-edit --date "Mon 20 Aug 2018 20:19:19 BST"

Source: https://codewithhugo.com/change-the-date-of-a-git-commit/

8

If you want to perform the accepted answer (https://stackoverflow.com/a/454750/72809) in standard Windows command line, you need the following command:

git filter-branch -f --env-filter "if [ $GIT_COMMIT = 578e6a450ff5318981367fe1f6f2390ce60ee045 ]; then export GIT_AUTHOR_DATE='2009-10-16T16:00+03:00'; export GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE; fi"

Notes:

  • It may be possible to split the command over multiple lines (Windows supports line splitting with the carret symbol ^), but I didn't succeed.
  • You can write ISO dates, saving a lot of time finding the right day-of-week and general frustration over the order of elements.
  • If you want the Author and Committer date to be the same, you can just reference the previously set variable.

Many thanks go to a blog post by Colin Svingen. Even though his code didn't work for me, it helped me find the correct solution.

7

For those using Powershell

git rebase DESIRED_REF^ -i

$commitDateString = "2020-01-22T22:22:22"
$env:GIT_COMMITTER_DATE = $commitDateString
git commit --amend --date $commitDateString
$env:GIT_COMMITTER_DATE = ""

git rebase --continue

Credit to https://mnaoumov.wordpress.com/2012/09/23/git-change-date-of-commit/

7

Edit the author date and the commit date of the last 3 commits:

git rebase -i HEAD~3 --committer-date-is-author-date --exec "git commit --amend --no-edit --date=now"

The --exec command is appended after each line in the rebase and you can choose the author date with the --date=..., the committer date will be the same of author date.

2
  • I get "fatal: cannot combine apply options with merge options"
    – krubo
    Commented May 18, 2022 at 6:26
  • Git status is clean? The command is exactly that above?
    – gfdevelop
    Commented May 19, 2022 at 7:18
5

In addition to Matt Montag's answer:

If you need to reset timestamp to current time after rebase command

git rebase -i HEAD~2

you can use one of these options

pick 4ca564e Do something
exec git commit --amend --no-edit --date=now
pick 1670583 Add another thing
exec git commit --amend --no-edit --reset-author

Both will work

2

There are already many great answers, but when I want to change date for multiple commits in one day or in one month, I don't find a proper answer. So I create a new script for this with explaintion, hope it will help someone:

#!/bin/bash

# change GIT_AUTHOR_DATE for commit at Thu Sep 14 13:39:41 2017 +0800
# you can change the data_match to change all commits at any date, one day or one month
# you can also do the same for GIT_COMMITTER_DATE

git filter-branch --force --env-filter '

date_match="^Thu, 14 Sep 2017 13+"              

# GIT_AUTHOR_DATE will be @1505367581 +0800, Git internal format 
author_data=$GIT_AUTHOR_DATE;                   
author_data=${author_data#@}                  
author_data=${author_data% +0800}                # author_data is 1505367581     

oneday=$((24*60*60))

# author_data_str will be "Thu, 14 Sep 2017 13:39:41 +0800", RFC2822 format
author_data_str=`date -R -d @$author_data`      

if [[ $author_data_str =~ $date_match ]];
then
    # remove one day from author_data
    new_data_sec=$(($author_data-$oneday))
    # change to git internal format based on new_data_sec
    new_data="@$new_data_sec +0800"             
    export GIT_AUTHOR_DATE="$new_data"
fi
' --tag-name-filter cat -- --branches --tags

The date will be changed:

AuthorDate: Wed Sep 13 13:39:41 2017 +0800
2

I wanted to make sure that I update my code’s copyright comments at precisely midnight, and I didn’t want to risk a tiny delay with at or cron. So, I commited the code and then:

GIT_COMMITTER_DATE="Fri Jan 1 00:00:00 2021 +1000" git commit --amend --no-edit --date="Fri Jan 1 00:00:00 2021 +1000"

(Or perhaps even set the UTC offset to 0? Decisions… ) Now I can push!

Happy new year, everybody 🥳

1

I have recently needed this and made my own script looking a lot like git-redate

However my scripts does the minimal modifications and takes a lot less time to rewrite (if you need to update) many commits as it does them all at once

change_git_history

Actually this allows to change commit messages too

Explaination:

The scripts concatenates a bunch of bash if-expression looking like so

Here are the ones modifiying the commit date

if [ "$GIT_COMMIT" = "$com_hash" ]; # com is commit
then
    export GIT_AUTHOR_DATE="$com_date";
    export GIT_COMMITTER_DATE="$com_date";
fi;

Here are the ones modifiying the commit message:

if [ true = false ]; # impossible
then
    : # pass
elif [ "$GIT_COMMIT" = "$com_hash" ];
then
    sed 's/.*/$com_msg_esc/g' # replace content with new content
else
    cat - # returns previous content
fi;

And we push all the update using

git filter-branch -f \
    --env-filter "$UPDATES" \
    --msg-filter "$MESSAGES" \
    -- "$REV"

(doc is here filter-branch man)

2
  • While this link may answer the question, it is better to include the essential parts of the answer here and provide the link for reference. Link-only answers can become invalid if the linked page changes. - From Review Commented Jan 16, 2022 at 1:38
  • Thanks @SimasJoneliunas I've update the answer :)
    – Xiaojiba
    Commented Jan 18, 2022 at 13:25
1

Here is how you can commit to past dates so it gets reflected both in commit date as well as in your contribution table

If you use git log --pretty=fuller you will see that the commit has:

  • Author/AuthorDate - for contribution table
  • Commit/CommitDate - for commit date (inside repository)
  1. git commit --amend --date="Mar 01 10:00 2024 +0600" --no-edit
  2. GIT_COMMITTER_DATE="2024-03-01 10:00:00" git commit --amend --no-edit
  3. git push --force

Visual Example enter image description here

Not the answer you're looking for? Browse other questions tagged or ask your own question.