Git 按特定日期签出不起作用(忽略指定日期并显示整个提交历史记录)
Git checkout by specific date doesn't work (ignores specified date and presents the whole commit history)
我看过很知名的linkHow to checkout in Git by date?
命令 git rev-list
对我不起作用 - 我总是得到提交的整个历史记录,我的情况似乎忽略了指定的日期时间值。
步骤:
我在我的分支mynewbranch1
git log
呈现这些提交:
**commit 1250c4c2 (HEAD -> mynewbranch1)**
Author: john <>
Date: Tue May 10 11:27:45 2022 +0200
text1`
**commit ae99ff**
Author: john
Date: Mon May 9 17:22:37 2022 +0200
text2`
**commit 84e85**
Author: alex <>
Date: Mon May 9 16:13:47 2022 +0200
text3`
**commit 41b35**
Author: alex <>
Date: Mon May 8 16:11:31 2022 +0200
text4`
现在我执行以下命令:
git checkout $(git rev-list -n 1 --first-parent --before="2022-05-09 16:13:47" mynewbranch1)
我也试过反引号:
git checkout `git rev-list -n 1 --first-parent --before="2022-05-09 16:13:47" mynewbranch1`
现在我想从中创建一个新分支:
git checkout -b some_branch_from_above_date
但是当我在我的新分支上执行 git log
时 some_branch_from_above_date
我可以再次看到所有提交!我希望只有上面列表中的第 3 次和第 4 次提交,因为只有那些在指定日期之前:2022-05-09 16:13:47
我必须通过脚本执行此操作,所以我需要按日期结帐!
为了测试目的,我什至尝试使用字符串语法 -900 天前 但我仍然得到最近的提交!请帮忙!
git checkout -b mynewbranch2 `git rev-list -n 1 --before="900 days ago" mynewbranch1`
更新感谢@LeGEC
此问题的原因是因为 rev-list
过滤器仅基于 CommitDate。虽然我的 AuthorDate 不同,因为我在 git commit
命令中使用 --date
选项明确设置了 dat。这可以通过 git log --format=fuller
命令看到。
AuthorDate: Thu May 9 16:13:47 2022 +0200
CommitDate: Wed May 11 13:48:07 2022 +0200
有一个已知的陷阱,其提交日期为:
一个提交实际上有 两个 日期:作者日期和提交者日期。
- 当创建一个全新的提交时,它会将其作者日期和提交者日期设置为
now()
、
- 对于
git commit --amend
、git cherry-pick
或 git rebase
等命令,git 使用新的 committer/committer 日期创建新提交,但保留 author/author “复制”提交的日期。
不幸的是:git log
默认显示的日期是作者日期,但--before/--after
过滤器中使用的日期是提交者日期...
AFAIK,目前只有 git 之外的方法可以按作者日期过滤:例如,请参见这两个答案:
明确查看两个日期的快速方法是使用 git log --format=fuller
.
或者使用 %ad
和 %cd
编写自定义格式字符串:
git log --graph --format="%h author=%an %ad (committer=%cn %cd) %s"
您在评论中指定您是 re-creating 来自外部来源的提交。
在创建提交时,您还可以使用环境变量覆盖提交者:
GIT_AUTHOR_NAME=alex \
GIT_AUTHOR_EMAIL=alex@somewhere \
GIT_AUTHOR_DATE="2022-05-09 13:47:00" \
GIT_COMMITTER_NAME=alex \
GIT_COMMITTER_EMAIL=alex@somewhere \
GIT_COMMITTER_DATE="2022-05-09 13:47:00" \
git commit -m "..."
https://git-scm.com/docs/git-commit#_commit_information
如果您已经迁移了部分历史记录,则可以重写现有提交,例如使用 git rebase -x ...
或 git-filter-repo
(link to docs: check the CALLBACKS section)。
另外:我强烈建议您在 git 提交消息中添加一些内容(您以前的系统似乎有一些“事务 ID”?),以便更精确地匹配已迁移的提交。
我看过很知名的linkHow to checkout in Git by date?
命令 git rev-list
对我不起作用 - 我总是得到提交的整个历史记录,我的情况似乎忽略了指定的日期时间值。
步骤:
我在我的分支mynewbranch1
git log
呈现这些提交:
**commit 1250c4c2 (HEAD -> mynewbranch1)**
Author: john <>
Date: Tue May 10 11:27:45 2022 +0200
text1`
**commit ae99ff**
Author: john
Date: Mon May 9 17:22:37 2022 +0200
text2`
**commit 84e85**
Author: alex <>
Date: Mon May 9 16:13:47 2022 +0200
text3`
**commit 41b35**
Author: alex <>
Date: Mon May 8 16:11:31 2022 +0200
text4`
现在我执行以下命令:
git checkout $(git rev-list -n 1 --first-parent --before="2022-05-09 16:13:47" mynewbranch1)
我也试过反引号:
git checkout `git rev-list -n 1 --first-parent --before="2022-05-09 16:13:47" mynewbranch1`
现在我想从中创建一个新分支:
git checkout -b some_branch_from_above_date
但是当我在我的新分支上执行 git log
时 some_branch_from_above_date
我可以再次看到所有提交!我希望只有上面列表中的第 3 次和第 4 次提交,因为只有那些在指定日期之前:2022-05-09 16:13:47
我必须通过脚本执行此操作,所以我需要按日期结帐! 为了测试目的,我什至尝试使用字符串语法 -900 天前 但我仍然得到最近的提交!请帮忙!
git checkout -b mynewbranch2 `git rev-list -n 1 --before="900 days ago" mynewbranch1`
更新感谢@LeGEC
此问题的原因是因为 rev-list
过滤器仅基于 CommitDate。虽然我的 AuthorDate 不同,因为我在 git commit
命令中使用 --date
选项明确设置了 dat。这可以通过 git log --format=fuller
命令看到。
AuthorDate: Thu May 9 16:13:47 2022 +0200
CommitDate: Wed May 11 13:48:07 2022 +0200
有一个已知的陷阱,其提交日期为:
一个提交实际上有 两个 日期:作者日期和提交者日期。
- 当创建一个全新的提交时,它会将其作者日期和提交者日期设置为
now()
、 - 对于
git commit --amend
、git cherry-pick
或git rebase
等命令,git 使用新的 committer/committer 日期创建新提交,但保留 author/author “复制”提交的日期。
不幸的是:git log
默认显示的日期是作者日期,但--before/--after
过滤器中使用的日期是提交者日期...
AFAIK,目前只有 git 之外的方法可以按作者日期过滤:例如,请参见这两个答案:
明确查看两个日期的快速方法是使用 git log --format=fuller
.
或者使用 %ad
和 %cd
编写自定义格式字符串:
git log --graph --format="%h author=%an %ad (committer=%cn %cd) %s"
您在评论中指定您是 re-creating 来自外部来源的提交。
在创建提交时,您还可以使用环境变量覆盖提交者:
GIT_AUTHOR_NAME=alex \
GIT_AUTHOR_EMAIL=alex@somewhere \
GIT_AUTHOR_DATE="2022-05-09 13:47:00" \
GIT_COMMITTER_NAME=alex \
GIT_COMMITTER_EMAIL=alex@somewhere \
GIT_COMMITTER_DATE="2022-05-09 13:47:00" \
git commit -m "..."
https://git-scm.com/docs/git-commit#_commit_information
如果您已经迁移了部分历史记录,则可以重写现有提交,例如使用 git rebase -x ...
或 git-filter-repo
(link to docs: check the CALLBACKS section)。
另外:我强烈建议您在 git 提交消息中添加一些内容(您以前的系统似乎有一些“事务 ID”?),以便更精确地匹配已迁移的提交。