【问题标题】:modify previous commit without changing timestamp修改先前的提交而不更改时间戳
【发布时间】:2021-08-30 10:54:08
【问题描述】:

要修改之前的提交,我可以在我的阶段性更改上运行提交

git commit --amend --no-edit
git push -f

提交已被修改,但提交的时间戳更改...

有没有办法改变时间?比如:

git commit --amend --no-edit --no-time-change

【问题讨论】:

标签: git github git-commit


【解决方案1】:

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

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

  • 作者日期和
  • 提交者日期。

使用git commit 时,无论有无--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

或:

env GIT_AUTHOR_DATE="$(git log --no-walk --format=%ad)" GIT_COMMITTER_DATE="$(git log --no-walk --format=%cd)" git commit --amend

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

(如果您愿意,请将 --no-walk 替换为 -1。请注意,无论哪种方式,我们都依赖于这样一个事实,即在没有起点的情况下,git log 假定为 HEAD。)

【讨论】:

  • 很好的解释!谢谢
猜你喜欢
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 2015-05-04
  • 2010-10-12
  • 1970-01-01
  • 2014-10-11
  • 1970-01-01
相关资源
最近更新 更多