修改先前的提交而不更改时间戳

lor*_*der 2 git github git-commit

要修改之前的提交,我可以对分阶段更改运行提交

git commit --amend --no-edit
git push -f
Run Code Online (Sandbox Code Playgroud)

提交已被修改,但提交的时间戳发生了变化......

有没有办法改变时间戳?就像是:

git commit --amend --no-edit --no-time-change
Run Code Online (Sandbox Code Playgroud)

tor*_*rek 8

注意,git commit --amend修改提交;相反,它会进行新的和改进的提交,并停止使用旧的和糟糕的提交。如果其他人或任何其他分支可以访问原始提交,那么这种区别很重要,因为他们不会切换到新的和改进的提交。新的提交有一个新的、不同的哈希ID;旧提交的所有用户都使用旧的哈希 ID,该 ID 未更改。由于这些原因,日期更改这一事实通常并不重要。

也就是说:每次提交都有两个时间戳:

  • 作者日期,以及
  • 提交者日期。

当使用git commit, with 或 without时--amend,您可以使用--date=<whatever>来指定作者日期,但没有用于指定提交者日期的标志。

幸运的是,您可以设置两个环境变量来覆盖提交者和作者日期。这些是GIT_AUTHOR_DATEGIT_COMMITTER_DATE。例如,它们接受--date与接受和显示两个日期相同的日期格式。git show --pretty=fuller

使用任一eval(一般来说有点危险)或env,我们可以让 sh/bash 兼容的 shell 为我们做这件事:

eval $(git log --no-walk --format='GIT_AUTHOR_DATE="%ad" GIT_COMMITTER_DATE="%cd"') git commit --amend
Run Code Online (Sandbox Code Playgroud)

或者:

env GIT_AUTHOR_DATE="$(git log --no-walk --format=%ad)" GIT_COMMITTER_DATE="$(git log --no-walk --format=%cd)" git commit --amend
Run Code Online (Sandbox Code Playgroud)

eval方法有点短,调用git次数也更少,但这确实意味着您必须小心命令本身。只要命令本身只是git commit --amend,整个事情就可以正常工作,因此您可以将其设为 Git 别名(记住!强制 Git 将其传递给 shell 的前导)。

(如果您愿意,请替换--no-walk-1。请注意,无论哪种方式,我们都依赖这样一个事实:如果没有起点,git log则假设HEAD。)