3

私は次のような状態のブランチに取り組んでいました

        A'--B'--C'--D'
       /
A--B--C--D

いくつかの非常に悪いことが起こり、リモートリポジトリが次のようになるようにローカルとリモートの両方でB'に戻る必要があります

         A'--B'
        /
 A--B--C--D

ローカルリポジトリについては

git reset --hard <sha>

しかし、どうすればリモートリポジトリに対してそれを行うことができますか?

私は次のようなことができるはずです

git push origin mybranch --reset

しかし、それはマニュアルページにはありません

以前のものをキャンセルするコミットを作成しようとしましたが

gitadd。

変更がないことを報告します(前回のプッシュの直後なので予想されます)

では、どうすればリモートリポジトリをリセットできますか?

4

2 に答える 2

4

追跡されたリモートブランチを自分のものでオーバーライドするには、を実行しますgit push origin --force mybranch。(または、-fの代わりに使用する--forceか、ブランチ名の前に:を付け+ますgit push origin +mybranch。)

ブランチを変更した可能性のある共同作業者には、ブランチがリモートで変更されたことを警告する必要があることに注意してください。そうすれば、ブランチが上書きされなくなります。なぜならgit push、それらのコピーでは、リモートブランチに対して早送りが行われるためです。ただし、少なくとも1つの新しいコミットを作成しgit pull、ローカルバージョンのブランチを更新しない場合を除きます。共同編集者は次のことを行う必要があります。

git fetch origin
git checkout mybranch
git rebase origin/mybranch

完全を期すために更新:@CodeGnomeが示唆しているように、コミットを存在から完全に削除するには、コミットgit prune --expire nowを含むすべてのGitリポジトリで実行します。ただし、このコマンドはGitからすべてのぶら下がっているオブジェクトを削除し、実行する前に「失った」データの回復を妨げることに注意してください。通常は問題ありませんが、とにかく警告する必要があります。

更新:このページが示唆しているように、git prune --expire nowreflogsからコミットをクリーンアップしません。解決策については、リンクを参照してください。より侵襲性の低いソリューションについては、を試してくださいgit reflog expire --all mybranch。を実行する前にこれを行う必要がありますgit prune

変更を削除する「元に戻す」コミットを明示的に生成する方が望ましい場合があります(古いバージョンとその削除の事実が履歴に表示されます)。そのためのgit revertコマンドがあります。

于 2012-06-29T04:23:45.407 に答える
3

履歴からコミットを削除する

本当に必要なのは、B'ブランチにいて、git push --forceそのブランチの現在のコミットポインタを上書きすることだけです。リモコンをトラッキングブランチとして設定していない場合は、git push --force origin <branchname>代わりに設定する必要があります。

C'とD'は、最終的にプルーニングされるまでreflogに残り、リポジトリ内のオブジェクトとして残りますが、配管を掘り下げ始めない限り、ログ履歴の一部として表示されるべきではありません。

リポジトリからぶら下がっているオブジェクトを削除する

C'とD'をリポジトリから完全に削除したい場合はgit prune --expire now、両方のリポジトリを呼び出すことができます。これにより、ぶら下がっているオブジェクトが完全に削除されます。

于 2012-06-29T04:26:17.203 に答える