--force
オプションを使用してプロジェクトに間違ったソースをコミットしました。
元に戻すことはできますか?以前のすべてのブランチが-f
オプションを使用して上書きされていることを理解しているため、以前のリビジョンを台無しにした可能性があります。
--force
オプションを使用してプロジェクトに間違ったソースをコミットしました。
元に戻すことはできますか?以前のすべてのブランチが-f
オプションを使用して上書きされていることを理解しているため、以前のリビジョンを台無しにした可能性があります。
回答:
通常、Gitは何も破棄しませんが、これからの回復には依然として注意が必要です。
正しいソースがあれば、--force
オプションでそれをリモートにプッシュすることができます。指示がない限り、Gitはブランチを削除していません。実際にコミットを失った場合は、この便利なガイドを参照してコミットを回復してください。必要なコミットのSHA-1がわかっている場合は、おそらく大丈夫です。
最善の策:すべてをバックアップし、ローカルリポジトリに残っているものを確認します。可能であれば、リモートでも同じ操作を行います。git fsck
物事を回復できるかどうかを確認するために使用し、何よりも実行しないでくださいgit gc
。
何よりも、--force
本当に意味がない限り、このオプションを使用しないでください。
git reflog show remotes/origin/master
。そこにプッシュが表示されるはずです。前の行のコミットは、失敗する前の場所です。次に、そのリビジョンを(を使用して--force
)オリジンにプッシュし、元の場所に戻ることができます!
git fetch
長い間編集していない)でも、GitHub側のreflogを表示して回復できます!
コミットハッシュがわかっている場合は簡単です。ブランチを再作成するだけです。
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 reflog show remotes/origin/master
git reflogが必要な場合(上記の@Cascabelで言及されたとおり)
強制プッシュが発生したローカルリポジトリにいない場合、オリジン/マスターレベルでは回復する方法はありません。しかし、幸運にも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))
はい、コミットを回復できます git push -f your_branch
Docからのテキスト:
指定された時間より古いエントリを整理します。このオプションが指定されていない場合、有効期限は構成設定gc.reflogExpireから取得され、デフォルトでは90日になります。--expire = allは、年齢に関係なくエントリをプルーニングします。--expire = neverは到達可能なエントリのプルーニングをオフにします(ただし--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
お役に立てれば
1つのファイルのみの最後のプッシュを取り消すときに、同じことを行いました。リポジトリの元の状態に戻ることになってしまいました。Linuxにローカルコピーがあるため、Linusからのgitコマンドを使用していました。幸いなことに、そのコピーはまだ無傷でした。
私がしたのは(ローカルリポジトリのコピーを必死にいくつか作成した後)だけです。
git add .
git status
(それはorigin / masterが68コミット進んでいると言った、結構...それらは私が削除したすべてのコミットでした)
git remote set-url origin <GIT_SSH_URL>
git push
そして、すべてが私が強制的なプッシュをする前の状態に復元されました。覚えておくべき最も重要なことは、決してgitチェックアウトを行わないことです。あなたが強制的に押した後。ただし、ベストプラクティスはプッシュオプションを無効にすることです。二度と使用しません。私のレッスンを学びました!
ここで決定を読むことができますhttps://evilmartians.com/chronicles/git-push---force-and-how-to-deal-with-it
二つ目は私を助けました。これらのコマンドを間違えました
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
私のように本当に悪い状況にいる人(たとえば、bad object
実行中にエラーが発生した場合git reset --hard
)は、次のようになります。
私が書いたtreesaverというスクリプト最後の手段としてのGitHub APIからすべてのファイルを取得します。使用方法は次のとおりです。
treesaver
スクリプトのクローンを作成cd
します。SHA
アクセスして、復元するツリーの文字列を見つけます
https://api.github.com/repos/<your_username_or_org>/<repo>/events
。payload
、あなたのプッシュイベントに対応するプロパティ、見つけるcommit
あなたがに戻すと、その上でクリックしたいと思いますurl
。commit.tree
、コピーtree
のをurl
。python3 main.py <tree_url> <path_to_save_to>
。たとえば、私の場合、次のように実行します。
python3 main.py https://api.github.com/repos/anthonykrivonos/my-repo/git/trees/1234567 .
もちろん、PRは歓迎します。