힘내 분리 헤드를 수정?


1453

저장소에서 일부 작업을 수행 중이며 파일에 로컬 변경이 있음을 알았습니다. 더 이상 원하지 않기 때문에 파일을 삭제하고 새로운 사본을 체크 아웃 할 수 있다고 생각했습니다. 나는 Git과 동등한 것을하고 싶었다.

svn up .

사용 git pull이 작동하지 않는 것 같습니다. 일부 무작위 검색으로 누군가가 추천 한 사이트로 연결되었습니다.

git checkout HEAD^ src/

( src삭제 된 파일이 들어있는 디렉토리입니다).

이제 머리가 분리되어 있음을 알았습니다. 나는 그것이 무엇인지 전혀 모른다. 취소하려면 어떻게해야합니까?


69
git checkout master마스터 지점으로 돌아갑니다. 작업 사본 변경 사항을 지우려면을 원할 것입니다 git reset --hard.
Abe Voelker


당신이 커밋하지 않으면 당신은 할 수 있었다git checkout -- src/
thesummersign

이것을 시도하십시오 : link . 한마디로create temp branch - checkout temp branch - checkout master - delete temp branch
fidev

@AbeVoelker 댓글의 의미는 무엇입니까 working copy changes? 다른 커밋을 체크 아웃 한 후 파일에 대한 변경 사항 (즉, 분리 된 헤드 상태에서 변경 한 내용)을 참조하고 있습니까?
Minh Tran

답변:


2147

분리 된 헤드는 더 이상 지점에 있지 않다는 것을 의미합니다. 히스토리에서 단일 커밋 (이 경우 HEAD 이전의 커밋, 즉 HEAD ^)을 체크 아웃했습니다.

분리 된 HEAD와 관련된 변경 사항 을 삭제 하려는 경우

예를 들어 지점을 체크 아웃하면됩니다.

git checkout master

다음에 파일을 변경하고 색인에있는 상태로 복원하려면 먼저 파일을 삭제하지 마십시오.

git checkout -- path/to/foo

이것은 foo 파일을 인덱스에있는 상태로 복원합니다.

분리 된 HEAD와 관련된 변경 사항 을 유지하려면

  1. Run- git branch tmp이라고하면 새 지점에 변경 사항이 저장됩니다 tmp.
  2. 운영 git checkout master
  3. 변경 사항을 통합 하려면 지점 에서 master실행 git merge tmp하십시오 master. 당신은 master실행 후 지점 에 있어야합니다 git checkout master.

6
"이것은 파일 foo를 변경하기 전의 상태로 복원합니다." -> 인덱스 에있는 상태로 복원합니다 -편집하십시오
Mr_and_Mrs_D

88
이 오류가 처음 발생하는 이유는 무엇입니까? 이것은 내가 git를 싫어하는 것 중 하나입니다-때로는 완전히 임의의 행동입니다. Mercurial에는 그런 문제가 없었습니다.
Violet Giraffe

97
@VioletGiraffe 오류나 임의의 것이 아닙니다. 단순히 이전 커밋을 체크 아웃 할 때 리포지토리가 들어가는 상태입니다. "분리 된 헤드"는 해당 지점에서 작업을 수행하려는 경우 지점을 만들거나 지점을 가리킬 수도 있다는 경고 역할을합니다. 그러나 단순히 해당 태그를 보거나 커밋하려는 경우 분리 된 헤드 상태에있는 것은 아무 문제가 없습니다.
Neil Neyman

22
분리 된 헤드에 커밋 한 경우이 작업을 수행하지 마십시오. 다른 답변을 참조하십시오. 그렇다면Previous HEAD position was 7426948...
KCD

