回答:
特に簡単ではありません-枝の先端へのポインタを失った場合、干し草の山から針を見つけるようなものです。参照されていないように見えるすべてのコミットを見つけることができます-これはあなたのために行います-が、あなたが再ベースしたブランチ上の古いコミットなどのgit fsck --unreachable
後に捨てたコミットも含まれますgit commit --amend
。したがって、これらすべてのコミットを確認します一度に大量の情報が流れてしまう可能性は非常に高いです。
つまり、気の利いたことを忘れないでください。もっと真剣に、reflogには、デフォルトで過去60日間に使用したすべてのコミットへの参照が保持されます。さらに重要なことは、それらはそれらのコミットが何であるかについていくつかのコンテキストを提供します。
git commit --amend
行き止まり、失われたコミットなどを残しておくことなどについて、大きな指摘。私はいくつかのリベースやその他のことを行い、どのブランチからも到達できないいくつかのコミットに終わり、それらをリポジトリに残していくのは少し汚いと感じました。今、その考えはもはや不安を和らげるものではありません。:)
試してください:
git log --reflog
これは、reflogs(git reflog
)によって言及されたすべてのオブジェクトがコマンドラインにとしてリストされているふりをして、すべてのgitコミットをリストします<commit>
。
この問題に取り組むときは、次のコマンドを使用します。
git reflog | awk '{ print $1 }' | xargs gitk
これにより、ヘッドレスになった最近のコミットを視覚化できます。
これをと呼ばれるスクリプトヘルパーでラップしました~/bin/git-reflog-gitk
。
when the tips of branches and other references were updated in the *local repository*
。git log --reflog
ローカル以外の参照の変更に対してこれを実行したい場合は、使用することをお勧めします
@Kieranの回答に似ていますが、コンソールの場合:
git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')
git log --all
ます。簡単な例:git reset --hard @^
HEAD @ {0}のコミット後は、コミットはreflogにのみ存在します。git reflog
サポートされていないため、視覚的な表現を取得する--graph
ためgit log --graph
にコミットを渡す必要があります。
--reflog
代わりに 使用できます$(git reflog | awk '{print $1}')
git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')
してgit log --oneline --all --graph --decorate --reflog
、-reflogにWIPエントリなどの詳細が含まれていることを除いて、ほとんど同じです。
reflog
なぜ代わりに使用しlog --reflog
ないのですか?
この問題を解決するにはどうすればよいですか?使用git fsck
とロギング!
まず、失われた(到達できない)コミットとBLOBを含むファイルを作成します。(注:あなたがそのようなことをした場合git gc
、コミットのすべてがガベージコレクションされ、ここでは見つかりません!)
$git fsck --lost-found > lost_found.commits
それはあなたにこのようなファイルを与えます:
ダングリングコミットdec2c5e72a81ef06963397a49c4b068540fc0dc3
ダングリングブロブf8c2579e6cbfe022f08345fa7553feb08d60a975
ダングリングブロブ0eb3e86dc112332ceadf9bc826c49bd371acc194
ダングリングブロブ11cbd8eba79e01f4fd7f496b1750953146a09502
ダングリングコミット18733e44097d2c7a800650cea442febc5344f9b3
ダングリングブロブ1e53a5cdb3ecdde27081ec6e8b31e4070106ee05
その後、お気に入りのテキストエディタでこのファイルを開いて、そこからコミット/ブログハッシュをコピーできます。(* 咳 * vimマクロはこれに最適* 咳 *)
これで、このコミットからのようにログに戻ることができますgit log --oneline <commit hash>
。または、gitk、tig、またはその他のgitビューアが動作するはずです。
あなたの場合、コミットFのハッシュを見つけると、ログは次のようなものを表示します、
A---B---E---F
早くて簡単!これで、これらすべてのぶら下がりコミットの背後にあるコンテキストを見つけることができます。
PSはい、わかりました。投稿が遅くなりましたが、まあ、誰かがここで見つけて役に立つかもしれません。(私がこれを再びググるとき、おそらく6ヶ月で私に)
次の場所にあるreflogを確認して、コミットを回復できました。 .git/logs/HEAD
次に、ファイルの最後までスクロールしなければなりませんでしたが、失ったコミットを見つけました。
@bsimmons
git fsck --lost-found | grep commit
次に、それぞれにブランチを作成します。
$ git fsck --lost-found | grep commit
Checking object directories: 100% (256/256), done.
dangling commit 2806a32af04d1bbd7803fb899071fcf247a2b9b0
dangling commit 6d0e49efd0c1a4b5bea1235c6286f0b64c4c8de1
dangling commit 91ca9b2482a96b20dc31d2af4818d69606a229d4
$ git branch branch_2806a3 2806a3
$ git branch branch_6d0e49 6d0e49
$ git branch branch_91ca9b 91ca9b
多くのツールが、失われたコミットのグラフィカルな視覚化を示します。
git log --reflog
助かりました!HEADのマージ中に迷子になり、自分のレイトコミットが見つからなかった!ソースツリーには表示されませんgit log --reflog
が、以前のすべてのローカルコミットを表示します
commit --amend
かrebase
一つが誤って外れHEADと協力して、孤立したが、言います。