2012-06-19 2 views
22

私はGit Towerを使って自分のリポジトリに変更を取り込もうとしていました。私がそうしたとき、紛争があり、私は間違って舞台にぶつかりました(紛争を解決してコミットしたかったように)。私がそうしたとき、紛争は解決されたと自覚した。Gitでは、コミットする前に元に戻されたステージングされたファイルをどのように回復できますか?

私は "Abort Merge"とヒットするように手動で変更を解決したかったのですが、これを実行したときにすべての変更がロールバックされました!それらを取り戻す方法はありますか?

答えて

44

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

まずは、ではなく、を実行してgit gcを実行してください。先に進む前にリポジトリと作業コピーをバックアップしてください。 (.gitディレクトリを必ずバックアップしてください)また、これが起こった端末を閉じたりリブートしたりしないでください。すべてが失敗した場合は、履歴/メモリ内のものを見つける機会があります。 、あなたがファイルを上演してコミットをしませんでした失われたので、それは

 
Checking object directories: 100% (256/256), done. 
Checking objects: 100% (30165/30165), done. 
dangling blob 8f72c7d79f964b8279da93ca8c05bd685e892756 
dangling commit 4993502a6394491190d3f4d6fb3d1e14019c2e9b 

のようなものを出力します

 
git fsck --lost-found 

あなたはdangling blobエントリに興味を持っている:とにかく

、しようとする最初の事はあります。

それぞれgit show <sha>を実行してください - そのうちのいくつかはファイルにする必要があります。

+4

ありがとうございます!私はGitがコミットされていないファイルを保持していたという希望をあきらめていました。 紛失して見つかったごみをたくさん持っている人のためのヒントを追加したかったのです。私は100のエントリを持っているので、ハッシュを見つけるために、書いたファイルのある部分を覚えている限り、gitディレクトリにfind-in-fileコマンドを使うこともできます。私は を見つけました。 | xargs grep 'PIECE_OF_MISSING_CODE' -sl | grep 'lost-found' – David

+0

git show は、わかりやすい文字列が表示されていますが、残っているものは駄目です。それは何らかの形でデコードされることを意味しますか、それはそれが何であるか(使用不可能)です。 – jayarjo

+1

ありがとうございます。あなたは私の日を救っただけです。 – fuz

4

アレクサンダーの答えをもっと簡単な方法で拡張する:はい、あなたが変更を上演していれば、おそらくファイルを元に戻すことができます。 git addを実行すると、ファイルは実際にGitのオブジェクトデータベースに追加されます。 bar.txtのエントリは、ファイルのオブジェクトIDが含まれていることを

% git add bar.txt 
% git ls-files --stage 
100644 ce013625030ba8dba906f756967f9e9ca394464a 0 bar.txt 
100644 6af0abcdfc7822d5f87315af1bb3367484ee3c0c 0 foo.txt 

注:あなたが現時点では、Gitは、インデックス内のファイルを配置します。 Gitは実際にオブジェクトデータベースにファイルを追加しました。この場合、Gitは緩いオブジェクトとしてリポジトリに追加しました:

% ls -Flas .git/objects/ce/013625030ba8dba906f756967f9e9ca394464a 
4 -r--r--r-- 1 ethomson staff 21 14 Jun 23:58 .git/objects/ce/013625030ba8dba906f756967f9e9ca394464a 

これらのファイルはは、最終的にゴミを収集することます(そう確かに、明示的にgit gcを実行しないでください)。ありがたいことに、デフォルトでは、これは月の日で行われます。これらのファイルがガベージコレクトされるまで、それらを回復することができます。

これを行う最も簡単な方法は、対話型モードでdownload and install the git-recover programにある:

% git recover -i 
Recoverable orphaned git blobs: 

61c2562a7b851b69596f0bcad1d8f54c400be977 (Thu 15 Jun 2017 12:20:22 CEST) 
> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod 
> tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim 
> veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea 
> commodo consequat. Duis aute irure dolor in reprehenderit in voluptate 

Recover this file? [y,n,v,f,q,?]: 

git-recoverはコミット(またはインデックス中)でないオブジェクトデータベース内のファイルを検索します。 git-recoverについて詳しくは、the blog post announcing itをご覧ください。

+2

あなたを祝福してください!あなたは私のベーコンを救った –

関連する問題