2

受け取ったすべての変更されたファイルをWebルートにコピーする裸のレポに、必要のないコミットをすべてプッシュしました。

GIT_WORK_TREE=/var/www git checkout -f

post-receiveフックで。

一度に大量のコミットがプッシュされたため、レポが受け取った以前の正常なコミットの ID が何であったかわかりません。

このプッシュを元に戻す方法はありますか?

4

2 に答える 2

2

Mark Amery が言ったように、サーバーで reflog が無効になっている可能性が最も高いです。ただし、プッシュ元のリポジトリのコピーがあれば、まだ希望はあります。プッシュを行うと、Git はリモート トラッキング ブランチ ( などrefs/remotes/origin/master) を更新し、おそらくこのリモート トラッキング ブランチの reflog を更新しました。

の出力で、プッシュに対応するgit reflog show origin/masterというエントリが見つかるはずです。update by push前のエントリは、プッシュ前の場所に対応しています。

ログ ファイル (例: ) を直接.git/logs/refs/remotes/origin/master見て、次のようなエントリを見つけることもできます。

acb60f2759717796f807197f6997708528260255 59dbeca4120db70db34144ee14d05cc526b1f5ab Your Self <Your.Self@example.com> 1427137007 +0100  update by push

最初の sha1 は以前の場所、2 番目の sha1 は後の場所です。

しかし、魔法はありません。これは、このリポジトリで見られるリモート追跡の履歴のみを提供し、誰がいつプッシュしたかの詳細な履歴は提供しません。

于 2015-05-10T13:54:47.587 に答える
2

これは本当にできません。

git reflogは、チェックアウトしたコミットとそれらの間で移動した操作の完全な履歴を示し、多くの場合、Git リポジトリでの無能が原因の災害から回復するための適切なツールです。愚かで破壊的なことを行う前に、どのコミットを行っていたかがわかるまで履歴を調べて、そのコミットをチェックアウトします。

残念ながら、bare repos の reflog はデフォルトで無効になっていますcore.logAllRefUpdatesリポジトリの構成で明示的に有効にしない限りgit reflog、出力なしで返されます。この質問を読む必要があると感じた場合は、明示的に有効にしていない可能性がありますcore.logAllRefUpdates

Matthieu Moy で説明されているように、開発マシン (またはベア リポジトリにプッシュするリポジトリ) のリモート トラッキング ブランチの reflog を見ることで、必要な情報を取得できる場合があります。ただし、最後の正常なプッシュを行った開発マシンにアクセスできない場合は、そのオプションも利用できない場合があります。

それがあなたの状況なら、私はあなたが犯されているのではないかと心配しています。あなたが持っている唯一の手段は、どのコミットがチェックアウトされることになっていたかについてある程度のgit log知識があると仮定して、完全なコミット履歴を目で見て、必要なものであると思われるコミットをチェックアウトすることです。reflog を有効にするか、次回はもっと注意してください。

于 2015-05-10T13:07:33.223 に答える