在git rebase中交互式删除被选为编辑的提交

4

我正在准备发布一份代码库,需要从历史记录中完全删除某些内部信息。这些数据可能存在于各种文件中,我必须手动检查和修剪。请注意,不应该删除整个文件,只需删除特定内容。

当我执行 git rebase -i --root 时,我可以将所有可能需要修改的提交标记为 edit,并将那些需要完全删除的提交标记为 drop。(注意:要审查的提交列表不太长,是通过使用 git log --stat | grep 'commit\|name1\|name2\|...' 获得的。)在筛选类型为 (a) 的提交时,我可能会发现其中一个实际上需要完全删除。对于这种情况,我尝试了 rebase --skip,但令我惊讶的是,它仍然保留了该提交。

我如何在最初选择为 edit 的提交期间,在 git rebase 过程中删除一个提交?

示例:

$ git init
$ for COM in A B C; do touch $COM; git add  $COM; git commit -m "add $COM"; done
$ git rebase -i --root
<mark all as 'edit'>

<modify file and change commit>
$ echo A > A; git add A; git rebase --continue

<commit needs to go away>
$ git rebase --skip

<modify file and change commit>
$ echo C > C; git add C; git rebase --continue

执行此操作后,文件B仍然存在。


1
这是一个关于Torek级别的问题。我假设git已经能够提交并且正在等待您编辑修订版本。您应该要求git返回一个修订版本... 我会简单地执行 git reset --hard HEAD~1,然后修订版本就消失了... _但是_我会认为以那种方式重置也会清除rebase过程... 这是一个给torek的问题。也许可以通过 git reset --soft HEAD~1,然后清理树,然后恢复?有趣的问题。我会点赞它。 - eftshift0
1个回答

3

使用 git rebase --skip 命令的替代方案是

git reset --hard HEAD^
git rebase --continue

git reset 命令将删除提交。
git rebase --skip 不会删除已经应用的提交。


@grp 运行 git reset --hard 会清除变基过程吗? - eftshift0
@eftshift0 不,我用与 OP 相同的命令进行了测试,除了这个答案建议替换的部分。 - grg
1
@eftshift0:这是正确的,也是当您标记提交edit时,rebase在此时打印的建议是进行更改并使用git commit --amend的原因:rebase已经复制了提交,因此您需要将其推到一边,无论您是使用--amend(内部执行)还是git reset --hard HEAD^(显式命令执行)。 - torek

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