我找不到从日志中删除目标提交的方法。有关删除提交的文档或者只是使用reset重置指针(不会删除任何内容,它只会重置指针),或者是rebase,它会在删除的提交时创建某种新结构。目标提交的哈希仍会出现。可能存在与[
相关的旧文档git rebase -i fork1~1 fork1~3
因为在较旧的消息中,它指出要在编辑器中删除一行,即与目标提交相对应的行。当我进入交互式编辑器时,选择之一是“ drop”,它表示删除提交。但是,就它们从日志中消失的意义而言,我还没有成功删除任何提交。我插入drop一词,它在日志输出中创建了某种类似于前叉的东西。但是我仍然可以看到我要删除的提交的哈希值。简而言之,我想确定要删除的哈希,使其不再出现在日志中。
重置为较早的提交:git reset --hard <old commit>
[当创建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
以进行编辑,接下来您可以在要删除的提交之前添加d
或drop
,例如:
d 7cfa14c commit to remove
在所有其他提交之前让pick
,然后键入esc
以退出编辑模式,然后键入:wq
以保存并退出。
现在将在本地删除提交,下次使用git push --force origin <remote_branch>
在远程分支上推送更新,请注意--force
选项,因为需要重新设置。
这是预期的行为。
Git基本上是一个简单的有向图,其中“分支”是提交的自动高级名称。重置是一种更改提交分支轨迹的方法。
同样,当执行重新设置基准时,导致一组不同更改的提交(包括它们是其祖先的提交)是不同的。这就是为什么在交互式基础库中的第一个偏差点处有一个“叉子”的原因。分支被更新为指向新的提交树的头部,而原始的提交本身实际上并未从所有提交或“ reflog”的集合中删除。
在重新设置基准之后,这些过时的(包括已删除的)提交是“孤立的”提交。仅当且仅当无法被分支或标记引用。它们仍然可以存在于磁盘上,因此仍可以通过提交哈希引用它们。
如果它们不是“孤立的”,那么有一个分支或标签需要更新;这可能是一个/远程跟踪分支。在这种情况下,请更新相关的分支/标记。对于远程跟踪分支,强制执行git push将更新远程。如果已经阻止了这些提交的分支成为“孤立的”分支,并且已经在主线上..那么,希望不是这种情况:)
要从磁盘上真正删除提交,之后可以通过prune command将其设为孤儿,该删除可以删除所有孤儿。 Git通常会定期进行GC内部管理,因此通常不需要这样做。
[在许多情况下,我使用引用日志来“恢复不良的基准”或“恢复丢失的(尚未提交的)工作”-除非绝对需要删除提交,否则通常这样做是有利的。