9
@VioletGiraffe : Mercurial을 기반으로하는 일에 대한 정신적 모델이 있지만 Git을 사용하고 있습니다. Git의 모델에 맞게 정신 모델을 조정하지 않으려는 경우 상황이 계속 무작위로 나타납니다. 마치 VR 고글을 착용 한 채 바깥을 돌아 다니는 것과 같으며 비행기를 타고 있다고 생각하지만 실제로 길을 건너고 있습니다. 당신은 차에 치일거야.
iconoclast

477

잃고 싶지 않은 파일을 변경했다면 밀어 넣을 수 있습니다. 분리 모드에서 커밋 한 후 나중에 임시 분기로 이동하여 나중에 마스터에 통합 할 수 있습니다.

git commit -m "....."
git branch my-temporary-work
git checkout master
git merge my-temporary-work

에서 추출 :

분리 된 헤드에서 커밋으로 수행 할 작업


27
나는 이것이 선호되는 해결책이라는 것을 알았습니다. 특히 개별 버전을 체크 아웃 할 때 변경 한 내용을 유지하려는 경우.
adswebwork

10
@adswebwork : 동의합니다. 다른 모든 답변은 이전 상태로 되돌리고 분리 된 헤드 상태에서 로컬로 변경 한 내용을 잃는 것이 좋습니다.
Sk8erPeter

6
왜 안돼 git stash? 그것이 내 마음에 오는 첫 번째 것입니다. 새로운 지점을 만드는 것은 과잉이 될 것입니다.
thesummersign

2
git rebase my-temporary-work분기를 삭제 한 다음 삭제할 수 git branch -d my-temporary-work있으므로 처음에 올바른 분기를 완수 한 것처럼 보입니다.
Zoltán

@geekay git stash는이 경우 완벽한 도구처럼 들립니다. 이를 달성하기 위해 제안 된 단계로 답변을 작성해 주시겠습니까?
Zoltán

156

임시 브랜치를 만들지 않는 솔루션.

이미이 모드에서 무언가를 변경하고 선택적으로 변경 사항을 저장하려는 경우 분리 된 HEAD 상태를 종료 ( "수정")하는 방법 :

  1. 유지하려는 변경 사항을 커밋하십시오. 분리 된 HEAD 상태에서 변경 한 내용을 인계하려면 커밋하십시오. 처럼:

    git commit -a -m "your commit message"
    
  2. 유지하고 싶지 않은 변경 사항은 폐기하십시오. 하드 리셋은 분리 된 HEAD 상태에서 수행 한 커밋되지 않은 변경 사항을 모두 버립니다.

    git reset --hard
    

    (이것이 없으면 3 단계는 실패하고 분리 된 HEAD에서 커밋되지 않은 수정 된 파일에 대해 불평합니다.)

  3. 지점을 확인하십시오. 예를 들어, 이전에 작업 한 브랜치를 확인하여 분리 된 HEAD 상태를 종료하십시오.

    git checkout master
    
  4. 커밋을 인계하십시오. 다른 질문에 대한 내 대답에 표시된 것처럼 체리 따기를 통해 분리 된 HEAD 상태에서 커밋을 인계 할 수 있습니다 .

    git reflog
    git cherry-pick <hash1> <hash2> <hash3> …
    

git reset --hard내가 업스트림 소스로 로컬 변경 제거해야 원하기 때문에 정확히 내가 필요 하였다.
Markus Zeller

큰 대답, 이것은 나를 위해 일했다
MGLondon

130

분리 헤드는 다음을 의미합니다.

  1. 더 이상 지점에 있지 않습니다.
  2. 기록에서 단일 커밋을 체크 아웃했습니다

변경 사항이없는 경우 다음 명령을 적용하여 마스터로 전환 할 수 있습니다

  git checkout master

유지하려는 변경 사항이있는 경우 :

HEAD가 분리 된 경우 명명 된 분기가 업데이트되지 않는다는 점을 제외하고는 정상적인 작업을 커밋합니다. 커밋 된 변경 사항으로 마스터 분기를 업데이트하려면 현재 분기를 임시 분기 (이 방법으로 분리 된 HEAD에서 커밋 된 모든 변경 사항을 갖게 됨)를 만든 다음 마스터 분기로 전환하고 임시 분기를 주인.

