git reset --hardから回復しますか?


457

からコミットされていない作業ディレクトリへの変更を回復する方法はありますgit reset --hard HEADか?


49
学習しないことをお勧めしますgit reset。このコマンドは必要なく、危険なので、使用しないでください。ブランチを前のコミットに戻しgit rebase -i、不要なコミットをドロップするか、git checkout(ヘッドを切り離して)git branch -Mブランチの先端を移動します。最初のものはローカルの変更での実行を拒否し、後者はローカルで変更されたファイルがリビジョン間で異ならない場合にのみ実行されます。
Jan Hudec、2011

11
@Jan信じられません。リセットを使用する正当な理由は完全にあります。
spaaarky21 2013

4
@ spaaarky21:はい、あります。しかし、これgit reset --hard somewhereは非常に危険なgitコマンドの1つです。
Jan Hudec 2013

5
@Jan私は同意しますが、それが危険であるということは、それを使用するべきではないという意味ではありません。あなたが何をしているかを知って、注意してください。:)
spaaarky21 2013

3
元の投稿者がコミットされていない変更を回復しようとしているため、git reset --hard HEAD〜1元に戻すこととは関係ありません。

回答:


475

一般に、コミットされていない変更を取り戻すことはできません

以前にステージングされた変更(git add)は、インデックスオブジェクトから回復可能である必要があります。そうした場合は、を使用git fsck --lost-foundして、それに関連するオブジェクトを見つけます。(これにより、オブジェクトが.git/lost-found/ディレクトリにgit show <filename>書き込まれます。そこから、各ファイルの内容を確認するために使用できます。)

そうでない場合、ここでの答えは、バックアップを確認することです。多分あなたのeditor / IDEは一時的なコピーを/ tmpまたはC:\ TEMPおよびそのようなものの下に保存します。[1]

git reset HEAD@{1}

これは前のHEADに復元されます

[1] vimはオプションで永続的な取り消しを保存し、Eclipse IDEはローカル履歴を保存します。そのような機能はあなたのa **を節約するかもしれません


18
Eclipseのローカル履歴-さらに、一部の変更が6日より古いため、Eclipseのローカル履歴のTime Machineバックアップ!何らかの理由で、gitが管理するフォルダーのTime Machineバックアップには、以前の変更が含まれていませんでした。
christianbrodbeck

2
あなたは真剣に命の恩人です!TextWranglerにはファイルのバックアップがありました。ありがとう
Vivek Sampara

6
IDE(IntelliJ)は変更をローカルに保存し、その日を節約しました。先端をありがとう!
progonkpa 2017年

1
これはすごいですね。コミットしたことがない場合でも機能します。
Boudewijn Aasman

2
、IntelliJのためにここにドキュメントをunstrage変更の回復に私の一日保存Eclipseで実際に地域の歴史(私の場合のIntelliJ):blog.jetbrains.com/idea/2008/01/...
リチャード・

449

このSOからの回答

$ git reflog show
93567ad HEAD@{0}: reset: moving to HEAD@{6}    
203e84e HEAD@{1}: reset: moving to HEAD@{1}    
9937a76 HEAD@{2}: reset: moving to HEAD@{2}
203e84e HEAD@{3}: checkout: moving from master to master
203e84e HEAD@{4}: reset: moving to HEAD~1
9937a76 HEAD@{5}: reset: moving to HEAD~1
d5bb59f HEAD@{6}: reset: moving to HEAD~1
9300f9d HEAD@{7}: commit: fix-bug

# said the commit to be recovered back is on 9300f9d (with commit message fix-bug)
$ git reset HEAD@{7}

あなたは一日を取り戻しました!:)


24
この回答に追加するだけで、これは実際にハードリセットによって破棄された変更をコミットした人々を助けるでしょう。
murki 2014

9
すばらしいですが、私の場合、ファイルは完全に削除されました。を使用git checkout HEAD@{19}すると、失われたファイルを切り離された状態でチェックアウトできました。次にgit checkout -b new-branch-name、それらを「接続」状態のリポジトリに追加するために使用されます。
NightOwl888 2016年

@ NightOwl888:Git初心者とここで、ファイルが消えてしまうという同じ問題が発生しました。どのようにファイルを「添付」状態に回復したかを詳しく説明できますか(または実際にそれが何を意味するか説明できますか)。どうもありがとうございます!
OhDaeSu

