偶発的なgit push -fから回復するにはどうすればよいですか?


13

git push -f誤って実行したため、リモートブランチが上書きされました。

元の:

(remote origin:)
    branch master -> commit aaaaaaa
    branch foo    -> commit bbbbbbb

(local)
    branch master -> commit ccccccc
    branch foo    -> commit ddddddd

git push -f

(remote origin:)
    branch master -> commit ccccccc
    branch foo    -> commit ddddddd

私のローカルリポジトリでは、私が上で働いているmaster私は、枝が復元できるように、ブランチmasterにコミットするためにaaaaaaa私がコミット得ることができますので、aaaaaaaからgit reflog。ただし、bbbbbbb前にプルしなかったため、コミットを取得できませんでしたgit push -f

私が試してみましたgit reflogリモートリポジトリではなく、裸のリポジトリにREFLOGに有用何もありません。

リモートリポジトリでfooコミットするためにブランチを復元するにはどうすればよいbbbbbbbですか?

(PSの実際の値はわかりませんbbbbbbb。)


しかし、リモートレポジトリはベアレポジトリです。
謝Jìléi

回答:


12

これを試して:

  1. SSH経由でリモートに接続します。

  2. リモートリポジトリ全体のバックアップを作成します。

    tar cvzf project-backup.tgz /path/to/project.git
    
  3. の少なくとも最初の数文字がわかっている場合はbbbbbbbgit show bbbbbbおよび/またはgit log bbbbbbを使用して完全なコミットハッシュを見つけます。(ハッシュのみが必要な場合git rev-parse bbbbbbも機能しますが、常に確認した方が良いでしょう。)

    あなたは値がわからない場合は、すべてで、実行するgit fsckと、あなたは「ダングリングコミット」のリストを取得する必要があります。を使用git show <hash>してgit log <hash>、正しいコミットが見つかるまで各コミットを調べます。

  4. ブランチ参照を更新します。

    echo aaaaaaaaaaaaaaa.... > refs/heads/master
    echo bbbbbbbbbbbbbbb.... > refs/heads/foo
    
  5. git log masterおよびgit log fooを使用して、正しいブランチを復元したことを確認します。


おかげで、私はぶら下がり枝を保存しましたgit fsck
謝Jìléi

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.