今日、私は自分のプロジェクトの 1 つに取り組んでいて、git の奇妙な点に気付きました。Git を使用すると、作業をゴースト ブランチにコミットできます。ゴースト ブランチという用語を使用するのは、変更がツリーのどこかに存在するが回避するためgit log --graph --decorate --oneline --all
です。誰かが私にこれがなぜなのか説明できますか?
この動作を再現する手順
頭が切り離された状態に入る( を実行すると、そこに入ることができますgit checkout <hash>
)。
# Not currently on any branch.
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# uml 1.pdf
コードベースにいくつかの変更を加えます。を使用して、作業ディレクトリのステータスを確認しますgit status
。これにより、変更がリストされますが、どのブランチにもいないことが示されます。
# Not currently on any branch.
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: .gitignore
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# uml 1.pdf
を使用して変更をコミットしますgit commit -am '<message>'
[detached HEAD ded7725] updated .gitignore
1 files changed, 8 insertions(+), 1 deletions(-)
次に、たとえば「マスター」などの既知のブランチをチェックアウトすると、切り離されたヘッド状態でコミットされたすべての変更が失われます。これは予期されることです。
Runnigは、デタッチされたヘッドでコミットされたものを除くgit log --graph --decorate --oneline --all
すべてのコミットを表示します(私の場合)。ded7725
ただし、agit checkout <hash-for-ghost-branch>
はゴースト ブランチにコミットされた変更を返します。問題は、このハッシュを永遠に覚えていられないことです。
予想される動作は、このゴースト ブランチがグラフのログ上でややぶら下がっているリーフになることです。しかし、それは存在しません。なぜこれが起こるのかについての説明をいただければ幸いです。または、非表示のブランチを表示するフラグを見逃している可能性があります...