git branch  temp
git checkout master
git merge temp

2
완벽, 그리고 지점 온도 제거 후
Davi Menezes

64

내가 분리 된 머리에 있고 이미 약간의 변경을했다는 것을 알게 된 후에 방금 수행 한 작업이 있습니다.

변경 사항을 커밋했습니다.

$ git commit -m "..."
[detached HEAD 1fe56ad] ...

커밋의 해시 (1fe56ad)를 기억했습니다. 그런 다음 내가 있어야했던 지점을 확인했습니다.

$ git checkout master
Switched to branch 'master'

마지막으로 커밋 변경 사항을 지점에 적용했습니다.

$ git cherry-pick 1fe56ad
[master 0b05f1e] ...

나는 이것이 임시 지점을 만드는 것보다 조금 쉽다고 생각합니다.


2
이것이 답이되어야합니다. 너킹 된 파일을 다시 가져옵니다.
BlindWanderer

2
예,이 작업은 실제로 가장 간단한 작업입니다. 다음에 웹을 검색 할 때 기억하지 않아도됩니다. 커밋, 해시 메모, 커밋하려는 지점으로 돌아 가기 및 git cherry-pick <hash>.
메이슨

솔루션 주셔서 감사합니다. 도움이되었습니다. 또한 마스터와 오리진 / 마스터가 동일한 커밋을 가리 키도록 "git push origin master"를 수행해야한다고 덧붙일 수 있습니다.
turnip424

1
이것은 본질적으로 tanius의 답변입니다 (1 년 전 게시).
피터 Mortensen

이 기분 좋은 선택 덕분에 마지막 분리 헤드 변경을 되돌릴 수 있습니다
Omega Cube

54

약간의 변경을 수행 한 후 분리 된 헤드에 있음을 인식 한 경우 stash-> checkout master-> stash pop :

git stash
git checkout master   # Fix the detached head state
git stash pop         # Or for extra safety use 'stash apply' then later 
                      #   after fixing everything do 'stash drop'

아무 일도 일어나지 않은 것처럼 커밋되지 않은 변경 사항과 일반적인 "첨부 된"헤드가 있습니다.


2
이 나쁜 소년을 즐겨 찾기에 추가했습니다-임시 지점 만들기를 저장합니다. 치료를했다.
Tim Tyler

1
git 서브 모듈을 체크 아웃 한 다음 변경하여 HEAD 상태가 분리되는 경우가 종종 있습니다. 변경 사항을 보존 할 수 있도록 문제를 해결하는 가장 쉽고 쉬운 솔루션이라는 것을 알았습니다.
user5359531

1
분리 된 상태에서 변경 사항을 이미 커밋 한 경우 작동하지 않습니까?
Danijel

40

에서 특정 커밋을 체크 아웃하면 헤드 상태 git분리 됩니다. 즉, 작업 복사본에는 더 이상 "마스터"와 같은 명명 된 참조의 상태가 반영되지 않습니다. 리포지토리의 과거 상태를 검사하는 데 유용하지만 실제로 변경 사항을 되돌리려는 경우 원하는 것은 아닙니다.

특정 파일을 변경하고 단순히 파일을 삭제하려는 경우 다음 checkout과 같은 명령을 사용할 수 있습니다 .

git checkout myfile

커밋되지 않은 변경 사항은 버리고 현재 브랜치 헤드에있는 상태로 파일을 되돌립니다. 이미 커밋 한 변경 사항을 취소하려면 reset명령 을 사용하십시오 . 예를 들어, 이렇게하면 리포지토리가 이전 커밋 상태로 재설정되어 이후의 모든 변경 사항이 삭제됩니다.

git reset --hard HEAD^

