我知道git reset(包括--hard),但这并没有完全删除提交,它只是调整树。我已经探索过git gc,但这似乎永远不会永久删除提交。我知道filter-branch,但是只从提交中删除文件,但不提交自己。
围绕这个主题有很多堆栈溢出问题,但我无法找到问题的真正答案:如何真正删除本地提交(或一系列提交) ,以便它不再存在于数据库中的任何地方,好像它根本就没有完成?如果这是一个限于分支提示的方法,那就没问题了。
编辑:这是我的错误。我使用gitk并使用F5查看整个树。但是F5进行了“更新”,而Shift-F5进行了“重新加载”。除非你通过shift-F5完全重新加载,否则删除实际上并没有显示出来。答案 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
个孩子开始的所有提交,即A
,B
和C
em> todo list 。只需在该编辑器窗口中删除提交C
的行并保存文件。
答案 1 :(得分:1)
reset
,rebase
甚至filter-branch
使任何参考或标记无法访问提交。 (如何使用filter-branch到remove the file from all branches). git reflog expire --expire=now --all
git prune
从数据库中删除无法访问的对象。 (git gc --prune=all
也可以做到这一点,但是git gc
普通保持松散的物体不到两周大。)因此,如果问题提交的SHA1哈希值为12345ABCDEF...
,那么它将存在于.git/objects/12/345ABCDEF...
要真正偏执,你可以找到你担心的特定blob(文件内容)的SHA1哈希并用git hash-object <filename>
哈希,然后检查数据库中的哈希值。 / p>