完全从git数据库中删除提交

时间:2012-06-30 03:53:28

标签: git

我需要提交不再在提交的git数据库中。我需要能够移除提交abc123...,以便git checkout abc123...返回error: pathspec 'abc123...' did not match any file(s) known to git.

QA How to delete a 'git commit'部分解决了这个问题,如如何从HEAD中删除对提交的引用,但它不包括查找提交所存在的所有分支,也不包括到期和清除一旦它被提出悬挂,它就会被提交。

我将如何实现这一目标?

2 个答案:

答案 0 :(得分:13)

  1. 列出包含提交的所有分支:

    git branch --contains COMMITSHA
    
  2. 从这些分支中删除提交:

    git checkout BRANCH
    git rebase -i COMMITSHA^
    # delete line with commit and save
    

    如果在任何遥控器中跟踪更改的分支,请使用覆盖:

    将其推送到那里
    git push --force REMOTE BRANCH
    

    e.g:

    git push --force origin master
    

    (请注意,根据您的开发过程,提交可能也会出现在未跟踪的远程分支中。)

  3. 清除提交,因此无法从您的本地仓库恢复:

    git reflog expire --all BRANCH1 BRANCH2 # list all branches you changed
    git prune --expire now
    

    请注意,您还必须在具有此提交的所有远程存储库上运行此命令。如果您无法访问远程仓库,则必须指责 - 提交最终将自动失效,并将被git gc清除。

    警告上述命令将从Git repo中移除所有悬空对象以及分支更改的所有历史记录 - 因此您将无法恢复(通过非取证方式)之前丢失的任何内容它的运行。

  4. 告诉所有协作者获取更改的分支并根据它们更新他们可能拥有的任何工作。他们应该做如下:

    git fetch REMOTE      
    

    对于基于您在上面更改的分支的每个分支(如果它们在本地具有分支,则包括分支本身):

    git checkout BRANCH
    git rebase REMOTE/BRANCH
    git reflog expire --all BRANCH
    

    完成后:

    git prune --expire now
    

答案 1 :(得分:2)

  1. 确保没有引用需要提交(重置回到它之前,或者将其重新绑定)
  2. .git/objects删除对象(它将位于以哈希的前两个字符命名的文件夹中,文件名将是哈希的其余部分)。
  3. 但请注意,如果您将此提交推送到公共存储库,则在本地删除它不会将其从远程数据库中删除。