如何在Git中更改旧提交的时间戳?

Dhs*_*kdh 673 git timestamp commit git-rewrite-history

如何修改现有的,未删除的提交的答案描述了一种修改先前尚未向上游推送的提交消息的方法.新消息继承原始提交的时间戳.这似乎合乎逻辑,但有没有办法重新设定时间?

Pau*_*ijs 721

您可以执行交互式rebase,并为要更改其日期的提交选择编辑.当rebase进程停止修改提交时,例如:

git commit --amend --date="Wed Feb 16 14:00 2011 +0100"
Run Code Online (Sandbox Code Playgroud)

然后继续交互式rebase.

更新(响应studgeek的评论):更改提交日期而不是作者日期:

GIT_COMMITTER_DATE="Wed Feb 16 14:00 2011 +0100" git commit --amend
Run Code Online (Sandbox Code Playgroud)

上面的行设置了一个环境变量GIT_COMMITTER_DATE,用于修改提交.

一切都在Git Bash中测试过.

  • @nschum --date =""和--data"非日期文本"都是相同的,取现在的日期. (19认同)
  • 在git版本1.7.7.1上使用--date ="now"给出了致命:无效的日期格式:现在 (11认同)
  • 而不是导出GIT_COMMITTER_DATE ="",而是尝试取消设置GIT_COMMITTER_DATE. (5认同)
  • 当您想要更改其日期的提交是最近的提交时,您不必执行`rebase`,您可以只执行`git commit --amend` (3认同)
  • 我正在使用 --no-edit 以便您可以在自动化脚本中使用!`+ var fixedDate = strftime(new Date(), "%c"); + var result = shelljs.exec("git commit --amend --date=\"" + fixedDate + "\" --no-edit");` (2认同)
  • 谢谢!我只是使用 `--date=now` 就成功了。当我想要当前时间时,无需费心猜测格式 (2认同)

Dus*_*tin 497

使用git filter-branch与ENV筛选GIT_AUTHOR_DATE,并GIT_COMMITTER_DATE为提交具体的哈希你正在寻找修复.

这将使该和所有未来的哈希失效.

例:

如果你想更改提交的日期119f9ecf58069b265ab22f1f97d2b648faf932e0,你可以这样做:

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'
Run Code Online (Sandbox Code Playgroud)

  • 你是什​​么意思"这会使这个和所有未来的哈希失效."? (34认同)
  • EpicDavi:这意味着您必须强制推送到任何远程存储库,任何已经撤消提交或任何未来提交的人都必须从头开始重置和提取或删除和克隆.据我所知,没有办法解决这个问题. (12认同)
  • 那**找到了**正确的值,但只是设置这些变量实际上似乎并没有影响旧提交的日期. (8认同)
  • 请参阅"日期格式"https://www.kernel.org/pub/software/scm/git/docs/git-commit.html (4认同)
  • 我不想等待分析超过 9000 个提交! (2认同)
  • 就像给初学者的注释一样,短散列在if语句中不起作用,请使用长SHA-1 (2认同)

Luk*_*man 364

在一个命令中处理所有这些建议的更好方法是

LC_ALL=C GIT_COMMITTER_DATE="$(date)" git commit --amend --no-edit --date "$(date)"
Run Code Online (Sandbox Code Playgroud)

这会将最后一次提交的提交和作者日期设置为"现在".

  • 这只有在最后一次提交时才有效. (26认同)
  • 这非常适合在交互式rebase期间编辑特定提交. (20认同)
  • 似乎Git不是日期格式的语言环境,所以要完全正确,你必须做到这样:`LANG = GIT_COMMITTER_DATE ="\`date \`"git commit --amend - 日期"\`date \`"` (10认同)
  • `LC_ALL=C` 的作用是什么? (6认同)
  • @stwykd 它通过暂时覆盖系统区域设置来确保 `$(date)` 使用 Git 可以理解的格式 (6认同)
  • 您也可以为它的外壳添加别名 (2认同)
  • 您也可以只执行`--date“ now”`。Git> = 2将解释这一点。 (2认同)

