如何撤销一个git提交但保留原始的git提交历史记录(在git blame中)?

3
我要撤销一个有问题的提交,但是在撤销之后,如果我在文件上运行git blame,我会看到我的撤销被视为最近触及这些行的提交。这很合理,但不是很有用,因为我想看到原始文件的git历史记录。(即就像有问题的提交和撤销从未发生过一样)。
有没有办法做到这一点?
谢谢!

看一下 git 提供的“重写历史”功能。 - arkascha
4个回答

1
一个回滚操作与一个反向差异的新提交没有区别。因此,不,你不能让git-blame忽略原始提交或回滚(除非你愿意改变历史记录,在这种情况下,你实际上并没有回滚任何东西)。
然而,因为它就像任何其他提交一样,如果你发现最后触及某些行的提交是无用的,你可以像处理任何其他提交一样,要求git-blame注释文件的先前版本。
例如,假设你运行了以下命令:
$ git blame HEAD -- foo.c

并看到:

7507efdad27 foo.c (amalloy) ...

在您感兴趣的行上。您决定此提交不是有用的,因为它是一个还原操作。您可以使用 git show 7507efdad27 检查该提交所还原的提交。

假设这产生了 673bdae7548:然后您可以在该提交之前要求对文件进行责任视图:

$ git blame 673bdae7548^ -- foo.c

这将向您显示在撤销提交之前的责任,因此您感兴趣的行将带有最后一次触及它们的提交的注释,在被撤销的提交之前。


0

从还原的父级运行你的责备,参阅git blame文档;你甚至可以指定一个感兴趣的检查提交的显式列表,并从普通的rev-list输出中删除还原。


0

如果您不想编辑您的历史记录,也不介意多提交一次,则可以通过以下方式实现:

  1. 回到被还原更改之前的提交。
  2. 创建一个分支,并使用选项--no-ff(无快进)将您的分支合并到其中

如果您指责新分支,您现在应该可以看到被还原行的原始作者。


顺便提一下,理论上如果你将你的分支合并到主分支时不使用快进模式,这个过程应该会自动发生,从而使得这个步骤变得不必要。


我没有测试过,如果您从已合并到主分支的旧分支中恢复某个内容,所有这些内容如何工作。 我的猜测是,您需要在第2步中创建一个来自于未包含应该被撤消更改的主分支版本的分支。也许会奏效¯\(ツ)/¯。


0
如果你想要从一个分支的历史记录中“移除”一个提交,那么你需要: - git checkout 到之前的版本 - git cherry-pick 那些你想要保留的在你想要移除的版本之后的修订
比如说,如果你想要从一个分支的历史记录中移除 branch-name~3:
git cherry-pick branch-name~4 # (this is a keeper)
git cherry-pick branch-name~3..branch-name # apply revisions after branch-name~3

看,这根本就没发生过。在你的情况下,在挑选时排除还原修订版本就可以了。


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