그러나 다른 사람들과 저장소를 공유하는 경우 저장소 저장소 git reset의 일부가 지워지기 때문에 방해가 될 수 있습니다. 이미 다른 사람과 변경 사항을 공유 한 경우 일반적으로 git revert"반 커밋"을 생성하는 즉, 해당 변경 사항을 "취소"하는 새로운 커밋을 생성하는 대신 살펴보고자 합니다.

Git Book 에 자세한 내용이 있습니다.


1
@ralphtheninja의 답변에서 말했듯이 git checkout path/to/foo와 충돌 할 수 git checkout some-branch있으므로 git checkout -- path/to/foo이러한 충돌을 피하는 것이 좋습니다 .
Diego Lago

30

HEAD는 포인터에 있으며 결과적 으로 특정 커밋을 직접 또는 간접적으로 가리 킵니다 .

첨부   가 일부에 연결되어 있는지 HEAD 수단 지점 (그것은 즉 가리키는 지점에를).
분리 된 HEAD는 분기에 연결 되지 않았 음을 의미합니다 . 즉 일부 커밋을 직접 가리 킵니다 .

여기에 이미지 설명을 입력하십시오

다시 말해:

  • 커밋을 직접 가리키면 HEAD가 분리 됩니다.
  • 커밋을 간접적으로 가리키는 경우 (즉, 커밋 을 가리키는 분기를 가리키는 경우) HEAD가 첨부 됩니다.

HEAD가 부착 / 분리 된 상황을 더 잘 이해하기 위해 위 그림의 4 배로 이어지는 단계를 보여 드리겠습니다.

동일한 상태의 저장소로 시작합니다 (모든 사분면의 그림은 동일 함).

여기에 이미지 설명을 입력하십시오


이제 우리는 수행 할 git checkout- 개별 사진에 서로 다른 목표와 함께 (그들 위에 명령을 우리는 것을 강조하기 위해 흐리게하는 그 명령을 적용)

여기에 이미지 설명을 입력하십시오


이러한 명령 수행 한 후의 상황입니다 .

여기에 이미지 설명을 입력하십시오

보시다시피 HEAD 는 명령 의 대상 , 즉 분기 (사중의 첫 3 개 이미지) 또는 커밋 (사중의 마지막 이미지 )을 가리 킵니다 .git checkout

작업 디렉토리의 내용도 적절한 커밋 (스냅 샷)에 따라, 즉 커밋이 HEAD에 의해 (직접 또는 간접적으로) 커밋되도록 변경됩니다.


따라서 우리는 이제이 답변의 시작과 같은 상황에 있습니다.

여기에 이미지 설명을 입력하십시오


6
그것을 읽지 않았지만, 당신이 만든 예쁜 그림에 투표했습니다;).
Carlo Wood

@Carlo, 감사합니다!
MarianD

22

"분리 된 헤드 상태"는 임시 브랜치를 사용 git checkout -하므로 마지막에 사용 했던 마지막 브랜치를 사용하십시오.


1
분리 된 헤드 상태에있을 때 수행 한 커밋을 잃게됩니다.
Ajak6

@ Ajak6 당신은 그 커밋을 잃지 않습니다. 그것들은 여전히 ​​사용 가능 git reflog하며 새로운 지점 또는 git cherry-pick기존 지점 으로 가져갈 수 있습니다 . 이 질문을 참조하십시오 .
tanius

7

@Philippe Gerber의 대답을 더 명확히하기 위해 여기에 있습니다 :

자식 체리 픽

전에는 이 경우에 cherry-picka git checkout master가 필요합니다. 또한 commitin 만 필요합니다 detached head.


6

추가

반품하려는 지점이 마지막으로 체크 아웃 한 경우을 사용하면됩니다 checkout @{-1}. 그러면 이전 체크 아웃으로 돌아갑니다.

또한 예를 들어이 명령의 별명 을 지정하면 이전 체크 아웃으로 다시 전환 git global --config alias.prev하기 위해 입력 git prev하기 만하면 됩니다.



