GitリポジトリがデタッチされたHEAD状態になったのはなぜですか?


387

私は今日、デタッチされたヘッドで終わった、で説明されているのと同じ問題:git pushは、ローカルの変更があってもすべてが最新であると言う

私の知る限り、私は通常のことを何もしなかったので、ローカルリポジトリからコミットしてプッシュしました。

それで私はどうやって終わりましたdetached HEADか?


18
リモートブランチをチェックアウトすることは、誤ってこれを行う最も一般的な方法のようです。別の一般的な方法はbranch-name@{n}、の前のn番目の位置をチェックアウトすることですbranch-name。しかし、何があっても、ある時点でがあったはずgit checkout <rev>です。それがベルを鳴らさないなら、おそらくあなたはウィルが言及したことをしたでしょう-しようとしgit checkout <file>、誤ってリビジョンを指定することに成功しました。
Cascabel

3
デタッチされたHEAD状態を元に戻すには、Gitデタッチされたヘッド修正するを参照してください

リベース中に競合が発生したとき、私のリポジトリはこの状態になりました。幸いにも、Gitは私が走ったときに何をすべきかを教えてくれましたgit statusall conflicts fixed: run "git rebase --continue"
Paul

2
またはのgit checkout remotes/origin/my-branch代わりに誤って入力した場合にも発生します。git checkout my-branchgit checkout origin/my-branch
AdamLibuša19年

@adam Libusa、ありがとう。git checkout remotes / origin / my-branchとgit checkout my-branchの違いは何ですか?同じではないですか。しかし、あなたが言ったことは私のために働いた。好奇心から求めています。
karunakar bhogyari

回答:


281

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

デタッチされたHEADでのコミットを参照しください

HEADがデタッチされると、コミットは通常のように機能しますが、名前付きブランチは更新されません。(これは匿名のブランチと考えることができます。)

代替テキスト

たとえば、最初に追跡しないで「リモートブランチ」をチェックアウトすると、デタッチされたHEADになる可能性があります。

git:ヘッドを切り離さずにブランチを切り替えるを参照してください


Git 2.23(2019年8月)では、混乱する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>が見つからないが<remote>、一致する名前を持つ1つのリモート(これを呼び出す)に追跡ブランチが存在する場合は、次と同等として扱います。

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

これ以上の間違いはありません!
不要なデタッチされたヘッドはもうありません!


12
分離ヘッド状態に入るもう1つの方法は、インタラクティブなリベースの最中で、コミットの1つを編集する場合です。Gitが編集のコミット時にユーザーをドロップすると、リベースが完了するまで、ヘッドが切り離された状態になります。

このビジュアルガイドには、この説明がありgit commit files creates a new commit containing the contents of the latest commit, plus a snapshot of files taken from the working directory. Additionally, files are copied to the stage.ます。「ファイルがステージにコピーされる」とはどういう意味ですか?ファイルがコミットされた、つまりステージがクリアされたと思いますか?
2013

16
実際、ブランチの先端にあるかどうかに関係なく、SHA1によるコミットをチェックアウトすると、デタッチされたHEADが取得されます。デタッチされたHEADを取得せずにチェックアウトできる唯一の種類は、ブランチ名です。たとえばmastered489上の図のgit checkout ed489でも、切り離されたHEADを提供しますが、提供しgit checkout masterません。
musiphil

8
"You can think of this as an anonymous branch":)私はアナロジーが好きです
Adrien Be


117

私はこれを偶然に再現しました:

  1. リモートブランチを一覧表示します

    git branch -r
          origin/Feature/f1234
          origin/master
    
  2. ローカルでチェックアウトしたいので、貼り付けをカットします。

    git checkout origin/Feature/f1234
    
  3. プレスト!切り離されたHEAD状態

    You are in 'detached HEAD' state. [...])
    

ソリューション#1:

origin/チェックアウトするときに、ブランチ仕様の前に含めないでください。

git checkout Feature/f1234

ソリューション#2:

-bリモートからローカルブランチを作成するパラメーターを追加する

git checkout -b origin/Feature/f1234 または

git checkout -b Feature/f1234 自動的に元に戻ります


14
これはほとんど素晴らしい答えですが、なぜあなたが分離した頭の状態になったのか説明できません。
グース

5
私は同意しますが、それは私が探していたソリューションを提供します。ありがとう!!
Kilmazing

この他の回答git checkout -b Feature/f1234<=> git branch Feature/f1234git checkout Feature/f1234
アームフット2017