3
@ user3385759-Gitでは、ブランチではないものに対してcheckoutコマンドを使用すると、特別な「切り離されたヘッド」モードになります。これは、実際にはブランチを指していないことを意味しますが、エンティティの状態でチェックインされたものを表示できます(この場合はreflogエントリ)。その状態から、それを「実際の」ブランチに変えて、を使用して再び戻ることができますgit checkout -b new-branch-name。「Gitを使用した実用的なバージョン管理」という本は、Gitを簡単に説明するのに適しています。
NightOwl888 2016年

2
ええ、NomNomCameronとJesse Adelmanが言ったこと。リセットが最後のコミットにリセットされると誤って考えました。いいえ。それはすべてを一掃した。この答えは、私の作品を再作成する1〜2日から私を救いました。
VeteranCoder 2017年

308

git reset --hard今日もコミットされていない変更をしている間に、誤って今日も私のリポジトリを実行しました。それを取り戻すために、私はを実行しgit fsck --lost-found、参照されていないすべてのblobをに書き込みました<path to repo>/.git/lost-found/。ファイルはコミットされていないため、other内のディレクトリで見つかりました<path to repo>/.git/lost-found/。そこから、を使用してコミットされていないファイルを表示git show <filename>し、BLOBをコピーして、名前を変更できます。

注:これは、保存するファイルをインデックスに追加した場合にのみ機能します(を使用git add .)。ファイルがインデックスになかった場合、それらは失われます。


4
でコミット参照を含むファイルだけを得ましたlost-found。しかし、その後、git showコンテンツを取得するために行うことができました。
Mitar 2013

6
だれでも時間を節約するため#!/bin/bash cd PATH_TO_PROJECT/.git/lost-found/other FILES=* COUNTER = 0 for f in $FILES do echo "Processing $f file..." git show $f > "PATH_TO_RECOVERY_DIRECTORY/$COUNTER.m" let COUNTER=COUNTER+1 done
rwolst 2014年

209

はい、 gitのハードリセットから回復できます。

使用する:

git reflog

コミットの識別子を取得します。次に使用します:

git reset --hard <commit-id-retrieved-using-reflog>

このトリックは私の人生を数回救いました。

ここにreflogのドキュメントがあります。


9
これまでのところ、これが最良かつ最も簡潔な答えだと思います。git reset --hard別のものを使用することから回復するのは直観に反するように見えるかもしれgit reset --hardませんが、--hardスイッチを使用しない場合、回復したばかりの作業を効果的に元に戻すことができるワークスペースのエントリが残ります。
Ryan H.

2
魅力的な作品!以前の回答(stackoverflow.com/questions/5788037/recover-from-git-reset-hard/…)は私にとってはうまくいきませんでした。
codemax

3
この答えは正しくありません。このアプローチでは、以前にコミットされた変更のみが回復されます。コミットされていない変更を復元することはできません(この質問についてです)。
Alderath、

2
この解決策は私にとってはうまくいきます。ハードリセットを行ったところ、使用時にgit logコミットのIDが表示されませんでした。でgit reflog、私が見ることができるIDコミット
dboscanv

2
これは私にとってはうまくいきます。ありがとう!!!!!!
RedEyed

60

ローカルプロジェクトで作業しているときに、それをGitHubに移動して、新しいリポジトリを作成したいと考えていました。これらのすべてのファイルを.gitignoreを使用して新しいリポジトリに追加しようとしたときに、誤って間違ったファイルを追加して、それを消去しようとしました。

私は走ったgit reset --hard origin/master:P

その後、リポジトリが空だったため、すべてのローカルファイルが削除されました。すべてがなくなったと思った。

これは私の命を救った:

git reflog show
git reset HEAD@{1} 
git push 

それが別の命を救うことを願っています。


私にとってはgit reset HEAD@\{27\} 、ありがとうございました!
2017年

1
私は7つのコミットをリセットgit reflog showする必要があります。チェックに使用し、その最初のコミットから使用しますgit reset HEAD@{number}
Vishwas Nahar

38

IntelliJのようなものを使用する場合:

コンテキストメニューで[ローカル履歴]を選択し、サブメニューの[履歴の表示]をクリックします。

プロジェクトまたはフォルダーのローカル履歴ビューには、過去数日間に行ったすべてが表示されます。ダイアログボックス下部の[アクション]列で、ロールバックするアクションを選択します。[...]そうすると、ダイアログボックスの上部に、変更されたファイルのツリービューが表示されます。それ以降に行われた他の変更に関係なく、削除したファイルのみを復元する場合は、ツリービューでLost.txtファイルを選択して、[元に戻す]ボタンをクリックします。

