112

--forceオプションを使用して、プロジェクトに間違ったソースをコミットしました。

元に戻すことはできますか?以前のすべてのブランチがオプションを使用して上書きされていることを理解している-fため、以前のリビジョンを台無しにした可能性があります。

4

9 に答える 9

63

Gitは通常、何も捨てませんが、これから回復するのは難しいかもしれません。

正しいソースがある場合は、--forceオプションを使用してリモートにプッシュすることができます。指示がない限り、Gitはブランチを削除しません。実際にコミットを失った場合は、コミットを回復するためのこの便利なガイドをご覧ください。必要なコミットのSHA-1がわかっている場合は、おそらく大丈夫です。

最善の方法:すべてをバックアップして、ローカルリポジトリに残っているものを確認します。可能であれば、リモコンでも同じようにします。git fsck物事を回復できるかどうかを確認するために使用し、何よりも実行しないでgit gcください。

何よりも--force、本当に意味がない限り、このオプションは絶対に使用しないでください。

于 2010-10-20T01:11:45.630 に答える
56

コミットハッシュがわかっている場合は、ブランチを再作成するだけで簡単です。

5794458...b459f069 master -> master (forced update)

リモートブランチを削除します。

git push origin :master

次に、次のコマンドを使用してブランチを再作成します。

git checkout 5794458
git branch master
git push origin master
于 2014-06-23T19:00:42.407 に答える
43

解決策はすでにここに記載されています

# 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
于 2017-02-16T10:44:55.423 に答える
16

はい、後でコミットを回復できますgit push -f your_branch

Docからのテキスト

指定された時間より古いエントリを削除します。このオプションが指定されていない場合、有効期限は構成設定gc.reflogExpireから取得され、デフォルトで90日になります。--expire=年齢に関係なくすべてのプルーンエントリ。--expire =到達可能なエントリのプルーニングをオフにすることはありません(ただし、-expire-unreachableを参照してください)。

だからあなたはすることができます:

1-git reflog

enter image description here

2-あなたはHead_Numberを選択しますgit reset –hard HEAD@{HEAD-NUMBER}

enter image description here

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

お役に立てれば

于 2019-11-20T09:51:48.053 に答える
7

強制プッシュが発生したローカルリポジトリにいない場合、オリジン/マスターレベルでは回復する方法はありません。ただし、幸運にもGitHubまたはGitHub for Enterpriseを使用できる場合は、 REST APIを調べて、失われたコミットをパッチとして取得できます。例:

  1. イベントを一覧表示し、commitsha1の長い形式を見つけます

https://api.github.com/repos/apache/logging-log4j2/events

  1. 失われたコミットをダウンロードし、json path .files []/patchで関連するパッチを取得します

https://api.github.com/repos/apache/logging-log4j2/commits/889232e28f3863d2a17392c06c1dd8cac68485de

  1. ローカルで適用し、もう一度プッシュします

git apply patch.patch && git commit -m "restored commit" && git push origin master

于 2018-01-05T09:42:35.423 に答える
4

失われたコミットを回復する別の方法、または前のプッシュがローカルリポジトリからのものでない場合に失われたコミットを把握する別の方法は、CIマシンを調べることです。

すべてのコミット(または一連の連続したコミット)の後にマスターブランチをテストするジョブがある場合は、最後に何をテストしていたかを確認できます。これが、復元する必要のあるコミットです。

CIマシンは、リポジトリのローカルクローンを保持している場合もあり、そこからこのリカバリを実行できる場合があります。

出典:おそらく継続的デリバリー:ビルド、テスト、および展開の自動化による信頼性の高いソフトウェアリリース(Addison-Wesley Signature Series(Fowler))

于 2018-08-16T07:15:39.737 に答える
2

1つのファイルのみの最後のプッシュを元に戻しながら、同じことを行いました。リポジトリの元の状態に戻ることになりました。Linuxにローカルコピーがあるので、Linusのgitコマンドを使用していました。幸いなことに、そのコピーはまだ無傷でした。

私がしたのは(必死になってローカルリポジトリのコピーをさらにいくつか作成した後):

git add .
git status

(オリジン/マスターは68コミット進んでいると言っていましたが、問題ありません...これらはすべて私が削除したコミットでした)

git remote set-url origin <GIT_SSH_URL>
git push

そして、私が力強くプッシュする前の状態にすべてが復元されました。覚えておくべき最も重要なことは、gitcheckoutを決して行わないことです。力強く押した後。ただし、ベストプラクティスは、プッシュオプションを無効にすることです。私は二度とそれを使用していません。私のレッスンを学びました!

于 2012-07-26T22:23:01.623 に答える
1

私のように本当に悪い状況にある人のために(たとえば、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:

  1. Clone the treesaver script and cd to it.
  2. Find the SHA string of the tree you'd like to restore by accessing https://api.github.com/repos/<your_username_or_org>/<repo>/events.
  3. In the payload property corresponding to your push event, find the commit you'd like to revert to and click on its url.
  4. Under commit.tree, copy the tree's url.
  5. Run 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.

于 2020-07-12T00:41:13.490 に答える
0

ここで決定を読むことができます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
于 2019-01-08T13:03:35.830 に答える