私の歴史がそのように進んだとします:
A - B - C - D (マスター)
もしそうならgit reset B
、私は得ます:
A - B (マスター)
問題は、git log
A から B までの履歴だけを表示して、C と D が表示されなくなったことです。
どうすれば D に戻ることができますか?
でDを見ることができるはずですgit reflog
。
たとえば、この記事を参照してください。
コミットが実際に削除されるのは、git gc --pruneの場合のみです(そのため、注意してください)。
作業中のリポジトリで現在gitreflogを実行すると、次のような多くの変更が表示されます。
c5c3a82... HEAD@{0}: pull origin featureB: Merge made by recursive.
49d0608... HEAD@{1}: reset --hard HEAD^: updating HEAD
3ed01b1... HEAD@{2}: pull origin featureA: Merge made by recursive.
49d0608... HEAD@{3}: pull origin bugfixJ: Merge made by recursive.
854d44e... HEAD@{4}: commit: Add more cowbell to foo.c
6dbc22d... HEAD@{5}: pull origin bugfixI: Merge made by recursive.
9bdb763... HEAD@{6}: commit: Remove weevils
8518f9d... HEAD@{7}: checkout: moving from wickedfeature to master
これらの行は、次の4つの部分に分けることができます。
- ハッシュをコミットし、
- コミットポインタ、
- アクション、
- および追加情報。
で失われたコミットを取り戻したい場合は
HEAD@{1}
、git reset --hard HEAD@{2}
。
これで、リセットを実行する前に、現在のブランチ(および作業コピー)がリポジトリの状態に設定されます。その状態が何であるかを確認したい場合は、それが可能です
git checkout -b temp HEAD@{2}
(またはgit checkout HEAD@{2}
、git 1.5.0以降を使用している場合)。
わかりました、それを見つけました。
を使用できますgit reflog
。
何のためにあるのかわかりませんでしたが、HEADが指しているすべての参照のログであることがわかります。