내 Git 저장소가 분리 된 HEAD 상태에 들어간 이유는 무엇입니까?


387

나는 오늘 분리 된 머리로 끝났는데, 설명 된 것과 같은 문제가 있습니다 : git push는 로컬 변경 사항이 있어도 모든 것을 최신 상태로 말합니다.

내가 아는 한, 나는 평범하지 않은 일을하지 않았으며, 내 지역 저장소에서 커밋하고 밀어 넣습니다.

그래서 어떻게 끝났 detached HEAD습니까?


18
원격 브랜치를 체크 아웃하는 것은 실수로 이것을하는 가장 일반적인 방법 인 것 같습니다. 또 다른 일반적인 방법은 branch-name@{n}의 n 번째 이전 위치 를 확인하는 것 입니다 branch-name. 그러나 어쨌든 어느 시점에서 git checkout <rev>. 그것이 종을 울리지 않는다면 아마도 당신은 Will이 언급 한 것을했을 것입니다- git checkout <file>우연히 수정을 지정 하려고 노력했습니다 .
Cascabel

3
분리 된 HEAD 상태를 취소하려면 Git 분리 헤드 수정? .

저음은 rebasing 중에 충돌이 발생했을 때이 상태로 끝났습니다. 다행히도 Git은 내가 달릴 때해야 할 일을 말해주었습니다 git status.all conflicts fixed: run "git rebase --continue"
Paul

2
실수 git checkout remotes/origin/my-branchgit checkout my-branch또는 대신 입력 하는 경우에도 발생합니다 git checkout origin/my-branch.
Adam Libuša 12

@ 아담 Libusa, 그것은 나를 위해 일해 주셔서 감사합니다. git checkout remotes / origin / my-branch와 git checkout my-branch의 차이점은 무엇입니까? 동일하지 않습니다. 하지만 당신이 말한 것이 나를 위해 일했습니다. 호기심에서 나는 묻는다.
karunakar bhogyari

답변:


281

(A)의 모든 체크 아웃은 그 중 하나의 이름이 아닌 커밋 당신의 당신에게 분리 된 HEAD를 얻을 것이다 지점. 분기의 끝을 나타내는 SHA1은 여전히 ​​분리 된 HEAD를 제공합니다. 로컬 지점 이름 의 체크 아웃 만 해당 모드를 피합니다.

분리 된 HEAD로 커밋 참조

HEAD가 분리되면 이름 지정된 분기가 업데이트되지 않는다는 점을 제외하고는 커밋이 정상적으로 작동합니다. (이것을 익명 브랜치로 생각할 수 있습니다.)

대체 텍스트

예를 들어, "원격 지점"을 먼저 추적하지 않고 체크 아웃하면 HEAD가 분리 될 수 있습니다.

git : 헤드 분리없이 분기 스위치 참조


Git 2.23 (2019 년 8 월)을 사용하면 더 이상 혼란스러운 git checkout명령 을 사용할 필요가 없습니다 .

git switch 또한 다음을 제외하고 지점을 체크 아웃하고 분리 헤드를 얻을 수 있습니다.

  • 명시적인 --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>상당으로 일치하는 이름, 치료와 함께)

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

더 이상 실수가 없습니다!
더 이상 원치 않는 분리 된 헤드!


12
분리 된 헤드 상태로 들어갈 수있는 또 다른 방법은 대화식 리베이스의 중간에 있고 커밋 중 하나를 편집하려는 경우입니다. 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."파일이 스테이지로 복사된다"는 것은 무엇을 의미합니까? 파일이 커밋되었다고 생각했는데 스테이지가 지워졌습니까?
최대

16
실제로, 당신은 SHA1에 의해 커밋을 체크 아웃 할 때마다 브랜치의 끝에 있든 없든 분리 된 HEAD를 얻게됩니다 . HEAD가 분리되지 않고 체크 아웃 할 수있는 유일한 것은 분기 이름입니다. 예를 들어, 비록 master에 있습니다 ed489위의 그림에 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/f1234및을 보았습니다 git checkout Feature/f1234.
Armfoot

1
기본적으로 그래서 당신은 줄 때, 기원에 보이는 origin/branchname들어 보이는 origin/origin/branchname첫 번째는 당신이 사용하는 원격 이름임을 말해 -b, 유하지 않는 경우가 생성 anonymous분리되는 지점. 마찬가지로 다른 리모콘에서 체크 아웃하려면 -b매개 변수 를 언급해야합니다. 그렇지 않으면 git은 새 리모콘에서 온 것을 알 수있는 방법이 없습니다 origin/remote/branchname.
garg10may

당신은 성자입니다!
Harvey Lin

12

시험

git reflog 

이것은 당신에게 HEAD와 브랜치 포인터가 과거에 어떻게 이동했는지에 대한 이력을 제공합니다.

예 :

88ea06b HEAD @ {0} : 체크 아웃 : DEVELOPMENT에서 리모트 / 원점 / SomeNiceFeature e47bf80 HEAD @ {1} (으)로 이동 : 원점 풀기 DEVELOPMENT : 빨리 감기

이 목록의 맨 위에는 DETACHED HEAD 상태가 발생할 수있는 이유 중 하나가 있습니다. 원격 추적 분기를 확인합니다.


7

파일을 다시 체크 아웃하고 구문을 제대로 얻지 않아 변경 사항을 취소하려고하면 쉽게 발생할 수 있습니다.

당신은 출력 결과를 볼 수 있습니다 git log-마지막 커밋 이후 로그의 꼬리를 여기에 붙여 넣을 수 있으며 우리는 모두 당신이 한 일을 볼 수 있습니다. 또는 그것을 붙여 넣을 수 #git있고 freenode IRC에 멋지게 요청할 수 있습니다.


5

지점과 이름이 같은 태그가있는 경우 발생할 수 있습니다.

예 : "release / 0.1"이 태그 이름 인 경우

git checkout release/0.1

"release / 0.1"에서 분리 된 HEAD를 생성합니다. release / 0.1이 브랜치 이름이 될 것으로 예상되면 혼란스러워합니다.


1
예. 하지만 어떻게 고쳐? 지점의 결제는 어떻게합니까?
Martin

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


@VonC : 해당 링크에 감사드립니다. 나는 힘내 훈련을 준비하고 있으며 때로는 왜 그렇게 혼란 스러운지 지적하고 싶다. 나는 이미 많은 예제를 가지고 checkout -b있지만 (예를 들어 체크 아웃처럼 보이지만 실제로는 가지가 있습니다) 다른 목록은 환영합니다.
Thomas Weller

2

자식 분리 헤드 상태를 얻는 다른 방법은 원격 브랜치를 커밋하는 것입니다. 다음과 같은 것 :

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

이 작업을 수행하면 origin / foo를 더 이상 체크 아웃하려고하면 분리 된 헤드 상태로 돌아갑니다.

해결책은 origin / foo를 추적하는 자체 로컬 foo 분기를 만든 다음 선택적으로 푸시하는 것입니다.

이것은 아마도 원래 문제와 관련이 없지만이 페이지는 "git detached head"에 대한 Google 조회수에서 높으며이 시나리오는 문서화가 심각하지 않습니다.


이 상황은 위에서 언급 한 "origin / foo"를 잘라 내고 붙여 넣는 것이 "origin / origin / foo"라고 생각하는 Owen의 답변입니다.
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.