簡潔な答え:
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
[...]
最初の行は、HEAD
0ポジション前(つまり、現在のポジション)が3f6db14であることを示しています。にリセットすることで取得されましたHEAD~
。2行目は、HEAD
1ポジション前(つまり、リセット前の状態)が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
です。