从HEAD开始Git筛选分支

3

我最近在一个公共仓库中fork了、提交了代码并发起了一个pull request,但我不是这个仓库的协作者。我的pull request还没有被合并。

检查我的提交记录后,我发现我使用了错误的作者名称,我想要修复它。我尝试进行rebase操作,效果很好:

git rebase -i HEAD~7

接着,我编辑了所有相关提交,并且根据这篇回答,成功地更改了提交的作者。

git commit --amend --author "James <email@example.com>" --no-edit && \
git rebase --continue

到目前为止,一切都很好,但我注意到这会将提交时间更改为当前时间。我想保留以前的时间戳。我尝试遵循这个答案,但是filter-branch似乎已经更改了整个存储库的哈希值。
我可能不应该强制推送这个更改。即使我这样做了,我的拉取请求也可能无法合并。因此,我尝试寻找一种在分支上运行filter-branch的方法,但我找不到任何东西。我尝试过:
git filter-branch --env-filter 'GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE; export GIT_COMMITTER_DATE' HEAD~7

但这并不起作用。它以错误信息退出:

您想重写哪个引用?

我应该尝试做什么?这可行吗?

我应该查看rebase的--committer-date-is-author-date标志吗?那是什么意思?

2个回答

2

只需传递您想要的修订范围给git filter-branch,就像这样:

git filter-branch --env-filter 'GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE; export GIT_COMMITTER_DATE' HEAD~7..HEAD

1
我不会担心这个问题。请注意,尽管提交日期更改了,但作者日期仍然保持不变。
如果你想一下,这是有道理的,考虑到Git的语义:每当提交SHA更改时,它都是一个新的提交,提交日期也应该更改。
然而,以下应该可以工作:

$ git rebase --committer-date-is-author-date --onto origin/master master my-feature-branch

上述命令将获取my-feature-branch中所有不在master分支上的提交,并将它们重新基于origin/master。由于提供了--committer-date-is-author-date,作者日期将被复制到提交日期,但仅当您不使用-i--interactive时才会这样做。
即使您重写了本地历史记录,这个命令仍应该能够正常工作,尽管我没有尝试过。

关于rebase命令:

这是一般形式:

$ git rebase --onto NEW_BASE OLD_BASE SOME_BRANCH

如果SOME_BRANCH是从OLD_BASE分支出来的,这将获取OLD_BASESOME_BRANCH之间的所有提交,并将它们应用于NEW_BASE而不是OLD_BASE
以下是基于您提供的少量引用的更具体命令:
$ git rebase --committer-date-is-author-date --onto origin/master HEAD~7 my-feature-branch

根据文档,--committer-date-is-author-date 可以实现你想要的功能。但是,它与 git rebase--interactive 选项不兼容。你尝试过不指定 --interactive 吗? - jpaugh
如果你知道如何交互式地变基,那么你也知道如何非交互式地变基。只需省略 -i 开关即可。如果你担心分支被破坏,可以始终使用新分支,或者在变基后执行 git reset my-feature-branch@{1} 撤消变基。 - jpaugh
注意:我已更新代码示例,并创建了另一个。通常情况下,您不必显式指定所有三个引用进行变基,但如果您这样做,可以确保它仅获取您想要的提交。 - jpaugh
非常感谢您提供额外的示例!一个快速的问题:我开始rebase后会发生什么?我想在每个提交上调用commit --amend。现在我收到消息:First, rewinding head to replay your work on top of it 再次感谢您的帮助! - James Taylor
如果你真的想保留提交日期并进行交互式变基(例如编辑每个提交),那么你需要进行两次变基。首先按照通常的方式进行一次变基(使用-i选项),然后再按照上面所示的方法进行一次变基。 - jpaugh
显示剩余3条评论

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