誤ったgit push -f ostionマスターから回復するにはどうすればよいですか?
-
09-10-2019 - |
質問
私は自分のプロジェクトに間違ったソースを使用してコミットしました --force
オプション。
戻ることは可能ですか?私はすべての以前の枝が使用されて上書きされていることを理解しています -f
オプションなので、以前の改訂を台無しにした可能性があります。
解決
Gitは一般に何も捨てませんが、これから回復するのは難しいかもしれません。
正しいソースがある場合は、 --force
オプション。 GITは、あなたがそれに言われない限り、枝を削除しません。実際にコミットを失った場合は、 コミットを回復するためのこの有用なガイド. 。あなたが望むコミットのSHA-1を知っているなら、おそらく大丈夫です。
最善のこと:すべてをバックアップして、まだローカルリポジトリにあるものを確認してください。可能であれば、リモコンで同じことをします。使用する git fsck
物事を回復できるかどうかを確認するために 走るな git gc
.
何よりも、使用しないでください --force
あなたが本当にそれを意味しない限りオプション。
他のヒント
Commit Hashを知っている場合は、簡単です。ブランチを再現してください。
5794458...b459f069 master -> master (forced update)
リモートブランチを削除します。
git push origin :master
次に、次のコマンドでブランチを再作成します。
git checkout 5794458
git branch master
git push origin master
解決策はすでに言及されています ここ
# work on local master
git checkout master
# reset to the previous state of origin/master, as recorded by reflog
git reset --hard origin/master@{1}
# at this point verify that this is indeed the desired commit.
# (if necessary, use git reflog to find the right one, and
# git reset --hard to that one)
# finally, push the master branch (and only the master branch) to the server
git push -f origin master
あなたが強制的なプッシュが来たその地元のレポにいない場合、Origin/Masterレベルでは回復する方法はありません。しかし、もしそうなら ラッキー 使用するのに十分です github また エンタープライズのためのgithub, 、あなたは次を見ることができます 残り APIおよび失われたコミットをパッチとして取得します、例:
- イベントを一覧表示し、sha1 long形式をコミットします
- 失われたコミットをダウンロードして、JSONパスの関連パッチを取得します。Files[]/PACT
https://api.github.com/repos/apache/logging-log4j2/commits/889232e28f3863d2a17392c06c1d8cac68485de
- ローカルに適用して、もう一度プッシュします
git適用patch.patch && git commit -m "復元されたコミット" && gitプッシュオリジンマスター
1つのファイルのみを最後にプッシュしながら同じことをしました。リポジトリの元の状態に戻ることになりました。 Linuxのローカルコピーを持っていたので、LinusのGitコマンドを使用していました。幸いなことに、そのコピーはまだ無傷でした。
私がしたのは(ローカルリポジトリのコピーをもう少し作成した後)でした。
git add .
git status
(オリジン/マスターは68のコミットによって先を行っていたと言いました、罰金...それらはすべて私が削除したコミットでした)
git remote set-url origin <GIT_SSH_URL>
git push
そして、私が強制的にプッシュする前のようにすべてが回復しました。覚えておくべき最も重要なことは、Gitチェックアウトを行うことは決してないことです。あなたが力強く押した後。しかし、ベストプラクティスはプッシュオプションを無効にすることです。二度と使用していません。私のレッスンを学びました!
失われたコミットを回復したり、何が失われたかを把握する別の方法は、以前のプッシュがあなたのローカルリポジトリからではなかった場合、CIマシンを見ることです。
すべてのコミット(または連続したコミットシリーズ)の後にマスターブランチをテストするジョブがある場合は、最後にテストしていたものを見ることができます。それがあなたが復元するために必要なコミットです。
CIマシンは、このリカバリを実行できるリポジトリのローカルクローンを保持することもできます。
出典:おそらく 継続的な配信:ビルド、テスト、展開自動化を通じて信頼できるソフトウェアリリース(Addison-Wesley Signature Series(Fowler))
ここでは、決定を読むことができます https://evilmartians.com/chronicles/git-push--force-and-how-to-deal-with-it
2番目は私を助けてくれました。私はこれらのコマンドを間違えました
1) (some-branch) git pull -> correct command was git pull origin some-branch
2) (some-branch) git push -f origin some-branch
これらのコマンドの後、私は3つのコミットを失いました。それらを回復するために、私はターミナルを見て、誤って「git pull」をし、そのような出力を見ました
60223BF ... 0B258EB Some-Branch-> Origin/Some-Branch
2番目のハッシュ0B258EBはまさに私が必要としていたものでした。それで、私はこのハッシュとプロデュースコマンドを取りました
git push --force origin 0b258eb:some-branch