1. ホーム
  2. git

[解決済み] Git リポジトリがデタッチド HEAD 状態になったのはなぜですか?

2022-03-22 20:03:49

質問

私は今日、ヘッドが外れてしまいました。 ローカルに変更があるにもかかわらず、git push はすべて最新と表示します。

私の知る限りでは、ローカルリポからコミットしてプッシュしただけで、特別なことは何もしていません。

では、なぜ私は detached HEAD ?

解決方法は?

のいずれかの名前でないコミットをチェックアウトした場合、そのコミットには あなたの ブランチは、切り離された HEAD を取得します。ブランチの先端を表す SHA1 でも、切り離された HEAD が得られます。ローカルブランチのチェックアウトのみ 名前 はそのモードを回避します。

参照 デタッチドHEADでコミットする

HEAD を切り離すと、名前のついたブランチが更新されないことを除けば、コミットは通常どおり行われます。(これは匿名ブランチと考えることができます。)

例えば、最初に追跡せずに "リモートブランチ" をチェックアウトした場合、切り離された HEAD を持つことになる可能性があります。

参照 git: 頭を切り離さずにブランチを切り替える

意味するところ git checkout origin/main (または origin/master 昔は )になってしまう。

Note: switching to 'origin/main'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at a1b2c3d My commit message

そのため git checkout を使用するようになり、新しい git switch コマンドを使用します。

git switch を実行すると、リモートブランチにチェックアウト(切り替え)しようとすると、すぐに失敗してしまいます。

git switch origin/main
fatal: a branch is expected, got remote branch 'origin/main'


について補足すると git switch :

Git 2.23 (2019年8月) では、Git 2.23で使用されるようになった 紛らわしい git checkout コマンド は、もう

git switch は、ブランチをチェックアウトして、デタッチHEADを取得することもできます。

  • には、明示的な --detach オプション

コミットをチェックアウトするには HEAD~3 新しいブランチを作成せずに、一時的な検査や実験のために使用します。

git switch --detach HEAD~3
HEAD is now at 9fc9555312 Merge branch 'cc/shared-index-permbits'

  • 間違ってリモート追跡ブランチを切り離すことはできません。

ご覧ください。

C:\Users\vonc\arepo>git checkout origin/master
Note: switching to 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

対して、新しい git switch コマンドを使用します。

C:\Users\vonc\arepo>git switch origin/master
fatal: a branch is expected, got remote branch 'origin/master'

リモートブランチを追跡する新しいローカルブランチを作成したい場合。

git switch <branch> 

もし <branch> は見つからないが、ちょうど1つのリモートにトラッキングブランチが存在する(それを <remote> と同じものとして扱われます。

git switch -c <branch> --track <remote>/<branch>

もう間違えない!
もう不要なHEADを切り離す必要はありません