实际上删除git提交,使其从日志中消失

问题描述 投票:0回答:3

我找不到从日志中删除目标提交的方法。有关删除提交的文档或者只是使用reset重置指针(不会删除任何内容,它只会重置指针),或者是rebase,它会在删除的提交时创建某种新结构。目标提交的哈希仍会出现。可能存在与[

相关的旧文档
git rebase -i fork1~1 fork1~3

因为在较旧的消息中,它指出要在编辑器中删除一行,即与目标提交相对应的行。当我进入交互式编辑器时,选择之一是“ drop”,它表示删除提交。但是,就它们从日志中消失的意义而言,我还没有成功删除任何提交。我插入drop一词,它在日志输出中创建了某种类似于前叉的东西。但是我仍然可以看到我要删除的提交的哈希值。简而言之,我想确定要删除的哈希,使其不再出现在日志中。

git git-rebase git-reset
3个回答
0
投票

重置为较早的提交:git reset --hard <old commit>


0
投票

[当创建git rebase -i HEAD~X时,其中X是要重新设置的提交数,您可以在交互模式下重新设置。您将看到(例如)以下选项:

pick 0a3e7b9 other commit
pick 7cfa14c commit to remove

# Rebase 04ec4b7..7cfa14c onto 04ec4b7 (2 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
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

键入i以进行编辑,接下来您可以在要删除的提交之前添加ddrop,例如:

d 7cfa14c commit to remove 

在所有其他提交之前让pick,然后键入esc以退出编辑模式,然后键入:wq以保存并退出。

现在将在本地删除提交,下次使用git push --force origin <remote_branch>在远程分支上推送更新,请注意--force选项,因为需要重新设置。


0
投票

这是预期的行为。

Git基本上是一个简单的有向图,其中“分支”是提交的自动高级名称。重置是一种更改提交分支轨迹的方法。

同样,当执行重新设置基准时,导致一组不同更改的提交(包括它们是其祖先的提交)是不同的。这就是为什么在交互式基础库中的第一个偏差点处有一个“叉子”的原因。分支被更新为指向新的提交树的头部,而原始的提交本身实际上并未从所有提交或“ reflog”的集合中删除。

在重新设置基准之后,这些过时的(包括已删除的)提交是“孤立的”提交。仅当且仅当无法被分支或标记引用。它们仍然可以存在于磁盘上,因此仍可以通过提交哈希引用它们。

如果它们不是“孤立的”,那么有一个分支或标签需要更新;这可能是一个/远程跟踪分支。在这种情况下,请更新相关的分支/标记。对于远程跟踪分支,强制执行git push将更新远程。如果已经阻止了这些提交的分支成为“孤立的”分支,并且已经在主线上..那么,希望不是这种情况:)

要从磁盘上真正删除提交,之后可以通过prune command将其设为孤儿,该删除可以删除所有孤儿。 Git通常会定期进行GC内部管理,因此通常不需要这样做。

[在许多情况下,我使用引用日志来“恢复不良的基准”或“恢复丢失的(尚未提交的)工作”-除非绝对需要删除提交,否则通常这样做是有利的。

© www.soinside.com 2019 - 2024. All rights reserved.