45

Git Tower を使用してリポジトリに変更を取り込もうとしていました。そうしたらコンフリクトが発生してしまい(コンフリクトを解消してからコミットしたかったので)誤って全ステージに突入してしまいました。私がそうしたとき、競合は解決済みとしてマークされました。

変更を手動で解決したかったので、「マージの中止」をクリックしましたが、これを実行すると、すべての変更がロールバックされました! それらを取り戻す方法はありますか?

4

3 に答える 3

74

git にステージングされたものがある場合は、おそらくそれを元に戻すことができるはずです。(作業コピーを変更しただけでは、元に戻すことはできません。)

まず、実行しないgit gcでください。先に進む前に、リポジトリと作業コピーをバックアップしてください。(必ずディレクトリをバックアップしてください.git。) また、これが発生した端末を閉じたり、再起動したりしないでください。すべてが失敗した場合は、履歴/メモリで何かを見つける可能性があります。

とにかく、最初に試すことは次のとおりです。

git fsck --lost-found

次のようなものが印刷されます

オブジェクト ディレクトリのチェック: 100% (256/256)、完了。
オブジェクトのチェック: 100% (30165/30165)、完了。
ぶら下がっているブロブ 8f72c7d79f964b8279da93ca8c05bd685e892756
ダングリングコミット 4993502a6394491190d3f4d6fb3d1e14019c2e9b

ステージングされたファイルを失い、コミットをしなかったので、dangling blobエントリに興味があります。

それぞれに対して実行git show <sha>します — それらのいくつかはあなたのファイルでなければなりません。

于 2012-06-19T07:44:11.760 に答える
19

どのブロブを回復する必要があるかをより迅速に把握できるようにすることで、コマンドラインを使用した回復を簡素化できる非常に遅い回答(他の回答と比較してかなり?):

git fsck --full --no-reflogs --unreachable --lost-found | grep blob | cut -d\  -f3 | while read in; do printf "blob: $in\n"; git cat-file -p $in; printf "\n--------------------------------\n"; done > recover.txt

このコマンドは、復元できるすべての BLOB のハッシュとコンテンツを含むファイルを作成します。

そうすれば、このファイルを簡単に検索して、指定されたハッシュで必要なブロブを回復できます (コマンドを使用git cat-file -p 8f72c7d79f964b8279da93ca8c05bd685e892756 > myFile.txt)

免責事項: 到達不能な BLOB が多数ある場合、このファイルは巨大になり、作成が遅くなる可能性があります。

GUI ツールの使用を好み、Windows を使用している場合は、ファイルの回復に役立つGitExtensionsを使用することもできます。

于 2019-11-14T09:59:24.813 に答える