Mig*_*rro 165

做吧git commit --amend --reset-author --no-edit.对于较旧的提交,您可以执行交互式rebase并选择edit要修改其日期的提交.

git rebase -i <ref>
Run Code Online (Sandbox Code Playgroud)

然后使用--reset-author和修改提交--no-edit将作者日期更改为当前日期:

git commit --amend --reset-author --no-edit
Run Code Online (Sandbox Code Playgroud)

最后继续使用您的交互式rebase:

git rebase --continue
Run Code Online (Sandbox Code Playgroud)

  • 好好打电话使用`--reset-author`,这是git 1.6.6中的新功能(参考https://gitlog.wordpress.com/2010/01/13/git-1-6-6/) (3认同)
  • 这可以很好地使 Github 以正确的顺序显示重新调整的 PR 的提交,因为[他们按时间戳对它们进行排序](https://help.github.com/articles/why-are-my-commits-in-the -wrong-order/) 如果没有这个技巧,时间戳可能都是相同的。 (2认同)
  • 注意`--reset-author`会将Author和Author Date重置为现在。 (2认同)
  • 这会同时更改“提交者日期”吗? (2认同)

big*_*ato 115

我为此写了一个脚本和Homebrew包.超级易于安装,您可以在GitHub PotatoLabs/git-redate页面上找到它.

句法:

git redate -c 3
Run Code Online (Sandbox Code Playgroud)

你只需要运行git redate,你就可以编辑最近5次提交的vim中的所有日期(还有一个-c选项可以让你想要返回多少次提交,它只是默认为5).如果您有任何问题,意见或建议,请与我们联系!

在此输入图像描述

  • 很棒的东西,即使我不得不使用 vim 而不是 nano (3认同)
  • 完全同意Mina和@howdoyouturnthison这里,为什么不通过EDITOR环境变量让它与编辑器无关?(我也是在linux上,而不是mac ...) (3认同)
  • 谢谢@Edmund!以防万一,您的脚本在处理COMMITS的默认值时遇到问题.如果未设置,则以下代码仅对(我猜/发现)最后一次提交应用过滤器."git filter-branch -f --env-filter"$ ENVFILTER"HEAD~ $ COMMITS..HEAD>/dev/null" (2认同)

Ort*_*kni 83

每个提交都与两个日期相关联,即提交者日期和作者日期.您可以使用以下方式查看这些日

git log --format=fuller
Run Code Online (Sandbox Code Playgroud)

如果要更改最近6次提交的作者日期和提交者日期,可以使用交互式rebase:

git rebase -i HEAD~6
Run Code Online (Sandbox Code Playgroud)

.

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
Run Code Online (Sandbox Code Playgroud)

对于要更改日期的所有提交,请替换pickedit(或仅e),然后保存并退出编辑器.

您现在可以通过以ISO-8601格式指定作者日期和提交者日期来修改每个提交:

GIT_COMMITTER_DATE="2017-10-08T09:51:07" git commit --amend --date="2017-10-08T09:51:07"
Run Code Online (Sandbox Code Playgroud)

第一个日期是提交日期,第二个日期是作者日期.

然后转到下一个提交:

git rebase --continue
Run Code Online (Sandbox Code Playgroud)

重复此过程,直到您修改所有提交.检查你的进展git status.

  • 这是最好和最简单的答案。小提示:在`git commit --amend --no-edit --date=2017-10-08T09:51:07`中使用`--no-edit`来保留旧的提交信息。 (8认同)
  • 您可能还想按照此处所述更新 `GIT_COMMITTER_DATE` http://eddmann.com/posts/changed-the-timestamp-of-a-previous-git-commit/ (2认同)
  • @smihael 感谢您的链接。我已将您的建议包含在我的回答中。 (2认同)
  • 由于“git log --format=fuller”以及在一个命令中更改两个日期的能力,这是一个很好的答案。 (2认同)

Mat*_*tag 61

如何编辑多个提交日期

其他答案对于编辑多个提交日期不是很方便。几年后我又回到这个问题来分享一项技术。

要更改最后 4 次提交的日期:

git rebase -i HEAD~4
Run Code Online (Sandbox Code Playgroud)

按如下方式编辑变基,插入exec行以根据需要修改日期:

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"
Run Code Online (Sandbox Code Playgroud)

  • 关于。'是否可以使用当前日期/时间作为参数?':“now”被理解为有效日期,因此上面的 exec 行将变为 `exec git commit --amend --no-edit --date "now" ` (3认同)

Von*_*onC 42

theosp答案的基础上,我写了一个名为git-cdc(更改日期提交)的脚本,我把它放在我的PATH.

名称很重要:git-xxxPATH可以在任何地方输入:

git xxx
# here
git cdc ... 
Run Code Online (Sandbox Code Playgroud)

即使在Windows上,该脚本仍然使用bash(因为Git将从其msys环境调用它)

#!/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"
Run Code Online (Sandbox Code Playgroud)

有了它,你可以输入:

git cdc @~ "2014-07-04 20:32:45"
Run Code Online (Sandbox Code Playgroud)

这会将HEAD(@~)之前提交的作者/提交日期重置为指定日期.

git cdc @~ "2 days ago"
Run Code Online (Sandbox Code Playgroud)

这会将HEAD(@~)之前提交的作者/提交日期重置为同一小时,但是2天前.


Ilya Semenov 在评论中提到:

对于OS X,您还可以安装GNU coreutils(brew install coreutils),将其添加到PATH(PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH")然后使用" 2 days ago"语法.

  • 对于OS X,您还可以安装GNU coreutils(`brew install coreutils`),将其添加到PATH(`PATH ="/ usr/local/opt/coreutils/libexec/gnubin:$ PATH"`),然后使用"2天以前的"语法. (3认同)
  • 在OSX shell中等效的日期命令是什么? (2认同)
  • @IlyaSemenov 有趣。我已将您的评论包含在答案中以提高知名度。 (2认同)

Har*_*ren 39

git commit --amend --date="now"
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!效果很好,尽管它仅适用于最近的提交。 (3认同)

yoz*_*hik 25

2022 年 7 月的信息:

这与当前时间戳的工作效果非常惊人:

git commit --amend --date=now --no-edit
Run Code Online (Sandbox Code Playgroud)

而这个 - 具有任何日期格式:

git commit --amend --date="Mon Jul 25 10:37:36 2022 +0300" --no-edit
Run Code Online (Sandbox Code Playgroud)


Per*_*ell 24

阅读完所有答案后,我想出了一种更简洁、更方便的方法来一次编辑多个提交的日期,而无需交互式地重新定位:

git rebase HEAD~4 --exec "git commit --amend --no-edit --date 'now'"
Run Code Online (Sandbox Code Playgroud)

它会更改提交者和作者日期。

  • 我喜欢你的答案,我需要所有本地提交,所以我这样做了: `git rebase origin/main --exec "git commit --amend --reset-author --no-edit"` (3认同)
  • @ka3ak 我看到提交有 2 个日期/时间戳,“AuthorDate”和“CommitDate”,可以使用“git log --pretty=fuller”命令显示,如[此处](https://learn.microsoft. com/en-us/azure/devops/repos/git/git-dates?view=azure-devops)。我猜 Bitbucket 显示的是“CommitDate”而不是“AuthorDate”。在这种特殊情况下,我建议使用此命令(其中“t”是您要设置的日期):“t='2017-09-01 12:34:56'; GIT_COMMITTER_DATE="$t" git commit --amend --no-edit --date="$t"`。此命令将更改“AuthorDate”和“CommitDate”。 (2认同)
  • 与答案所声称的相反,这不会更改提交者和作者日期。我想在更改中进行编辑以实现此目的,但是“待处理的编辑太多,请稍后再试。” 这是遵循相同方法的修正解决方案: `t='2023-06-01T13:12:04'; git rebase HEAD~2 --exec "GIT_COMMITTER_DATE='$t' git commit --amend --no-edit --date '$t'"`。将日期字符串替换为“now”或您想要使用的任何日期。 (2认同)

Sér*_*gio 18

如果它是前一次提交.

git rebase  -i HEAD~2
git commit --amend --date=now
Run Code Online (Sandbox Code Playgroud)

如果你已经推送到orgin并且可以强制使用:

git push --force 
Run Code Online (Sandbox Code Playgroud)

如果你不能强制推送,如果它被推,你不能改变提交!.


eol*_*old 15

这是一个方便的别名,它将上次提交的提交和作者时间更改为接受的时间date --date:

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

用法: git cd <date_arg>

例子:

git cd now  # update the last commit time to current time
git cd '1 hour ago'  # set time to 1 hour ago
Run Code Online (Sandbox Code Playgroud)

编辑: 这是一个更自动化的版本,它检查索引是否干净(没有未提交的更改)并重用最后一次提交消息,否则失败(防呆):

[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!"
Run Code Online (Sandbox Code Playgroud)


the*_*osp 13

以下bash函数将更改当前分支上的任何提交时间.

如果您已经推送了提交或者在另一个分支中使用提交,请小心不要使用.

# 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"
}
Run Code Online (Sandbox Code Playgroud)


Kar*_*awy 13

我创建了这个npm包来改变旧提交的日期.

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

样品用法:

npm install -g git-change-date
cd [your-directory]
git-change-date
Run Code Online (Sandbox Code Playgroud)

系统将提示您选择要修改的提交,然后输入新日期.

如果要通过特定哈希更改提交,请运行此命令 git-change-date --hash=[hash]

  • @Kareem Elbahrawy 我收到以下错误:请帮助我(Git + Windows 10)命令失败:cd C:\D\Projects\Git\xx-xx &amp;&amp; git filter-branch -f --env-filter 'if [ $ GIT_COMMIT = xxxxxx ] 然后导出 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: 工作中没有这样的路径树。使用 'git &lt;command&gt; -- &lt;path&gt;...' 指定本地不存在的路径。 (2认同)

Jan*_*n H 10

要更改作者日期和提交日期:

GIT_COMMITTER_DATE="Wed Sep 23 9:40 2015 +0200" git commit --amend --date "Wed Sep 23 9:40 2015 +0200"
Run Code Online (Sandbox Code Playgroud)

  • 我只是将“--no-edit”添加到该命令中,以避免更改提交消息。好工作! (3认同)

小智 10

如果提交尚未推送,那么我可以使用类似的东西:

git commit --amend --date=" Wed Mar 25 10:05:44 2020 +0300"
Run Code Online (Sandbox Code Playgroud)

之后 git bash 用已经应用的日期打开编辑器,所以你只需要通过在 VI 编辑器命令模式中输入“:wq”来保存它,你就可以推送它

  • 只是添加一个很好的答案:如果您不想编辑提交消息(如果您只想更改提交日期),请使用“--no-edit”选项。 (2认同)

Tho*_*wig 10

最简单的修改上次提交日期的方法

git commit --amend --date="12/31/2021 @ 14:00"
Run Code Online (Sandbox Code Playgroud)

  • 在此之后还可以更改提交日期: `git rebase --committer-date-is-author-date HEAD^` (9认同)
  • 这仅更改“AuthorDate”,而不更改“CommitDate”。你可以通过输入`git log --format=fuller`看到它不起作用。 (3认同)

Jea*_*vre 9

将最近 5 次提交的日期更新为当前日期(此方法不允许更新初始提交):

\n
git rebase HEAD~5 --exec "git commit --amend --no-edit --date 'now'"\n
Run Code Online (Sandbox Code Playgroud)\n

对于提交 95f5074\xe2\x80\xa615074db2之后的所有提交:

\n
git rebase 95f5074\xe2\x80\xa615074db2 --exec "git commit --amend --no-edit --date 'now'"\n
Run Code Online (Sandbox Code Playgroud)\n

对于所有提交(包括初始提交):

\n
git rebase --root --exec "git commit --amend --no-edit --date 'now'"\n
Run Code Online (Sandbox Code Playgroud)\n

添加-i交互模式。

\n

运行git log --format=fuller --show-signature以验证更改。

\n

运行git push -f以更新远程存储库(\xe2\x9a\xa0\xef\xb8\x8f危险区域)

\n

这是有影响的。例如:

\n
    \n
  • 提交 ID 将会更改,因此您必须重新创建标签
  • \n
  • 您将丢失原始签名
  • \n
  • 这将使用您的.gitconfig,这意味着您的密钥将用于签署提交(如果 Git 配置为签署提交)
  • \n
\n


Ank*_*ham 9

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
Run Code Online (Sandbox Code Playgroud)

每次都有效。


Mr_*_*s_D 8

如果你想获得另一个提交的确切日期(比如你修改了一个提交并希望它具有原始pre-rebase版本的日期):

git commit --amend --date="$(git show -s --format=%ai a383243)"
Run Code Online (Sandbox Code Playgroud)

这纠正头部的日期提交要准确提交a383243之日起(包括多个数字,如果有不清楚的地方).它还会弹出一个编辑器窗口,以便您可以编辑提交消息.

这是作者日期,这是你通常关心的 - 请参阅提交者日期的其他答案.


小智 7

对于那些使用 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
Run Code Online (Sandbox Code Playgroud)

归功于https://mnaoumov.wordpress.com/2012/09/23/git-change-date-of-commit/


gfd*_*lop 7

编辑作者日期和最近 3 次提交的提交日期:

git rebase -i HEAD~3 --committer-date-is-author-date --exec "git commit --amend --no-edit --date=now"
Run Code Online (Sandbox Code Playgroud)

--exec命令附加在 rebase 中的每一行之后,您可以使用 选择作者日期--date=...,提交者日期将与作者日期相同。


evo*_*ved 6

将上次提交的日期设置为当前日期

GIT_COMMITTER_DATE="$(date)" git commit --amend --no-edit --date "$(date)"
Run Code Online (Sandbox Code Playgroud)

将上次提交的日期设置为任意日期

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"
Run Code Online (Sandbox Code Playgroud)

将任意提交的日期设置为任意或当前日期

变基到之前所说的提交并停止修改:

  1. git rebase <commit-hash>^ -i
  2. 在该提交(第一个)的行上替换picke(编辑)
  3. 退出编辑器(ESC 后跟:wq在 VIM 中)
  4. 任何一个:
  • 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"

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


Pet*_*ter 5

如果要在标准Windows命令行中执行接受的答案(/sf/answers/31832531/),则需要以下命令:

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"
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 可以将命令拆分为多行(Windows支持使用carret符号进行行拆分^),但是我没有成功。
  • 您可以编写ISO日期,从而节省大量时间来查找正确的星期几,并使元素顺序普遍受挫。
  • 如果您希望作者和提交者的日期相同,则可以引用先前设置的变量。

非常感谢Colin Svingen博客文章。即使他的代码对我不起作用,它也帮助我找到了正确的解决方案。


mec*_*cov 5

除了马特·蒙塔格的回答之外:

如果您需要在 rebase 命令后将时间戳重置为当前时间

git rebase -i HEAD~2
Run Code Online (Sandbox Code Playgroud)

您可以使用以下选项之一

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
Run Code Online (Sandbox Code Playgroud)

两者都会起作用