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

Eth*_*sor 12 git

我需要提交不再在提交的git数据库中.我需要能够去除犯abc123...这样git checkout abc123...的回报error: pathspec 'abc123...' did not match any file(s) known to git.

质量保证如何删除'git commit'部分解决了这个问题,如如何从HEAD中删除对提交的引用,但它不包括查找提交所存在的所有分支,也不包括过期和清除一旦它被提出悬挂提交,它就会被提交.

我怎么做到这一点?

Ale*_*ysh 13

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

    git branch --contains COMMITSHA
    
    Run Code Online (Sandbox Code Playgroud)
  2. 从这些分支中删除提交:

    git checkout BRANCH
    git rebase -i COMMITSHA^
    # delete line with commit and save
    
    Run Code Online (Sandbox Code Playgroud)

    如果在任何遥控器中跟踪已更改的分支,请使用覆盖将其推送到该处:

    git push --force REMOTE BRANCH
    
    Run Code Online (Sandbox Code Playgroud)

    例如:

    git push --force origin master
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    git reflog expire --all BRANCH1 BRANCH2 # list all branches you changed
    git prune --expire now
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

    git fetch REMOTE      
    
    Run Code Online (Sandbox Code Playgroud)

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

    git checkout BRANCH
    git rebase REMOTE/BRANCH
    git reflog expire --all BRANCH
    
    Run Code Online (Sandbox Code Playgroud)

    完成后:

    git prune --expire now
    
    Run Code Online (Sandbox Code Playgroud)