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

1111

如何修改已存在但未推送的提交信息?的答案描述了一种方式,可以修改尚未向上游推送的先前提交的消息。 新消息继承原始提交的时间戳。这似乎很合理,但是否有一种方法也可以重新设置时间?


140
git commit --amend --reset-author - Erick M. Sprengel
1
上面的评论^^ (@ErickM.Sprengel) 应该被接受为答案。易于运行,特别是最新提交。 - Wesley Gonçalves
@WesleyGonçalves 这只是一个部分答案。如果你不想将提交时间设置为现在怎么办?你的使用情况并不适用于每个人。 - undefined
30个回答

24

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

GIT_COMMITTER_DATE="Wed Sep 23 9:40 2015 +0200" git commit --amend --date "Wed Sep 23 9:40 2015 +0200"

3
我只会在这个命令中添加“--no-edit”,以避免更改提交消息。 做得好! - fitojb

24
我创建了这个npm包来修改旧提交的日期。 https://github.com/bitriddler/git-change-date 示例用法:
npm install -g git-change-date
cd [your-directory]
git-change-date

您将被提示选择要修改的提交,然后输入新日期。

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


我只想说这太棒了,而且运行得非常好。谢谢你,你节省了我大量的时间! - panza
2
我遇到了以下错误:请帮助我解决(Git + Windows 10)命令失败: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' 致命错误:$GIT_COMMIT:工作树中没有此路径。 使用“git <command> --<path>...”指定本地不存在的路径。 - Rikin Patel
我只是想说,它在简单计数=3和修改第二次提交时出现了问题。错误是stdout maxBuffer长度超过限制。所以我不推荐使用这个软件包。最好避免使用它。 - Alexey Sh.

23

如果它是前一次最后提交。

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

如果您已经推送到远程仓库并且需要强制覆盖使用:

git push --force 

如果你不能强制推送并且已经推送了,你就无法更改提交!


22
修改最后一次提交的日期和时间最简单的方法
git commit --amend --date="12/31/2021 @ 14:00"

3
这只改变了“AuthorDate”,而不是“CommitDate”。通过输入“git log --format=fuller”可以看出它不起作用。 - Rafał Sroka
8
要修改提交日期,可以在以下命令后面添加:git rebase --committer-date-is-author-date HEAD^ - krubo

19
以下是一个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"
}

1
你的代码里有一个错误:if [[ -z "$commit" ]] -> if [[ -z "$date_timestamp" ]] - blueFast
不错!我建议在方法末尾设置GIT_COMMITTER_DATE=,以防止进一步手动提交以保持指定的日期。 - scharette
@loopkin,GIT_COMMITTER_DATE仅针对“git commit”命令设置,因此无需在之后清除它。 - nimrodm
@nimrodm,我刚刚再次测试了一下,你是正确的。感谢你指出这一点。 - scharette

19

这里有一个方便的别名,可以将最后一次提交的提交时间和作者时间更改为date --date接受的时间:

以下是翻译后的内容:

这里有一个方便的别名,可以将最后一次提交的提交时间和作者时间更改为date --date接受的时间:

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

用法: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

编辑: 这里有一个更自动化的版本,它检查索引是否干净(没有未提交的更改),并重复使用上一次提交消息,否则会失败(防范措施):

[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!"

作者更改了,@eold? - Oo'-

16

2022年7月的信息:

这个可与当前时间戳完美配合使用:

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

还有这个例子-适用于任何日期格式:

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

11

如果你想获取另一个提交的确切日期(比如你变基编辑了一个提交,想让它保留原来变基前的日期):

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

此操作将修正 HEAD 提交的日期为提交记录 a383243 的日期,确保完全一致(如果有歧义,请包含更多数字)。它还会弹出编辑器窗口以便您可以编辑提交消息。

这是针对通常感兴趣的作者日期进行的操作 - 有关提交者日期的其他答案,请参见其他答案。


11
如果提交后还没有推送,我可以使用类似这样的内容:

如果提交后还没有推送,则可以使用类似于以下的内容:

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

之后Git Bash会打开编辑器,并且已经应用了日期,因此您只需要在VI编辑器命令模式下输入“:wq”以保存并推送它


2
只是补充一下优秀的回答:如果你不想编辑提交信息(仅想更改提交日期),请使用“--no-edit”选项。 - Antônio Medeiros
此外,如果提交已经被推送,您仍然可以使用 git push -f(强制更新)来推送更改的提交。但这可能会产生副作用。(特别是如果许多人有本地克隆库) - Antônio Medeiros

9

将最后提交的日期设置为当前日期

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"

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

回退到指定提交之前并暂停以进行修改:

  1. git rebase <commit-hash>^ -i
  2. 将该提交所在行(第一行)上的 pick 替换为 e (edit)
  3. 退出编辑器(在VIM中按ESC,然后输入 :wq
  4. 要么:
  • GIT_COMMITTER_DATE="$(date)" git commit --amend --no-edit --date "$(date)"
  • GIT_COMMITTER_DATE="星期一 2018年08月20日 20时19分19秒 BST" git commit --amend --no-edit --date "星期一 2018年08月20日 20时19分19秒 BST"

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接