实际上,删除git提交的方式会使它从日志中消失

实际上,删除git提交的方式会使它从日志中消失,git,git-rebase,git-reset,Git,Git Rebase,Git Reset,我找不到从日志中删除目标提交的方法。关于删除提交的文档要么只是使用reset重置指针(它不删除任何内容,它只是重置指针),要么是rebase,它在删除的提交处创建某种新结构。目标提交的哈希仍会出现。可能存在与以下内容相关的旧文档: git rebase -i fork1~1 fork1~3 因为在旧消息中,它声明要删除编辑器中的一行,即与目标提交相对应的行。当我进入交互式编辑器时,其中一个选项是“drop”,它表示删除提交。但是,我没有成功地删除任何提交,因为它们从日志中消失了。我插入单词dr

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

git rebase -i fork1~1 fork1~3
因为在旧消息中,它声明要删除编辑器中的一行,即与目标提交相对应的行。当我进入交互式编辑器时,其中一个选项是“drop”,它表示删除提交。但是,我没有成功地删除任何提交,因为它们从日志中消失了。我插入单词drop,它在日志输出中创建了某种类似fork的东西。但是我仍然可以看到我试图删除的提交的散列。简单地说,我想标识一个要删除的哈希,并使它不再出现在日志中

因此,这里的想法是删除1bc7112:

*   4518859 (refs/stash) WIP on fork3: 8c438a9 Added first.bsh back in
|\
| * 1bc7112 index on fork3: 8c438a9 Added first.bsh back in
|/
* 8c438a9 Added first.bsh back in
* eef828f (HEAD -> fork4) Removed using git rm
* c21cda0 Third change.
重置为旧提交:
git reset--hard

在进行
git重设基-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 
在所有其他提交之前选择
,然后键入
esc
以退出编辑模式,键入
:wq
以保存并退出


现在将在本地删除提交,下一次使用git push--force origin对远程分支进行推送更新时,请注意,
--force
选项是必需的,因为这是预期的行为

Git基本上是一个简单的有向图,其中分支是要提交的自动高级名称(aka refs),因此是一些图子树中的头节点。重置是更改提交分支名称的方法之一

同样,在执行重新基时,导致不同哈希计算的更改会导致不同的提交,这就是为什么删除提交会影响所有子代。然后更新分支以指向新提交树的头部,而原始提交本身实际上并没有从所有提交集中删除,仍然可以通过找到

重置或重新设置这些过时(包括已删除)的基础后,+。提交仍然可以被提交哈希引用,因为它们仍然存在于磁盘上;但是,如果这些提交没有直接引用,并且它们不是任何引用的祖先,则不希望它们显示在log命令中

+包括~branchs~、~tags~和~stash entries~。

如果提交不是“孤立的”,因此在正常日志中可见,则需要更新分支或标记。这还包括远程跟踪分支和隐藏条目。根据相关情况更新和/或删除这些参考。如果阻止这些提交成为“孤立”的分支已经被推送到主线上。。好吧,希望不是这样


从磁盘删除提交后,可以通过删除所有孤立项的完成孤立项。Git通常会定期执行GC内务管理,因此通常不需要这样做


如果已推送提交,则必须将此过程传播到现在有更改的每个存储库。如果这涉及强制推送主线分支,则可能会对其他开发人员“非常恼人”和/或不可行,具体取决于其他提交的数量。只有在提交(以及其中的任何数据)已经泄漏并且可能依赖于其他远程提交时,才应作为最后手段进行此操作。

现在您已经发布了日志(以图形形式),原因很清楚:您要删除的提交根本不是历史记录的一部分。它被藏起来了。删除它的方法是删除隐藏本身

这张图表揭示了这个藏匿处到底是一只多么奇怪的鸭子。它实际上是一个合并提交;创建隐藏时,它的第一个父级是头(因为工作树存在于该头上),它的第二个父级是此时的整个索引,第二个父级的父级是头。文档将其绘制为:

       .----W
      /    /
-----H----I
点是隐藏点,H是头部,I是记录的索引,W是记录的工作树

因此,只要藏匿物存在,H commit(你藏匿时的头部)就不会消失


与此同时,你抱怨的承诺甚至不是真正的承诺!这是你藏起来时索引的冻结快照。它是隐藏的一部分。

看起来像叉子的东西听起来是对的,因为
rebase--interactive
重写了历史,所以每次提交之后,您更改的内容都会得到一个新的散列。查看本文了解有关.iotions是什么的更多详细信息:您在Git存储库中看到的提交取决于您在运行查看该存储库中提交的命令时所做的选择。您使用什么命令查看提交?hist=log--all--graph--decoration--onelineI在本文档中显示历史记录。我不能迟于头部移除任何东西。[link]例如,我已将头设置为最新提交,然后执行rebase-I。我尝试放弃提交1bc7。它不会消失。我把它放在一个分支上,仍然没有关于细节的幸运-你想要的是
git stash drop
stash,即提交
4518859
1bc7112
。这也将删除提交的唯一引用
8c438a9
,这样您将只在后面看到提交
eef828f
c21cda0
。请给出此链接的结构,我不能删除除HEAD之外的任何内容。[链接](该链接不是公开的。在问题正文中可能会更好