「git reset」を元に戻す方法は?


1313

元に戻す最も簡単な方法は何ですか

git reset HEAD~

コマンド?現在、私が考えることができる唯一の方法は、リモートリポジトリから「git clone http:// ...」を実行することです。


2
ハードリセットを元に戻す方法を探している場合は、「元に戻すgit reset --hard HEAD〜1」を確認してください。ソリューションは非常に似ています。


2
に関連する質問の複製ではありません--hard。このコマンドを誤って実行するリスクははるかに高くなります。たとえば、1つのファイルをでステージング解除したいとしますgit reset foo-file。あなたはファイル名の最初の部分を書くだけで、オートコンプリートのためにタブを押します、それは実際にはブランチ名まで完了します、あなたはそれに気付かずにgit reset foo-branch代わりにコマンドを実行します。ほら
維新鷲尾

回答:


2389

簡潔な答え:

git reset 'HEAD@{1}'

長い答え:

Gitはすべてのref更新(たとえば、チェックアウト、リセット、コミット、マージ)のログを保持します。次のように入力して表示できます。

git reflog

このリストのどこかに、あなたが失ったコミットがあります。入力git reset HEAD~しただけで元に戻したいとしましょう。私のreflogは次のようになります。

$ git reflog
3f6db14 HEAD@{0}: HEAD~: updating HEAD
d27924e HEAD@{1}: checkout: moving from d27924e0fe16776f0d0f1ee2933a0334a4787b4c
[...]

最初の行は、HEAD0ポジション前(つまり、現在のポジション)が3f6db14であることを示しています。にリセットすることで取得されましたHEAD~。2行目は、HEAD1ポジション前(つまり、リセット前の状態)がd27924eであることを示しています。これは、特定のコミットをチェックアウトすることで取得されました(現時点では重要ではありません)。したがって、リセットを元に戻すには、git reset HEAD@{1}(またはgit reset d27924e)を実行します。

一方、それ以降に他のコマンドを実行してからHEADを更新した場合、必要なコミットはリストの先頭に表示されないため、を検索する必要がありますreflog

最後にreflog、マスターではなく、リセットを解除する特定のブランチを確認する方が簡単な場合がありますHEAD

$ git reflog show master
c24138b master@{0}: merge origin/master: Fast-forward
90a2bf9 master@{1}: merge origin/master: Fast-forward
[...]

これは一般よりもノイズが少ないはずHEAD reflogです。


25
reflogこの目的のためのより視覚的でより良い代替手段として、私はを使用するのが好きgit log --graph --decorate --oneline $(git rev-list -g --all)です。名前のないぶら下がりブランチを含むすべてのコミットのツリーが表示されます
texasflood

1
既存のファイルを含むディレクトリがあるとします。このディレクトリで実行しgit init、その直後に実行しgit reset --hardます。reflogや、そもそもログはありません。これらのファイルは、今ではかなり乾杯されていますか?
AlanSE、2015

@AlanSE、残念なことに、私が知る限り、これらのファイルはトーストです。一度も実行したことがない場合git add(つまり、そのバージョンのファイルをステージングしたことがない場合)、git checkoutまたはgit reset --hardバックアップなしで唯一のコピー(作業ディレクトリ)が削除されます。それがなかったらいいのに。
Mark Lodato、2015

2
git reset HEAD~12おっと... git reset HEAD@{12}nooo .. 'git reflog'が助けになりました!Oh it's justgit reset HEAD@{1}
Dennis

優れたgit-scm.com/blog/2011/07/11/reset.html git-resetの記事を読んだ後、少し不思議に思いました。
Andriy Drozdyuk

192

古い質問と投稿された回答がうまくいきます。私は別のオプションでチャイムします。

git reset ORIG_HEAD

ORIG_HEADHEAD以前に参照したコミットを参照します。


1
これはすばらしいようです。詳しく説明できますか?ここで「ORIG」は「オリジナル」または「オリジナル」の略ですか?…つまり、それを使ってサルを始める前にHEADがあった場所にリセットされますか?またはHEADが原点にある場所へ?以前にHEADを数回移動した場合はどうなりますgit reset ORIG_HEADか?ありがとう。
Benjohn

ORIGはオリジナルを表し、ORIG_HEADはリセット前のオリジナルのヘッドを意味します
Sam Gallagher

「マージやリセットなどの特定の操作では、以前のバージョンのHEADを新しい値に調整する直前にORIG_HEADに記録します。ORIG_HEADを使用して、以前の状態に回復または復帰したり、比較したりできます。」本からの抜粋:「Gitによるバージョン管理」
アミレザ

56

私の状況は少し異なりました、私はgit reset HEAD~3回行いました。

それを元に戻すために私はしなければならなかった

git reset HEAD@{3}

だからあなたはできるはずです

git reset HEAD@{N}

しかし、git resetを使用していた場合

git reset HEAD~3

あなたがする必要があります

git reset HEAD@{1}

{N}はReflogの操作の数を表すため。マークがコメントで指摘したように。


2
受け入れられたオプションは前進する例を提供しませんNIは1時間以上前に転送したかった1時間前の状況でした。複数で試してみましたが、うまくいきました。ここに追加したかった。gitのリセットHEAD〜3と元に戻すリセットを探している人々のために有用であろう
zainengineer

3
しかし、誰かがgit reset HEAD〜3を実行した場合、それを元に戻す方法をすぐに確認できます。reflogにアクセスせずにgit reset HEAD @ {3}が必要ですgit reset HEAD〜3などが一般的な状況です
zainengineer

1
{1} / {2}を見た人なら、reflogコマンドが提供する任意のリビジョン番号であることに気付くと思います。〜3 / @ {3}のどちらの方向でも数値が同じであるという点についてのあなたのポイントは、実際には新しい答えである必要はないことに同意しました。
Clint

30

1. git reflogすべての参照を更新するために使用します。

2。git reset <id_of_commit_to_which_you_want_restore>

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