http://blog.jetbrains.com/idea/2008/01/using-local-history-to-restore-deleted-files/

これはちょうど私のお尻を火から出した!


これはIntelliJユーザーにとって断然最良の答えです!どうもありがとうございました。これは完璧に機能しました。私は他のすべての解決策を試しましたが、どれもうまくいきませんでした。git reflog変更をコミットしなかったため、機能しませんでした。git fsck --lost-foundステージングされたファイルで機能しましたが、すべてがステージングされたわけではありません。IntelliJのローカル履歴により、未保存のファイルが完全に復元されました。この機能に感謝しています
Denes Papp

30

git reset --hardはコミットしなかったすべての変更を行って失いました。幸い、私はエディター(IntelliJ)を使用しており、ローカル履歴から変更を復元することができました。Eclipseでも同じことができるはずです。


20

定義により、git reset --hardコミットされていない変更をGitが回復する方法なしに破棄します(バックアップシステムは役立つかもしれませんが、Gitは役立ちません)。

実際、git reset --hard良いアイデアが出されるケースはほとんどありません。ほとんどの場合、同じことを行うためのより安全なコマンドがあります。

  • コミットされていない変更を破棄する場合は、を使用しますgit stash。これらの変更のバックアップが保持され、を実行するとしばらくすると期限切れになりますgit gc。99.9%の場合、これらの変更が二度と必要になることはないと確信している場合git stashでも、0.1%のケースの友です。あなたが100%確信している場合git stash、これらの100%には測定エラーがあるため、それでもあなたの友達です;-)。

  • あなたHEADと歴史の中で現在の枝の先端を動かしたいなら、それgit reset --keepはあなたの友達です。それは同じことを行いますgit reset --hardが、うではないローカルの変更を破棄します。

  • あなたが両方をしたいなら、それgit stash && git reset --keepはあなたの友達です。

指を使わないように教えてくださいgit reset --hard


だから、もしgit stash && git reset --hardそれが隠されたコンテンツを一掃するならば、それは正しいのでしょうか?
jxramos 2018年

1
いいえ、git reset --hard隠し場所は破棄しません。コミットされていない変更をワークツリーから削除するという意味でののgit stash代替ですgit reset --hard。ただし、永続的に破棄するのではなく、安全に保持します。
Matthieu Moy

または、ハードリセットする前に変更をコミットするだけで、ローカルリポジトリに
残り

11

誤ってコミットをハードリセットした場合は、これを行ってください。

git reflog show
git reset HEAD@{2} // i.e where HEAD used to be two moves ago - may be different for your case

仮定しHEAD@{2}たい状態に戻りたい


PowerShellでこれを行う場合、これは完璧に機能しました。このgit reset 'HEAD @ {2}'のように記述してください。そうしないと、Powershellで機能しません
VectorX

10

これは、いくつかの変更を失った場合に私が通常行うことです。

git reflog
git checkout <commit id> // now you are in where you want but you cannot push from detached branch to master
manually copy and paste changes from detached branch to master or working branch
git reset --hard HEAD // if needed
git add ... > git commit ... > git push ...

ポインタを以前のコミットに戻しますが、これまでに行った変更を最新のコミットチェックアウトに保持します git reset --soft dadada


8

情報は失われます。

コミットしなかったため、.gitがこの情報を保存することはありません。したがって、基本的にgitは回復できません。

ただし、実行したばかりの場合git diffは、次の3つの簡単な手順でターミナル出力を使用して回復する方法があります。

  1. 端末をスクロールして、のo / pを探しますgit diff。o / pをdiff.patchというファイルに保存します
  2. 7つのスペースと8つのスペースすべてを検索してタブ(\ t)文字に置き換え、変更を保存します。
  3. gitリポジトリに移動します。diff.patch(patch -p1 < diff.patch)を適用します

助かります!:)

注:端末からファイルにデータをコピーしている間、データが連続出力であり、冗長なデータが含まれていない(上下の矢印を押すため)ことに注意して、はっきりと見てください。そうでなければ、あなたはそれを台無しにするかもしれません。


7

私は同じ問題に遭遇し、私はほとんど狂っていました......最初にプロジェクトをコミットしてマージしました。後で実行しようとするとgit push --set-upstream origin master 、このエラーが発生しました

  fatal: refusing to merge unrelated histories

だから私は走った git reset --hard HEAD、それは3週間のプロジェクトを削除しましたが、以下のいくつかのコマンドはその日を節約します:

