如何修改现有的,未按下的提交的答案?描述一种修改尚未提交到上游的先前提交消息的方法。新消息继承了原始提交的时间戳。这似乎合乎逻辑,但是有没有办法重新设置时间呢?
git commit --amend --reset-author
如何修改现有的,未按下的提交的答案?描述一种修改尚未提交到上游的先前提交消息的方法。新消息继承了原始提交的时间戳。这似乎合乎逻辑,但是有没有办法重新设置时间呢?
git commit --amend --reset-author
Answers:
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'
您可以进行交互式变基,并为要更改其日期的提交选择编辑。例如,当变基过程停止修改提交时,您输入:
git commit --amend --date="Wed Feb 16 14:00 2011 +0100"
之后,您继续进行交互式变基。
更新(响应studgeek的评论):更改提交日期而不是作者日期:
GIT_COMMITTER_DATE="Wed Feb 16 14:00 2011 +0100" git commit --amend
上面的几行设置了一个环境变量GIT_COMMITTER_DATE,用于修改提交。
一切都在Git Bash中进行了测试。
rebase
,您只需执行git commit --amend
+ var fixedDate = strftime(new Date(), "%c"); + var result = shelljs.exec("git commit --amend --date=\"" + fixedDate + "\" --no-edit");
在一个命令中处理所有这些建议的更好方法是
LC_ALL=C GIT_COMMITTER_DATE="$(date)" git commit --amend --no-edit --date "$(date)"
这会将上次提交的提交和作者日期设置为“现在”。
LANG= GIT_COMMITTER_DATE="`date`" git commit --amend --date "`date`"
--date "now"
。Git> = 2将解释这一点。
做吧git commit --amend --reset-author --no-edit
。对于较早的提交,您可以进行交互式变基,然后选择edit
要修改其日期的提交。
git rebase -i <ref>
然后使用修改提交,--reset-author
并将--no-edit
作者日期更改为当前日期:
git commit --amend --reset-author --no-edit
最后,继续您的交互式变基:
git rebase --continue
--reset-author
,这在Git的新的1.6.6(REF gitlog.wordpress.com/2010/01/13/git-1-6-6)
--reset-author
会将“作者”和“作者日期”重置为现在。
我为此编写了一个脚本和Homebrew软件包。超级易于安装,您可以在GitHub PotatoLabs/git-redate
页面上找到它。
句法:
git redate -c 3
您只需要运行git redate
,就可以在vim中编辑最近的5次提交的所有日期(您还可以-c
选择要返回的提交数量,默认为5)。如果您有任何问题,意见或建议,请告诉我!
每次提交都与两个日期相关联,即提交者日期和作者日期。您可以使用以下方式查看这些日期:
git log --format=fuller
如果要更改作者的日期和最近6次提交的提交者日期,则可以使用交互式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
对于您要更改日期的所有提交,请替换pick
为edit
(或仅替换为e
),然后保存并退出编辑器。
现在,您可以通过以ISO-8601格式指定作者日期和提交者日期来修改每个提交:
GIT_COMMITTER_DATE="2017-10-08T09:51:07" git commit --amend --date="2017-10-08T09:51:07"
第一个日期是提交日期,第二个日期是作者日期。
然后使用以下命令转到下一个提交:
git rebase --continue
重复该过程,直到您修改所有提交。使用检查您的进度git status
。
git checkout name-of-current-branch
。
--no-edit
在git commit --amend --no-edit --date=2017-10-08T09:51:07
保留旧的提交信息。
GIT_COMMITTER_DATE
按此处所述进行更新eddmann.com/posts/…–
在theosp的答案的基础上,我编写了一个名为git-cdc
(用于更改日期提交)的脚本,并将其放入了PATH
。
名称很重要:git-xxx
您PATH
可以在任何位置键入:
git xxx
# here
git cdc ...
该脚本甚至在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"
这样,您可以输入:
git cdc @~ "2014-07-04 20:32:45"
这会将HEAD(@~
)之前的提交的作者/提交日期重置为指定的日期。
git cdc @~ "2 days ago"
这样会将HEAD(@~
)之前的提交的作者/提交日期重置为同一小时,但为2天之前。
Ilya Semenov 在评论中提到:
对于OS X,您也可以安装GNU
coreutils
(brew install coreutils
),将其添加到PATH
(PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
),然后使用“2 days ago
”语法。
git cdc @~ "2014-07-04 20:32:45
否则它将无法识别时间,因此获得时间00:00:00(它成为第三个参数)。
brew install coreutils
),将其添加到PATH(PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
),然后使用“ 2天前”语法。
2 days ago
”有效吗?
其他答案对于编辑多个提交日期不是很方便。几年后,我又回到这个问题上来分享一种技术。
要更改最后4次提交的日期,请执行以下操作:
git rebase -i HEAD~4
如下所示编辑基准,插入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"
GIT_AUTHOR_DATE
仅更新。
exec git commit --amend --no-edit --date "now"
这是一个方便的别名,它将上次提交的提交时间和作者时间都更改为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!"
我创建了这个npm包来更改旧提交的日期。
https://github.com/bitriddler/git-change-date
用法示例:
npm install -g git-change-date
cd [your-directory]
git-change-date
系统将提示您选择要修改的提交,然后输入新日期。
如果要通过特定的哈希更改提交,请运行此 git-change-date --hash=[hash]
以下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"
}
if [[ -z "$commit" ]]
->if [[ -z "$date_timestamp" ]]
GIT_COMMITTER_DATE=
在方法末尾进行设置,以防止任何进一步的手动提交保持指定的日期。
如果要获取另一个提交的确切日期(例如,您对一个提交进行了重新设置基准并希望其具有原始重新设置基准版本的日期):
git commit --amend --date="$(git show -s --format=%ai a383243)"
这会将HEAD提交的日期更正为恰好为a383243的提交日期(如果存在歧义,则包括更多数字)。它还将弹出一个编辑器窗口,以便您可以编辑提交消息。
那是针对作者的日期,这通常是您要注意的-有关提交者日期,请参见其他答案。
如果要在标准Windows命令行中执行接受的答案(https://stackoverflow.com/a/454750/72809),则需要以下命令:
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"
笔记:
^
),但是我没有成功。非常感谢Colin Svingen的博客文章。即使他的代码对我不起作用,它也帮助我找到了正确的解决方案。
如果尚未提交,那么我可以使用类似的方法:
git commit --amend --date=" Wed Mar 25 10:05:44 2020 +0300"
之后,git bash将使用已应用的日期打开编辑器,因此您只需通过在VI编辑器命令模式下输入“:wq”来保存它,即可将其推送
--no-edit
选项。
git push -f
(强制更新)推送更改的提交。不过,这可能会有副作用。(特别是如果有很多人在本地存储库的
对于那些使用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
归功于https://mnaoumov.wordpress.com/2012/09/23/git-change-date-of-commit/
已经有很多不错的答案,但是当我想在一天或一个月内更改多次提交的日期时,找不到合适的答案。因此,我为此创建了一个新脚本并进行解释,希望它可以对某人有所帮助:
#!/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
日期将被更改:
AuthorDate: Wed Sep 13 13:39:41 2017 +0800