18

コミットのgitデータベースに存在しないようにコミットする必要があります。リターンするabc123...ようにコミットを削除できる必要がありますgit checkout abc123...error: pathspec 'abc123...' did not match any file(s) known to git.

GitのブランチからのQADeleteコミットは、HEADからコミットへの参照を削除する方法のように、これに部分的に答えますが、コミットが存在するすべてのブランチを見つけることも、期限切れとパージをカバーしていません。ぶら下がっているコミットが行われたら、コミットします。

どうすればこれを達成できますか?

4

2 に答える 2

16
  1. コミットを含むすべてのブランチを一覧表示します。

    git branch --contains COMMITSHA
    
  2. これらのブランチからコミットを削除します:

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

    変更されたブランチがリモートで追跡されている場合は、オーバーライドしてそこにプッシュします。

    git push --force REMOTE BRANCH
    

    例えば:

    git push --force origin master
    

    (開発プロセスによっては、コミットが追跡されていないリモート ブランチにも表示される場合があることに注意してください。)

  3. コミットをパージして、ローカル リポジトリから復元できないようにします。

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

    このコミットがあったすべてのリモート リポジトリでも、このコマンドを実行する必要があることに注意してください。リモート リポジトリにアクセスできない場合は、指を交差させる必要があります — コミットは最終的にはそれ自体で期限切れになり、によってパージされgit gcます。

    上記のコマンドは、Git リポジトリからぶら下がっているすべてのオブジェクトとブランチ変更のすべての履歴を削除することに注意してくださいそのため、実行前に失われたものを (法医学的でない方法で) 復元することはできません。

  4. すべての共同作業者に、変更されたブランチをフェッチし、それらに基づいた作業を更新するように伝えます。彼らは次のようにすべきです:

    git fetch REMOTE      
    

    上記で変更したブランチに基づく各ブランチ (ローカルにある場合はブランチ自体を含む) について:

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

    完了したら:

    git prune --expire now
    
于 2012-06-30T06:51:56.640 に答える
2
  1. そのコミットを必要とする参照がないことを確認してください(その前にリセットするか、リベースしてください)
  2. からオブジェクトを削除します.git/objects(ハッシュの最初の 2 文字にちなんで名付けられたフォルダーにあり、ファイル名はハッシュの残りの部分になります)。

ただし、このコミットをパブリック リポジトリにプッシュした場合、ローカルで削除してもリモートからは削除されないことに注意してください。

于 2012-06-30T03:59:17.220 に答える