新しい開発者が大規模な git リポジトリに夢中になり、本当にめちゃくちゃにしてプッシュしました。彼の変更はすべて破棄できます。
私の問題: 私たちの git ホスティング サービスでは push --force が許可されていないため、最初にプルする必要があります。
そうした場合、大量のマージと競合が発生し、それらを解決しても意味がありません。現在のバージョンをプッシュできるように、他の人が行ったすべての変更を元に戻す最良の方法は何ですか?
必要なことを行う方法を見つけました。
同じ状況にある他の人のために、ここに私の解決策を投稿しています。もっと簡単な方法がある可能性が高いので、知っている場合は遠慮なく投稿してください。
まず、すべての変更をコミットして、クリーンな作業ディレクトリを作成します。変更が残っていないことを git status で確認します。
次に、新しい一時ブランチを作成して、変更を保存します。
git branch tmp
これで、自分とリモート ブランチが分岐した最後のコミットが見つかるはずです。63da978a9a4620790b75dfbae86d658a65dc3e25 のようなコミット ハッシュが必要になります。
見つかったら、マスター ブランチをそのコミットにリセットします。
git reset --hard COMMIT
次に、リモートから変更をプルします。競合は発生しません。
git pull origin master
これで、破棄する必要があるコミットを元に戻すことができます。
git revert COMMIT1
すべてを正しく行った場合は、プロセスを完了するための最後の手順が 1 つだけあります。すべての変更を含む tmp ブランチをマージします。
git merge tmp
繰り返しますが、競合は発生していないはずです。
これで、再度プッシュできる最新のブランチができました。万歳!
git push origin master
あなたが試すことができるトリックがあります。
git push origin :master
これにより、masterという名前のブランチが効果的に削除されます。良いことは、それを行うための許可は必要ないということです(そうです、私は知っています、奇妙です)。
それが終わったら、あなたはただすることができます
git push origin master:master
これにより、リポジトリにあるのとまったく同じようにマスターブランチが再作成されます。
競合/マージに対処する必要はありません。これは絶対に使用しないでください(あなたの場合を除いて、簡単な方法です)。
このトリックにより、この開発者によって行われたすべてのコミットを削除することができます(それらの痕跡はまったくありません)。
これを行うための「通常の」方法があります。
git pull
競合を避けるには、( ingによって) マージしないでくださいgit fetch
。
とにかく、push --force を使用できない場合、唯一の代替手段はgit revert