2

분리 된 헤드 상황에 있고 새 파일을 작성하는 경우 먼저 다음과 같이 새 파일이 색인에 추가되었는지 확인하십시오.

git add .

그러나 기존 파일 만 변경하거나 삭제 한 경우 다음을 통해 동시에 추가 (-a)하고 메시지 (-m)로 커밋 할 수 있습니다.

git commit -a -m "my adjustment message"

그런 다음 다음과 같이 현재 상태로 새 브랜치를 만들 수 있습니다.

git checkout -b new_branch_name

당신은 새로운 지점을 가지고 모든 조정은 그 새로운 지점에있을 것입니다. 그런 다음 원하는대로 리모컨으로 계속 푸시하거나 체크 아웃 / 풀 / 병합 할 수 있습니다.


1

힘내는 방법을 알려 주었다.

입력 한 경우 :

git checkout <some-commit_number>

상태 저장

git add .
git commit -m "some message"

그때:

 git push origin HEAD:<name-of-remote-branch>

1

변경 사항을 유지하고 싶었습니다.이 문제를 해결하면됩니다.

git add .
git commit -m "Title" -m "Description"
(so i have a commit now example: 123abc)
git checkout YOURCURRENTBRANCH
git merge 123abc
git push TOYOURCURRENTBRANCH

저를위한 일


1

일반적으로 HEAD지점을 가리 킵니다. 커밋 해시를 가리킬 때 분기를 가리 키지 않으면 69e51HEAD가 분리되었음을 의미합니다. 문제를 해결하려면 지점을 두 지점으로 지정해야합니다. 이를 해결하기 위해 두 가지 작업을 수행 할 수 있습니다.

  1. git checkout other_branch // 해당 커밋에 코드가 필요한 경우 불가능 hash
  2. 새 분기를 만들고 커밋 해시를 새로 만든 분기를 가리 킵니다.

HEAD는 분기를 가리켜 야하며 커밋 해시는 황금률이 ​​아닙니다.


이것이 내가이 오류가 발생한 이유입니다. 수정본을 체크 아웃 한 다음 지점을 체크 아웃하는 대신 현재 / 최신 수정본으로 다시 체크 아웃했습니다. 도와 주셔서 감사합니다.
Rahul Thakur

1

분리 된 헤드는 지점을 올바르게 체크 아웃하지 않았거나 단일 커밋을 체크 아웃했음을 의미합니다.

이러한 문제가 발생하면 먼저 변경 사항을 잃지 않도록 로컬 변경 사항을 숨기 십시오.

그 후 ... 명령을 사용하여 원하는 지점을 체크 아웃하십시오.

MyOriginalBranch 브랜치를 원한다고 가정 해 봅시다.

자식 체크 아웃 -b someName origin / MyOriginalBranch


1

아마했을 것입니다 git reset --hard origin/your-branch.

그냥 시도 git checkout your-branch


0
git pull origin master

나를 위해 일했다. 원격 및 지사 이름을 명시 적으로 지정하는 것입니다.


0

내 경우에는 실행 git status하고 작업 디렉토리에 추적되지 않은 파일이 몇 개 있다는 것을 알았습니다.

수행하고 싶은 리베이스를 실행하기 위해 (필요하지 않기 때문에) 방금 ​​청소해야했습니다.


0

이것은 나를 위해 작동합니다. 분리 된 헤드에 새 분기를 할당합니다.

자식 체크 아웃 new_branch_name detached_head_garbage_name


0

분리 된 HEAD는 현재 지점에 없음을 의미합니다. 현재 변경 사항을 유지하고 새 지점을 만들려면 다음과 같이하십시오.

git commit -m "your commit message"
git checkout -b new_branch

나중에이 새 분기를 다른 분기와 병합하려고 할 수 있습니다. git "dog" 명령 은 항상 도움이됩니다 :

git log --all --decorate --oneline --graph
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.