2

GitHub のプル リクエストをマージしました。しかし、それは間違いだったので、マージとそのコミットを元に戻し、最も重要なこととして、これらのいくつかのコミットによって導入されたすべてのファイルを履歴から削除したいと思います。

別のコミットでコミットを元に戻しましたが、機能しますが、ファイルはまだコミット履歴に残っており (サイズが大きい)、コミット自体が消えたらいいのにと思います。

ファイルを削除してフィルター分岐しようとしましたが、リポジトリのサイズを縮小しているようには見えません (コミットはまだ残っています)。

私は何をすべきか?

4

4 に答える 4

5

マージとコミットを削除します

git reset --hard <sha1>

@knittl で説明されているように。ただし、関連するぶら下がっているオブジェクトを削除するまで、リポジトリのサイズに変化は見られません。また、これらのオブジェクトへの参照を保持しないように reflog を期限切れにする必要もあります。

git reflog expire --expire-unreachable=now --all
git prune
git repack -a -d
于 2013-01-10T20:06:08.590 に答える
2

tree-filter または index-filter を使用しても機能しませんでした。ハードリセットと再梱包もそうではありませんでした。

うまくいったのは次のとおりです。

git checkout <commit>

git push --force origin HEAD:master

なぜこれらの解決策がうまくいかなかったのか、今私は興味があります。のsize-packを使ってチェックしていましたgit count-objects -v。これは正しいです?サイズの縮小はすぐに確認するべきですか、それとも原点にプッシュした後にのみ確認するべきですか?

于 2013-01-11T02:46:59.813 に答える
1

マージとそれに関連するコミットを削除するだけの場合は、次を使用しますgit reset --hard

git reset --hard <commit before merge>

これにより、現在のHEADのコミットされていない変更がすべて破棄されることに注意してください。また、マージ後に発生したすべてのコミットが削除されます(したがって、git rebaseを使用した方がよい場合があります)。

ブランチをリセットした後、ブランチを強制的にプッシュして、新しい履歴を永続化します。

免責事項:すでに公開されている履歴を書き換えることは悪い習慣です。必要がない場合は、これを行わないでください。

于 2013-01-10T19:57:27.600 に答える
1

コミットを元に戻しても、ファイルは履歴から削除されません。

ファイルが現在の HEAD に存在しないだけでなく、まったく存在しないようにしたい場合git revert、適切なコマンドではありません。filter-branchこれらのファイルを完全に削除するには、を実行する必要があります。

あなたはすでにこれを行ったと言いましたが、方法を示していません。次のことを正しく行った場合:

  • git filter-branch --tree-filterファイルを削除するには
  • git reflog expire --expire={1 second}
  • rm -rf .git/refs/original
  • git gc

...その後、リポジトリは縮小するはずです。次の理由から、最後の 3 つの手順が必要です。

  • 元のコミットは reflog から到達できます
  • 元のコミットへの参照はfilter-branchrefs/original
  • ガベージ コレクションを実行するまで、「ゆるい」オブジェクトは削除されません
于 2013-01-10T18:34:10.267 に答える