--force
オプションを使用して、プロジェクトに間違ったソースをコミットしました。
元に戻すことはできますか?以前のすべてのブランチがオプションを使用して上書きされていることを理解している-f
ため、以前のリビジョンを台無しにした可能性があります。
--force
オプションを使用して、プロジェクトに間違ったソースをコミットしました。
元に戻すことはできますか?以前のすべてのブランチがオプションを使用して上書きされていることを理解している-f
ため、以前のリビジョンを台無しにした可能性があります。
Gitは通常、何も捨てませんが、これから回復するのは難しいかもしれません。
正しいソースがある場合は、--force
オプションを使用してリモートにプッシュすることができます。指示がない限り、Gitはブランチを削除しません。実際にコミットを失った場合は、コミットを回復するためのこの便利なガイドをご覧ください。必要なコミットのSHA-1がわかっている場合は、おそらく大丈夫です。
最善の方法:すべてをバックアップして、ローカルリポジトリに残っているものを確認します。可能であれば、リモコンでも同じようにします。git fsck
物事を回復できるかどうかを確認するために使用し、何よりも実行しないでgit gc
ください。
何よりも--force
、本当に意味がない限り、このオプションは絶対に使用しないでください。
コミットハッシュがわかっている場合は、ブランチを再作成するだけで簡単です。
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
はい、後でコミットを回復できますgit push -f your_branch
Docからのテキスト:
指定された時間より古いエントリを削除します。このオプションが指定されていない場合、有効期限は構成設定gc.reflogExpireから取得され、デフォルトで90日になります。--expire=年齢に関係なくすべてのプルーンエントリ。--expire =到達可能なエントリのプルーニングをオフにすることはありません(ただし、-expire-unreachableを参照してください)。
だからあなたはすることができます:
1-git reflog
2-あなたはHead_Numberを選択しますgit reset –hard HEAD@{HEAD-NUMBER}
3-あなたはこの頭のすべてのコミットを見ることができます git cherry -v branch_name
4-最後に強制的にプッシュする必要がありますgit push -f branch_name
また
1- GITクライアント(インターフェース)からSHAの数を取得します
git reset --hard commit_SHA
2-フォースプッシュ
git push -f your_branch
お役に立てれば
強制プッシュが発生したローカルリポジトリにいない場合、オリジン/マスターレベルでは回復する方法はありません。ただし、幸運にもGitHubまたはGitHub for Enterpriseを使用できる場合は、 REST APIを調べて、失われたコミットをパッチとして取得できます。例:
https://api.github.com/repos/apache/logging-log4j2/commits/889232e28f3863d2a17392c06c1dd8cac68485de
git apply patch.patch && git commit -m "restored commit" && git push origin master
失われたコミットを回復する別の方法、または前のプッシュがローカルリポジトリからのものでない場合に失われたコミットを把握する別の方法は、CIマシンを調べることです。
すべてのコミット(または一連の連続したコミット)の後にマスターブランチをテストするジョブがある場合は、最後に何をテストしていたかを確認できます。これが、復元する必要のあるコミットです。
CIマシンは、リポジトリのローカルクローンを保持している場合もあり、そこからこのリカバリを実行できる場合があります。
出典:おそらく継続的デリバリー:ビルド、テスト、および展開の自動化による信頼性の高いソフトウェアリリース(Addison-Wesley Signature Series(Fowler))
1つのファイルのみの最後のプッシュを元に戻しながら、同じことを行いました。リポジトリの元の状態に戻ることになりました。Linuxにローカルコピーがあるので、Linusのgitコマンドを使用していました。幸いなことに、そのコピーはまだ無傷でした。
私がしたのは(必死になってローカルリポジトリのコピーをさらにいくつか作成した後):
git add .
git status
(オリジン/マスターは68コミット進んでいると言っていましたが、問題ありません...これらはすべて私が削除したコミットでした)
git remote set-url origin <GIT_SSH_URL>
git push
そして、私が力強くプッシュする前の状態にすべてが復元されました。覚えておくべき最も重要なことは、gitcheckoutを決して行わないことです。力強く押した後。ただし、ベストプラクティスは、プッシュオプションを無効にすることです。私は二度とそれを使用していません。私のレッスンを学びました!
私のように本当に悪い状況にある人のために(たとえば、bad object
実行中にエラーが発生した場合git reset --hard
):
I wrote a script called treesaver that pulls all your files from the GitHub API as a last resort. Here's how to use it:
treesaver
script and cd
to it.SHA
string of the tree you'd like to restore by accessing
https://api.github.com/repos/<your_username_or_org>/<repo>/events
.payload
property corresponding to your push event, find the commit
you'd like to revert to and click on its url
.commit.tree
, copy the tree
's url
.python3 main.py <tree_url> <path_to_save_to>
.For example, in my case, I would run:
python3 main.py https://api.github.com/repos/anthonykrivonos/my-repo/git/trees/1234567 .
Of course, PRs welcome.
ここで決定を読むことができます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