免責事項:この質問は純粋に情報提供であり、私が経験している実際の問題を表すものではありません。私はそれのために何かを理解しようとしているだけです(私は何かを理解するのが大好きで、あなたもそうしていることを知っているからです)。
だから私はgitで遊んでいて、修正されたコミットを期限切れにしようとしていました。私のreflogは次のようになります。
4eea1cd HEAD@{0}: commit (amend): amend commit
ff576c1 HEAD@{1}: commit: test: bar
5a1e68a HEAD@{2}: commit: test: foo
da8534a HEAD@{3}: commit (initial): initial commit
つまり、2つのコミット(da8534aと5a1e68a)を作成し、次に3番目のコミットを。ff576c1で修正しまし4eea1cdた。
予想通り、私のgit log見た目は次のようになります。
* 4eea1cd (HEAD, master) amend commit
* 5a1e68a test: foo
* da8534a initial commit
私が(私は)コミットの有効期限について知っていることから、いつか(ほとんどの場合、デフォルトで30日以内に)git gc収集する必要がありff576c1ます。今、私はそれが起こるのを見るのに30日待ちたくないので、最初にいくつかのコマンドを実行し始めます:
git fsck --unreachable --no-reflogs
これは、再び予想されるように、私に与えます:
unreachable blob 5716ca5987cbf97d6bb54920bea6adde242d87e6
unreachable tree 1e60e555e3500075d00085e4c1720030e077b6c8
unreachable commit ff576c1b4b6df57ba1c20afabd718c93dacf2fc6
ff576c1私がその貧しい孤独なコミットを期限切れにするだろうとすべての自信を持って、私はそれから実行しますgit reflog expire:
git reflog expire --dry-run --expire-unreachable=now --all
その時、私に与えます:
would prune commit: test: bar
would prune commit (amend): amend commit
最初HEADは参照していませんでしたが、前に示しmasterた出力からわかるgit logように、実際には参照しています。また、それをcat .git/HEAD確認します(yelding ref: refs/heads/master)。とにかく、それでもばかげていたのですが4eea1cd、私のmaster支部長です。
ですから、ここで私は、これら2つのコマンドが同じコミットを与えないことをすべて混乱させており、それが私のブランチ4eea1cdの実際の先端であるため、どうして地獄に到達できない可能性があるのか疑問に思っています。master
何が起こっているのかについて何か考えはありますか?
編集--rewrite:オプションをに追加するとgit reflog expire、次のようになります。
git reflog expire --dry-run --expire-unreachable=now --all --rewrite
次に、修正されたコミットのみを取得します。
would prune commit: test: bar
によると、私はまだ理解していませんgit help reflog:
--rewrite
While expiring or deleting, adjust each reflog entry to ensure that
the old sha1 field points to the new sha1 field of the previous
entry.
私の場合、これは意味がありません。明らかにそれは何かを変えるので、少なくとも私はそれを理解していません。