Git:如何从git数据库中完全永久删除本地提交

时间:2016-03-25 17:18:12

标签: git

我知道git reset(包括--hard),但这并没有完全删除提交,它只是调整树。我已经探索过git gc,但这似乎永远不会永久删除提交。我知道filter-branch,但是只从提交中删除文件,但不提交自己。

围绕这个主题有很多堆栈溢出问题,但我无法找到问题的真正答案:如何真正删除本地提交(或一系列提交) ,以便它不再存在于数据库中的任何地方,好像它根本就没有完成?如果这是一个限于分支提示的方法,那就没问题了。

编辑:这是我的错误。我使用gitk并使用F5查看整个树。但是F5进行了“更新”,而Shift-F5进行了“重新加载”。除非你通过shift-F5完全重新加载,否则删除实际上并没有显示出来。

2 个答案:

答案 0 :(得分:1)

如果您的分支看起来像这样:

A   <-- HEAD
|
B
|
C   <-- to be removed
|
D

并且您要删除提交C,以下命令可能会帮助您:

git rebase -i D     # if you have D's sha1 handy
# OR
git rebase -i C^    # parent of C (which is the same as D in this simple example)

一旦发布,编辑器会弹出从D个孩子开始的所有提交,即ABC em> todo list 。只需在该编辑器窗口中删除提交C的行并保存文件。

答案 1 :(得分:1)

  1. 使用resetrebase甚至filter-branch使任何参考或标记无法访问提交。 (如何使用filter-branch到remove the file from all branches).
  2. 使reflog过期,以便无法从那里访问提交。 git reflog expire --expire=now --all
  3. git prune从数据库中删除无法访问的对象。 (git gc --prune=all也可以做到这一点,但是git gc普通保持松散的物体不到两周大。)
  4. 您可以通过手动检查git对象存储来验证它真的消失了。根据其SHA1哈希存储git对象。哈希的前两个字母是一个目录,最后的38个是该目录中的文件名。
  5. 因此,如果问题提交的SHA1哈希值为12345ABCDEF...,那么它将存在于.git/objects/12/345ABCDEF...

    要真正偏执,你可以找到你担心的特定blob(文件内容)的SHA1哈希并用git hash-object <filename>哈希,然后检查数据库中的哈希值。 / p>