新的回购,没有远程(所以:没有推动),没有使用标签。
» echo "aaa" > aaa
» git init
» git add .
» git commit -a -m "Added aaa"
» echo "bbb" > aaa
» git commit -a -m "This commit is wrong"
f9892d8 : author : 1 second ago : (HEAD, master) : This commit is wrong
e80f2bd : author : 14 seconds ago : : Added aaa
» git reset --hard HEAD~1
e80f2bd : author : 14 seconds ago : : Added aaa
» git checkout f9892d8
Note: checking out 'f9892d8'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b new_branch_name
HEAD is now at f9892d8... This commit is wrong
所以,即使在git reset --hard
提交仍然存在之后。进行垃圾收集(git gc
)也无济于事。
我真的想永远摆脱错误的提交。好像它从未存在过。不在这个分支中,不在任何分支中,不在历史中,不在任何地方!
是否有可能告诉git“忘记这个提交,它永远不存在”?
要明确说明:我不想从当前分支中删除提交,而是从整个仓库中删除提交。没有任何痕迹必须在回购中的任何地方:不在另一个分支,而不是孤儿提交,只是无处。好像它从未存在过。
答案 0 :(得分:1)
Git总是不愿意真正从存储库中删除任何东西; git坚持说,简单地让它变得“不够好”,因为也许你以后想要取消删除它,如果它只是看不见,为什么,你可以回来!
当然,最终所有那些看不见但仍然存在的对象(提交,树,blob,甚至带注释的标记对象)都会填满你的磁盘。 (“但是磁盘空间是无限的”,git一直在告诉我!:-))所以,是的,它 可能会让这个提交真正被垃圾收集并且永远消失。
该方法嵌入在this answer中:搜索“缩小存储库的核对表”。您不需要担心refs/original/refs/heads/master
部分,因为git filter-branch
创建了for (int index = 1; shouldCreateNewFile(); ++index) {
FileOutputStream outfile = new FileOutputStream(index + ".txt");
try {
outfile.write(getNewFileContent());
}
finally {
outfile.close();
}
}
你没有在这里使用。)