1
デフォルトでは、それはあなたが与えるとき、起源に見えるorigin/branchnameため、それが見える origin/origin/branchname最初のものは、あなたが使用するリモート名であることを伝えるために-b、uがない場合は、作成anonymous切り離されるブランチを。同様に、別のリモートからチェックアウト-bする場合は、パラメーターに言及する必要があります。そうしないと、gitは新しいリモートからであることを知る方法がなく、を探しますorigin/remote/branchname
garg10may 2017

あなたは聖人です!
Harvey Lin

12

試す

git reflog 

これにより、HEADとブランチポインターが過去にどのように移動したかの履歴が得られます。

例:

88ea06b HEAD @ {0}:チェックアウト:DEVELOPMENTからremotes / origin / SomeNiceFeature e47bf80 HEAD @ {1}に移動:プルオリジンDEVELOPMENT:早送り

このリストの一番上は、DETACHED HEAD状態が発生する可能性がある理由の1つです...リモート追跡ブランチをチェックアウトしています。


7

これは、ファイルを再チェックアウトして構文を正しく取得しなかったために行った変更を元に戻そうとすると簡単に起こります。

あなたはの出力を見ることができますgit log-あなたは最後の成功したコミット以来ここにログの末尾を貼り付けることができ、私たちは皆あなたが何をしたか見ることができました。または、それをペーストビンにして、#gitfreenode IRCでうまく質問できます。


5

ブランチと同じ名前のタグがある場合に発生する可能性があります。

例:「release / 0.1」がタグ名の場合、

git checkout release/0.1

"release / 0.1"でデタッチされたHEADを生成します。release / 0.1がブランチ名であると期待する場合、混乱します。


1
はい。しかし、それをどのように修正しますか?どのようにブランチのチェックアウトを行いますか?
マーティン

5

Detached HEAD 現在チェックアウトされているのはローカルブランチではないことを意味します。

Detached HEAD状態になるいくつかのシナリオ:

  • リモートブランチをチェックアウトする場合は、次のように言ってくださいorigin/master。これは読み取り専用のブランチです。作成するときからこのように、コミットorigin/masterそれはなります浮動自由、すなわち任意の枝に接続されていません。

  • 特定のタグをチェックアウトするかコミットする場合。ここから新しいコミットを実行すると、再びフリーフローティングになります。つまり、どのブランチにも接続されません。ブランチがチェックアウトされると、新しいコミットは常に自動的に先端に配置されることに注意してください。

    戻って特定のコミットまたはタグをチェックアウトしてそこから作業を開始したい場合は、そのコミットを起点とする新しいブランチを作成し、によってそのブランチに切り替えることができますgit checkout -b new_branch_name。これによりDetached HEAD、コミットではなくブランチがチェックアウトされるため、状態が回避されます。


3

単純な偶然の方法はgit checkout head、タイプミスとしてを行うことですHEAD

これを試して:

git init
touch Readme.md
git add Readme.md
git commit
git checkout head

与える

Note: checking out 'head'.

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 performing another checkout.

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

  git checkout -b <new-branch-name>

HEAD is now at 9354043... Readme

longair.net/blog/2012/05/07/the-most-confusing-git-terminologyでも言及(「“ HEAD”と“ head”を探してください)
VonC

@VonC:そのリンクをありがとう。私はGitトレーニングを準備しており、なぜそれがときどき混乱するのかを指摘したいと思います。私はすでに多くの例(checkout -bチェックアウトのように見えますが、実際には分岐します)を持っていますが、別のリストは大歓迎です。
Thomas Weller 2017年

2

git detached head状態にするもう1つの方法は、リモートブランチへのコミットを試みることです。何かのようなもの:

git fetch
git checkout origin/foo
vi bar
git commit -a -m 'changed bar'

これを行うと、origin / fooをチェックアウトしようとすると、ヘッドが切り離された状態に戻ります。

解決策は、origin / fooを追跡する独自のローカルfooブランチを作成し、オプションでプッシュすることです。

これはおそらくあなたの元の問題とは何の関係もありませんが、このページは「git detached head」のグーグルヒットで高く、このシナリオはかなり文書化されていません。


この状況は、上記のOwenの答えが語っているようです-「origin / foo」を切り取って貼り付けると、gitはそれを「origin / origin / foo」と見なします。
mvanle

1

コミットgit checkout <commit-hash>またはリモートブランチにチェックアウトすると、HEADがデタッチされ、新しいコミットを作成しようとします。

ブランチやタグから到達できないコミットは、ガベージコレクションされ、30日後にリポジトリから削除されます。

これを解決する別の方法は、新しく作成されたコミットとチェックアウトのための新しいブランチを作成することです。 git checkout -b <branch-name> <commit-hash>

この記事では、デタッチされたHEAD状態に移行する方法について説明します。

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