「失われた」コミットを含むすべてのgitコミットのリストを取得する


139

私がこのようなグラフを持っているとしましょう:

A---B---C---D (master)
     \
      \-E---F (HEAD)

実行するとgit log --all --oneline、6つのコミットがすべて取得されます。

しかし、グラフが

A---B---C---D (master, HEAD)
     \
      \-E---F

EとFは表示されません。名前のないブランチ上のコミットを含め、すべてのコミットをgitに教えてもらえますか?

ありがとう

回答:


63

特に簡単ではありません-枝の先端へのポインタを失った場合、干し草の山から針を見つけるようなものです。参照されていないように見えるすべてのコミットを見つけることができます-これはあなたのために行います-が、あなたが再ベースしたブランチ上の古いコミットなどのgit fsck --unreachable後に捨てたコミットも含まれますgit commit --amend。したがって、これらすべてのコミットを確認します一度に大量の情報が流れてしまう可能性は非常に高いです。

つまり、気の利いたことを忘れないでください。もっと真剣に、reflogには、デフォルトで過去60日間に使用したすべてのコミットへの参照が保持されます。さらに重要なことは、それらはそれらのコミット何であるかについていくつかのコンテキストを提供します。


7
1:意図的で孤立したコミットの間に全く違いはありませんcommit --amendrebase一つが誤って外れHEADと協力して、孤立したが、言います。
Cascabel 2011年

3
確かに。おそらくその状況から回復する最も簡単な方法は、HEAD自体のreflogを確認することです。
araqnid 2011年

@Jefromi:git commit --amend行き止まり、失われたコミットなどを残しておくことなどについて、大きな指摘。私はいくつかのリベースやその他のことを行い、どのブランチからも到達できないいくつかのコミットに終わり、それらをリポジトリに残していくのは少し汚いと感じました。今、その考えはもはや不安を和らげるものではありません。:)
Emil Lundberg、2012年

2
@araqnid元のポスターと同じピクルスに入れました。reflogを見るというあなたの提案は、やるべきことでした。
Ignazio

7
私はこの回答に同意しますが、誰かが意図的または偶発的かどうかにgit fsck --unreachable関係なく孤立したものを含め、すべてのコミットを確認する必要がある場合は、それを 提供しません。試してみたところです。kenorbが答えたように、より良いアプローチはの--reflog選択肢です。これについて特に優れているのは、と組み合わせると、元の質問で示したような、解析しやすい視覚的なコンテキストが得られることです。例えば、試してみてくださいgit log--graphgit log --graph --all --oneline --reflog
イニゴ

111

試してください:

git log --reflog

これは、reflogs(git reflog)によって言及されたすべてのオブジェクトがコマンドラインにとしてリストされているふりをして、すべてのgitコミットをリストします<commit>


1
これは私が探していたものです---reflog引数の機能。
アノマリー2018年

3
ところで、gitkはgitk --reflogもサポートしています。
ald.li

50

この問題に取り組むときは、次のコマンドを使用します。

git reflog |  awk '{ print $1 }' | xargs gitk

これにより、ヘッドレスになった最近のコミットを視覚化できます。

これをと呼ばれるスクリプトヘルパーでラップしました~/bin/git-reflog-gitk


1
これは私に大きな時間を節約してくれました...ありがとうございます!
Bret Royster

これはすごい!ありがとうございました!ツリーの重要な部分を本当に視覚化します。
Mladen B.

ちょっとしたヒント:これはreflogレコードとしてローカルでのみ機能しますwhen the tips of branches and other references were updated in the *local repository*git log --reflogローカル以外の参照の変更に対してこれを実行したい場合は、使用することをお勧めします
クリシュナグプタ

29

私の命を救ったのは、次のコマンドです。

git reflog

そこでは、次のようにgitに対して行われた履歴コミットの画面が表示されます。

ここに画像の説明を入力してください

この時点で、必要なものを見つけ、HEAD@{X}一時的なブランチを作成して、次のようにそこに移動するだけです。

git checkout -b temp_branch HEAD@{X}

そうすれば、gitリポジトリをさらにリベースしたり壊したりせずに、コミットが失われた一時的なブランチができます。

お役に立てれば...


26

@Kieranの回答に似ていますが、コンソールの場合: git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')


最後の部分$(git reflog | awk '{print $ 1}')を含める必要がありますか?これは何をしますか?ソリューションを試した後、最後の部分がなくても同じ出力が生成されるようです。
wmock

ブランチポインターを移動して、参照なしのコミットを残すと(OPのように)、それらはに表示されなくなりgit log --allます。簡単な例:git reset --hard @^HEAD @ {0}のコミット後は、コミットはreflogにのみ存在します。git reflogサポートされていないため、視覚的な表現を取得する--graphためgit log --graphにコミットを渡す必要があります。
Florian Fida、2015

5
--reflog代わりに 使用できます$(git reflog | awk '{print $1}')
Sild

私はと比較git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')してgit log --oneline --all --graph --decorate --reflog、-reflogにWIPエントリなどの詳細が含まれていることを除いて、ほとんど同じです。
Script Wolf

@FlorianFidaの代わりに、reflogなぜ代わりに使用しlog --reflogないのですか?
Pacerier

9

この問題を解決するにはどうすればよいですか?使用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ヶ月で私に)


5

次の場所にあるreflogを確認して、コミットを回復できました。 .git/logs/HEAD

次に、ファイルの最後までスクロールしなければなりませんでしたが、失ったコミットを見つけました。


これは私が何かをめちゃくちゃにしたときにやったことです。マスターにコミットしようとしましたが、私がプッシュするとスタッシュがやられました。私は--hardをリセットし、それから私の間違いに気付きました。コミットはreflogにあったので、私はそれをチェックアウトし、それからブランチを作り、それをプッシュしました。結局すべてがうまくいった。
デビッド

5

我々はよgit log、時にはので、これを表示するために、すべてのコミットの詳細を得るためによくないです...

Macの場合:gitプロジェクトに入り、次のように入力します。

$ nano .git/logs/HEAD

その中のすべてのコミットを表示するには、または:

$ gedit .git/logs/HEAD

その中のすべてのコミットを表示するには、

その後、任意のブラウザで編集できます。


3

@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

多くのツールが、失われたコミットのグラフィカルな視覚化を示します。


2

Git Extensions GUIを使用している場合、[表示]-> [reflog参照の表示]をオンにすると、ダングリングコミットのグラフィカルな視覚化を表示できます。これは、他のすべての参照されているコミットと同様に、ツリー内のぶら下がりコミットを表示します。これにより、探しているものを簡単に見つけることができます。

デモについては、この画像を参照してください。画像のコミットC2、C3、C4、C5はぶら下がっていますが、まだ表示されています。


2
git log --reflog

助かりました!HEADのマージ中に迷子になり、自分のレイトコミットが見つからなかった!ソースツリーには表示されませんgit log --reflogが、以前のすべてのローカルコミットを表示します

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