web-dev-qa-db-ja.com

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

次のようなグラフがあるとしましょう。

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

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

しかし、グラフが

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

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

ありがとう

102
Amadan

特に簡単ではありません。ブランチの先端へのポインタを失った場合、それは干し草の山で針を見つけるようなものです。これ以上参照されていないように見えるすべてのコミットを見つけることができます-git fsck --unreachableはあなたのためにこれを行います--git commit --amendの後に捨てたコミットを含みます。したがって、これらのすべてのコミットを一度に見ることは、あまりにも多くの情報をたどることができません。

ですから、重要なことは、興味のあることを忘れないでください。もっと深刻なことは、reflogには、デフォルトで過去60日間ほど使用したすべてのコミットへの参照が保持されるということです。さらに重要なのは、これらのコミットの内容に関するコンテキストを提供することですare

49
araqnid

試してください:

git log --reflog

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

70
kenorb

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

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

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

これを~/bin/git-reflog-gitkというスクリプトヘルパーにまとめました。

45
Kieran

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

22
Florian Fida

この問題をどのように解決しますか? git fsckとロギングを使用してください!

最初に、失われた(到達不能な)コミットとBLOBを含むファイルを作成します。 (注:git gcのようなことをした場合、すべてのコミットがガベージコレクションされ、ここでそれらを見つけることができません!)

$git fsck --lost-found > lost_found.commits

これにより、次のようなファイルが作成されます。

ダングリングコミットdec2c5e72a81ef06963397a49c4b068540fc0dc3
ぶら下がりblob f8c2579e6cbfe022f08345fa7553feb08d60a975
ダングリングブロブ0eb3e86dc112332ceadf9bc826c49bd371acc194
ダングリングブロブ11cbd8eba79e01f4fd7f496b1750953146a09502
ダングリングコミット18733e44097d2c7a800650cea442febc5344f9b3
ぶら下がりblob 1e53a5cdb3ecdde27081ec6e8b31e4070106ee05

その後、お気に入りのテキストエディタでこのファイルを開いて、そこからコミット/ブログハッシュをコピーできます。 (* * vimマクロはこれに最適です* *)

これで、git log --oneline <commit hash>のようなものでこのコミットからログバックできます。または、gitk、tig、またはその他のgitビューアが動作するはずです。

あなたの場合、コミットFのハッシュが見つかった場合、ログには次のような内容が表示されます。

A---B---E---F

早くて簡単!これで、これらすべてのぶら下がりコミットの背後にあるコンテキストを見つけることができます。

追伸はい、私は遅い投稿を知っていますが、まあ、誰かがここでそれを見つけて、役に立つかもしれません。 (私がこれを再びグーグルするとき、ほとんどの場合6ヶ月で私に)

7
bsimmons

git logは、すべてのコミットの詳細を取得するのが適切でない場合があるため、これを表示するには...

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

$ nano .git/logs/HEAD

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

$ gedit .git/logs/HEAD

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

その後、お気に入りのブラウザで編集できます。

5
Vinod Joshi

.git/logs/HEADにあるreflogを見て、コミットを回復することができました。

それからファイルの最後までをスクロールダウンしなければならなかったので、失ったばかりのコミットを見つけました。

5
GameScripting

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

git reflog

そこで、次のようにgitに履歴コミットが行われた画面が見つかります。

enter image description here

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

git checkout -b temp_branch HEAD@{X}

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

お役に立てれば...

4
Sonhja

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

デモンストレーションについては this image をご覧ください。イメージ上のコミットC2、C3、C4、およびC5はぶら下がっていますが、表示されたままです。

2
Zdovc

しゅう

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
yakoda