git reset HEAD@{1}         //this command unstage changes after reset
git fsck --lost-found      //I got the dangling commit fc3b6bee2bca5d8a7e16b6adaca6a76e620eca4b
git show <dangling commit something like-> fc3b6bee2bca5d8a7e16b6adaca6a76e620eca4b>
git rebase fc3b6bee2bca5d8a7e16b6adaca6a76e620eca4b

お役に立てれば


6

あなたがした後にコミットを取り戻すことができます reset --hard HEAD

git reflog」を使用して、履歴を確認しますHEADしてブランチのます。

コミットとそのIDがここに表示されます。

する

git reset {commit Id of the commit you want to bring back}

5

幸運にも、同じファイルを別のエディター(Sublime Textなど)で開いていた場合は、Ctrlキーを押しながらZキーを押してみてください。助かった。


3

私は前にコミットされていないファイルgit reset --hard <commit>がgit履歴から削除されるという難しい方法を見つけました。しかし、幸運なことに、髪を抜く間ずっとコードエディターセッションを開いたままにしておくことがcontrol + zできました。影響を受けた各ファイルのシンプルファイルがGit以前のバージョンにファイルの状態を返すことがわかりました。私が特に要求しなかったものはすべて、義務的にリセットします。Hooray!!


3

以下のコードを使用しようとしている場合:

git reflog show
# head to recover to
git reset HEAD@{1} 

何らかの理由で取得しています:

エラー:不明なスイッチ `e '

次にHEAD@{1}、引用符で囲みます

git reset 'HEAD@{1}'

3
 git reset HEAD@{4}

4は4ステップ前の変更です。正しい手順を選択すると、ハードから削除したファイルのリストが表示されます。次に行います:

$ git reflog show

作成済みのローカルコミット履歴が表示されます。今してください:

$ git reset --hard 8c4d112

8c4d112は、ハードをリセットしたいコードです。詳細については、https://www.theserverside.com/video/How-to-use-the-git-reset-hard-command-to-change-a-commit-historyを見てみましょう 。


@mohammadに感謝します。以前はソースファイルを表示できませんでしたが、上記の手順に従ってすべてのソースファイルを復元できました。
Gaurav Bansal

2

正解。OK、今はgitが好きです。:-)これがより簡単なレシピです。

git log HEAD@{2}
git reset --hard  HEAD@{2}

「2」は、変更をコミットした場所に戻る回数です。私の場合、ビルドの問題をデバッグするのを助けるために同僚と上司に割り込まれました。そのため、リセットを2回行いました。したがって、HEADとHEAD @ {1}は上書きされました。ふew、私たちのハードワークを失ったでしょう。


2

やった git reset --hard間違って間違ったプロジェクトました(わかっています...)。1つのファイルで作業したばかりで、コマンドの実行中も実行後もまだ開いていました。

コミットしていませんが、単純なで古いファイルを取得できましたCOMMAND + Z


0

このSOからの参照回答、

git reflog showを実行した後、9300f9dをコミットしたいと言います

git reset 9300f9dを実行した後

git statusを実行してから、変更を復元するためにファイルをチェックアウトする必要がある場合があります

git checkout-ファイルパス/名前


0

Netbeansで開発している場合は、ファイルタブとファイル編集領域の間を確認します。「ソース」と「履歴」があります。「履歴」では、バージョン管理(git / other)を使用して行われた変更だけでなく、ローカルで行われた変更も表示されます。この場合、ローカルでの変更により節約できます。


0

ユーザーのサブセットに適した回答

(最近の)macOSを使用していて、Time Machineディスクから離れていても、OSはローカルスナップショットと呼ばれる1時間ごとのバックアップを保存し ます。

Time Machineに入り、失われたファイルに移動します。OSはそれからあなたに尋ねます:

The location to which you're restoring "file.ext" already contains an
item with the same name. Do you want to replace it with the one you're
restoring?

失われたファイルを回復できるはずです。


0

同じコードでIDEを開いている場合は、変更した個々のファイルごとにctrl + zを実行してみてください。git reset --hardを実行した後、コミットされていない変更を復元するのに役立ちました。


-3

git reset --hardを実行すると、ローカルのコミットされていない変更はすべて削除されます。変更を元に戻すには、IDEでファイルをクリックし、ファイルをローカル履歴と比較します。これにより、日付ごとの変更がリストされ、データを復元できます。あなたの日は救われました!


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