분리 된 HEAD를 마스터 / 원점과 어떻게 조정할 수 있습니까?


1558

Git의 분기 복잡성에 익숙하지 않습니다. 나는 항상 단일 브랜치에서 작업하고 변경 사항을 커밋 한 다음 주기적으로 원격 원점으로 푸시합니다.

최근 어딘가에, 커밋 준비를 끝내기 위해 일부 파일을 재설정하고 나중에 rebase -i최근 로컬 커밋을 제거하기 위해 a 를 수행했습니다 . 나는 지금 잘 이해하지 못하는 상태에 있습니다.

내 작업 영역에서 git log내가 기대하는 것을 정확하게 보여줍니다. 나는 가고 싶지 않은 커밋과 새로운 커밋 등 올바른 기차를 타고 있습니다.

그러나 방금 원격 저장소로 푸시했으며 다른 점이 있습니다. 리베이스에서 죽인 커밋이 푸시되었고 로컬로 커밋 된 새 커밋이 없습니다.

"마스터 / 원본"이 HEAD와 분리되어 있다고 생각하지만 그 의미, 명령 줄 도구로 시각화하는 방법 및 수정 방법에 대해 100 % 명확하지 않습니다.


리베이스 전에 커밋을 푸시 했습니까?
manojlds

@manojlds : 무슨 뜻인지 잘 모르겠습니다. 나는 리베이스 전에 약간의 시간을 보냈지 만, 바로 전은 아니었다.
Ben Zotto

이전과 마찬가지로 rebase -i.에서 제거한 커밋을 푸시 했으므로 대답에서 나는 그렇지 않습니다.
manojlds

@manojlds : 맞습니다. 가장 최근의 푸시보다 더 최근의 커밋 만 죽였습니다. (내가 언급했지만, 모든 것이 정상이라고 생각한 이후로 계속 추진했습니다.)
Ben Zotto

당신이 한 일을 I did a reset of some files to get them out of commit staging부분적으로 설명 할 수 있습니까 ? 질문 죄송합니다 :)
manojlds

답변:


2521

먼저 HEAD가 무엇인지 명확히하자 무엇인지, 분리되었을 때의 의미를 .

HEAD는 현재 체크 아웃 된 커밋의 심볼 이름입니다. HEAD가 분리되지 않은 경우 ( "정상" 1 상황 : 분기가 체크 아웃 된 경우) HEAD는 실제로 분기의 "ref"를 가리키고 분기는 커밋을 가리 킵니다. 따라서 HEAD는 지점에 "연결"됩니다. 새 커밋을 만들면 HEAD가 가리키는 분기가 새 커밋을 가리 키도록 업데이트됩니다. HEAD는 지점을 가리 키기 때문에 자동으로 수행됩니다.

  • git symbolic-ref HEAD 수확량 refs/heads/master
    "마스터"라는 지점이 체크 아웃되었습니다.
  • git rev-parse refs/heads/master 수율 17a02998078923f2d62811326d130de991d1a95a
    커밋은 마스터 브랜치의 현재 팁 또는 "헤드"입니다.
  • git rev-parse HEAD또한 수율 17a02998078923f2d62811326d130de991d1a95a
    이것은 "심볼 심판"이라는 의미입니다. 다른 참조를 통해 객체를 가리 킵니다.
    (심볼 ref는 원래 심볼릭 링크로 구현되었지만 나중에 심 링크가없는 플랫폼에서 사용할 수 있도록 추가 해석을 통해 일반 파일로 변경되었습니다.)

우리는이 HEADrefs/heads/master17a02998078923f2d62811326d130de991d1a95a

HEAD가 분리되면 분기를 통해 간접적으로 가리키는 대신 커밋을 직접 가리 킵니다. 분리 된 HEAD를 명명되지 않은 분기에있는 것으로 생각할 수 있습니다.

  • git symbolic-ref HEAD 실패 fatal: ref HEAD is not a symbolic ref
  • git rev-parse HEADyields 17a02998078923f2d62811326d130de991d1a95a
    상징적 인 참조가 아니기 때문에 커밋 자체를 직접 가리켜 야합니다.

우리는 HEAD17a02998078923f2d62811326d130de991d1a95a

분리 된 HEAD로 기억해야 할 중요한 점은 커밋이 참조되지 않은 경우 (참조가 도달 할 수없는 경우) 다른 커밋을 체크 아웃 할 때 "매달리게"됩니다. 결국, 이러한 댕글 링 커밋은 가비지 수집 프로세스를 통해 정리됩니다 (기본적으로 2 주 이상 유지되며 HEAD의 reflog에서 참조하여 더 오래 유지 될 수 있음).

1 HEAD가 분리 된 상태에서 "정상적인"작업을하는 것은 완벽합니다. 리플 로그에서 기록을 삭제하지 않기 위해하는 일을 추적해야합니다.


인터랙티브 리베이스의 중간 단계는 분리 된 HEAD (부분적으로 활성 브랜치 reflog의 오염을 피하기 위해)로 수행됩니다. 전체 리베이스 작업을 마치면 리베이스 작업의 누적 결과로 원래 분기를 업데이트하고 HEAD를 원래 분기에 다시 연결합니다. 제 생각에는 리베이스 프로세스를 완전히 완료 한 적이 없습니다. 그러면 rebase 작업으로 가장 최근에 처리 된 커밋을 가리키는 분리 된 HEAD가 남게됩니다.

상황을 복구하려면 분리 된 HEAD가 현재 가리키는 커밋을 가리키는 분기를 작성해야합니다.

git branch temp
git checkout temp

(이 두 명령은로 축약 될 수 있습니다 git checkout -b temp)

그러면 HEAD가 새 temp분기에 다시 연결됩니다 .

다음으로, 현재 커밋 (및 히스토리)과 정상 작동하는 분기를 비교해야합니다.

git log --graph --decorate --pretty=oneline --abbrev-commit master origin/master temp
git diff master temp
git diff origin/master temp

(아마도 로그 옵션을 시험 해보고 싶을 것입니다 : add -p, --pretty=…전체 로그 메시지를 보려면 떠나십시오 .)

temp지점이 좋아 보인다면이 master를 가리 키도록 업데이트 (예 :) 할 수 있습니다.

git branch -f master temp
git checkout master

(이 두 명령은로 축약 될 수 있습니다 git checkout -B master temp)

그런 다음 임시 분기를 삭제할 수 있습니다.

git branch -d temp

마지막으로, 당신은 아마 다시 설립 된 역사를 추진하고 싶을 것입니다 :

git push origin master

--force원격 브랜치를 새 커밋으로 "빨리 전달"할 수없는 경우 (예 : 기존 커밋을 삭제하거나 다시 쓰거나, 약간의 히스토리를 다시 쓰지 못함) 푸시하려면이 명령의 끝에 추가해야 할 수도 있습니다.

리베이스 작업 도중에 있다면 정리해야합니다. 디렉토리를 찾아 리베이스가 진행 중인지 확인할 수 있습니다 .git/rebase-merge/. 해당 디렉토리를 삭제하여 진행중인 리베이스를 수동으로 정리할 수 있습니다 (예 : 활성 리베이스 작업의 목적과 컨텍스트를 더 이상 기억하지 않는 경우). 일반적으로을 사용 git rebase --abort하지만 피할 수있는 추가 재설정을 수행합니다 (HEAD를 원래 분기로 다시 이동하고 원래 커밋으로 다시 설정하여 위에서 수행 한 작업 중 일부를 취소합니다).


6
흥미로운 점 man git-symbolic-ref: "과거에는 .git/HEAD을 가리키는 심볼릭 링크가있었습니다 refs/heads/master. 다른 브랜치로 전환하고 ln -sf refs/heads/newbranch .git/HEAD싶었을 때, 어떤 브랜치가 있는지 알아보고 싶었을 때도 그렇습니다 readlink .git/HEAD. 그러나 심볼릭 링크는 완전히 이식 가능하지 않습니다. "이제 더 이상 사용되지 않으며 위에서 설명한대로 기호 참조가 기본적으로 사용됩니다."
Dmitry Minkovsky

10
@AntonioSesto에 동의합니다. 대부분의 프로젝트 (아주 상당히 큰 프로젝트)의 경우 Git과 같은 복잡한 복잡성이 필요하지 않습니다. 내 뇌는 너무 과도하게 조작 된 무언가를 가지고 다투고 있습니다. 필요없고 원하지 않습니다.
재스퍼 Sprengers

36
이것은 좋은 대답이지만 임시 지점은 필요하지 않다고 생각합니다 (일반적으로 내 자신을 사용하지만). git branch -f master HEAD && git checkout master목표는 현재의 머리를 유지하면서 그것을 지정하는 것이라고 가정하면 충분합니다 master. 다른 목표도 의미가 있으며 다른 요리법을 요구하십시오.
Adrian Ratnapala

38
길이에 대해 언급하는 의견에 Lol. 우리의 나머지는 단순히 "당신의 상황에서 회복하기 위해 ..."라고 쓰여진 줄에 도달 할 때까지 간단히 스캔하고 거기에서 가십시오 – 우리가 읽을 수있는 유용한 잘 설명 된 뒷이야기가 있다는 정신적 인 메모를하면서 비오는 날에. 옵션은 당신을 다치게하지 않습니다 더 읽을 수 있지만 않습니다 혜택 다른 사람에 서있다.
underscore_d

5
이것이 내가 자식을 싫어하는 이유입니다.
모니카 Heddneck

626

그냥 이렇게 :

git checkout master

또는 유지하려는 변경 사항이있는 경우 다음을 수행하십시오.

git checkout -b temp
git checkout -B master temp

57
이것은 위험한 반응입니다. 이 답변에 도착한 사람들은 상태가 다르며 "해결하기 위해이 작업을 수행하십시오"라는 답변은 질문에 답변하지 않습니다. 이것은 쉽게 일을 파괴 할 수 있습니다.
Archonic

15
! "git checkout master"는 분리 된 헤드가 마스터의 일부가 아닌 경우 모든 변경 사항을 잃게됩니다!
Tony

3
@Blauhirn 아마도 커밋이 아닌 지점을 체크 아웃했을 것입니다. 브랜치는 여전히 동일한 커밋을 가리 키지 만 다른 '모드'에 있습니다.
Daniel Alexiuc 2016 년

1
git reset"무엇을하고 있는지 모른다면 중지하십시오"라는 경고 메시지가 나타납니다. 지난 1 주일 동안 잃어버린 테러 사고에서 회복되었습니다. 감사!
Opus1217

1
@Archonic에 동의 맹목적으로 명령을 실행하기 전에 git의 작동 방식을 이해하는 것이 중요합니다. 큰 답을 읽지 않으면 시간을 절약 할 수 있지만 작업이 손실되면 시간을 더 많이 잃을 수 있습니다.
Yusufali2205

132

나는이 문제에 부딪 쳤고 가장 인기있는 답변을 읽을 때 :

HEAD는 현재 체크 아웃 된 커밋의 심볼 이름입니다.

나는 생각했다 : 아하! 경우 HEAD기호 이름이 저지를 체크 아웃 currenlty을 위해, 나는에 대해 그것을 조정할 수 있습니다 master에 대해 그것을 리베이스로 master:

git rebase HEAD master

이 명령은

  1. 체크 아웃 master
  2. 식별의 부모 커밋 HEAD시점에 다시 HEAD에서 분기master
  3. 그 커밋을 재생합니다 master

결과적으로 모든 커밋 은 다음에 포함 HEAD되지 않은 결과입니다 . 체크 아웃 된 상태로 유지됩니다.mastermastermaster


리모컨에 관하여 :

리베이스에서 내가 죽인 커밋 몇 개가 밀려 났고 로컬에 커밋 된 새로운 커밋이 없습니다.

더 이상 로컬 히스토리를 사용하여 원격 히스토리를 전달할 수 없습니다. git push -f원격 기록을 덮어 쓰려면 강제 푸시 ( )해야합니다. 공동 작업자가있는 경우 일반적으로 모든 사람이 같은 페이지에 있도록이를 조정하는 것이 좋습니다.

masterremote로 푸시 하면와 같은 커밋을 가리 키도록 origin원격 추적 분기 origin/master가 업데이트됩니다 master.


3
git : "먼저, 머리를 되 감아 서 그 위에 작업을 되풀이합니다 ... 빨리 감은 마스터가 HEAD로." 나 : "좋은!"
Benjamin

81

분리 된 헤드에 대한 기본 설명은 여기를 참조하십시오.

http://git-scm.com/docs/git-checkout

그것을 시각화하는 명령 줄 :

git branch

또는

git branch -a

다음과 같이 출력됩니다.

* (no branch)
master
branch1

* (no branch)당신이 분리 된 머리에 있는 쇼.

git checkout somecommit등 을 수행하여이 상태에 도달했을 수 있으며 다음과 같이 경고했을 것입니다.

'분리 된 HEAD'상태입니다. 둘러보고 실험적으로 변경하고 커밋 할 수 있으며 다른 체크 아웃을 수행하여 분기에 영향을주지 않고이 상태에서 커밋을 버릴 수 있습니다.

생성 한 커밋을 유지하기 위해 새 브랜치를 만들려면 checkout 명령과 함께 -b를 다시 사용하여 지금 만들거나 나중에 할 수 있습니다. 예:

자식 체크 아웃 -b new_branch_name

이제 마스터로 가져 오려면

DO가 git reflog도 단지 또는 git log당신의 커밋을 확인합니다. 지금 git checkout master그리고 git merge커밋.

git merge HEAD@{1}

편집하다:

추가하려면 git rebase -i필요하지 않은 커밋을 삭제 / 죽일뿐만 아니라 편집에도 사용하십시오. 커밋 목록에서 "편집"을 언급하면 ​​커밋을 수정 한 다음 a git rebase --continue를 발행 할 수 있습니다. 이렇게하면 분리 된 HEAD에 들어오지 않았을 것입니다.


세부 사항과 훌륭한 정보 포인터에 감사드립니다. 명시적인 병합이 필요하지 않은 것 같지만이 개념으로 다시 돌아가겠습니다. 감사.
벤 조토

6
"@ {1}"의 기능은 무엇입니까?
ebi

35

분리 된 커밋을 자체 브랜치에 가져 오기

간단히 실행 git checkout -b mynewbranch .

그런 다음를 실행 git log하면 커밋이 이제이 HEAD새 분기에 있음을 알 수 있습니다.


내가 이렇게 mynewbranch하면 아무것도 붙어 있지 않습니까?
Benjohn

1
예, 분리 된 헤드가 부착 된 위치에 부착됩니다. 정확히 내가 원하는 것입니다. 감사!
Benjohn

22

마스터 브랜치를 가지고 있고 "개발"으로 돌아가거나 기능을 원한다면 다음과 같이하십시오.

git checkout origin/develop

참고 : origin / develop 확인하십시오 .

HEAD 상태 가 분리 되었습니다 . 주변을 둘러보고 실험적으로 변경하고 커밋 할 수 있으며 다른 체크 아웃을 수행하여 분기에 영향을 미치지 않고이 상태에서 커밋을 버릴 수 있습니다 ...

그때

git checkout -b develop

효과가있다 :)


7
나를 위해 일한 것은 'git checkout origin / develop'가 아니라 'git checkout develop'입니다. '원산지 / 개발'을 사용하면 항상 변경 사항이 없으므로 "원산지 / 개발시 HEAD 분리"가 유지됩니다. '원점'부분을 건너 뛰면 모든 것이 해결되었습니다.
DrStrangepork

18

현재 분리 된 HEAD를 푸시하려면 ( git log이전에 확인 ) 다음을 시도하십시오.

git push origin HEAD:master

분리 된 HEAD를 원점에서 마스터 브랜치로 보냅니다. 푸시가 거부되면 git pull origin master먼저 변경 사항을 원점에서 가져 오십시오. 의도적 인 리베이스를 수행하고 원산지 / 마스터를 현재 분리 된 브랜치로 바꾸려고했기 때문에 원산지 변경 사항에 신경 쓰지 않고 거부 된 경우 강제로 할 수 있습니다 ( -f). 이전 커밋에 대한 액세스 권한을 잃어버린 경우 언제든지 git reflog모든 분기의 히스토리를 볼 수 있습니다 .


변경 사항을 유지하면서 마스터 브랜치로 돌아가려면 다음 명령을 시도하십시오.

git rebase HEAD master
git checkout master

참조 : 힘내 "아니 현재 어느 지점에." 변경 사항을 유지하면서 지점으로 돌아갈 수있는 쉬운 방법이 있습니까?


2
이것은 실제로 분리 된 커밋을 출발지 / 마스터에게 보낸다. 헤드를 로컬 브랜치에 부착하려면 다음과 같이하십시오 : stackoverflow.com/a/17667057/776345
Paschalis

이 작업을 수행하면이 저장소가 Git LFS 용으로 구성되었지만 경로에서 'git-lfs'를 찾을 수 없습니다. 더 이상 Git LFS를 사용하지 않으려면 .git / hooks / post-checkout을 삭제하여이 후크를 제거하십시오.
user2568374

16

검색 할 때이 질문을 찾았습니다 You are in 'detached HEAD' state.

내가 과거에했던 것과 비교하여 내가 여기에했던 것을 분석 한 후, 내가 실수 한 것을 발견했다.

내 정상적인 흐름은 다음과 같습니다

git checkout master
git fetch
git checkout my-cool-branch
git pull

이번에는 내가했다 :

git checkout master
git fetch
git checkout origin/my-cool-branch
# You are in 'detached HEAD' state.

문제는 내가 실수로했다는 것입니다.

git checkout origin/my-cool-branch

오히려 :

git checkout my-cool-branch

(내 상황에서) 수정은 단순히 위의 명령을 실행 한 다음 흐름을 계속하는 것입니다.

git checkout my-cool-branch
git pull

11

다음은 나를 위해 일했습니다 (분기 마스터 만 사용).

git push origin HEAD:master
git checkout master        
git pull

첫 번째는 분리 된 HEAD를 원격 원점으로 푸시합니다.

두 번째는 지점 마스터로 이동합니다.

세 번째는 분기 마스터에 연결된 HEAD를 복구합니다.

푸시가 거부되면 첫 번째 명령에서 문제가 발생할 수 있습니다. 그러나 이것은 더 이상 헤드 분리 문제가되지 않지만 분리 된 HEAD가 일부 원격 변경을 인식하지 못한다는 사실에 관한 것입니다.


작동하지 않습니다.이 저장소는 Git LFS 용으로 구성되었지만 경로에 'git-lfs'가 없습니다. 더 이상 Git LFS를 사용하지 않으려면 .git / hooks / pre-push를 삭제하여이 후크를 제거하십시오. 그리고 당신은 현재 지점에 없습니다. 병합하려는 지점을 지정하십시오.
user2568374

11

나는 오늘이 문제에 부딪 쳤고 다음을 수행하여 해결했다고 확신합니다.

git branch temp
git checkout master
git merge temp

이 작업을 수행하는 방법을 알아낼 때 회사 컴퓨터에 있었는데 이제는 개인용 컴퓨터에서 동일한 문제가 발생합니다. 월요일에 업무용 컴퓨터로 돌아와서 정확히 어떻게했는지 확인하려면 월요일까지 기다려야합니다.


@StarShine Kenorb가 수정했습니다. 이제 분리 된 커밋을 새 분기에 저장하고 temp를 마스터로 전환하고 temp를 마스터에 병합합니다.
Cees Timmerman 2016 년

ppl이 이것을 왜 다운 다운하는지 모르겠지만 문제 통계가 수정되었지만 delete temp branch 명령을 포함시킬 수 있습니다.
GlassGhost

8

HEAD가 양호한 상태라고 확신하는 경우 :

git branch -f master HEAD
git checkout master

당신의 주인이 원산지에서 벗어 났기 때문에 아마도 원산지로 밀 수 없습니다. 다른 사람이 repo를 사용하고 있지 않다고 확신하면 다음과 같이 강제 푸시 할 수 있습니다.

git push -f

다른 사람이 사용하지 않는 기능 분기에있는 경우 가장 유용합니다.


6

'git checkout [branch-name]'만 있으면됩니다. 여기서 [branch-name]은 분리 된 헤드 상태가 된 원래 분기의 이름입니다. (asdfasdf에서 분리)가 사라집니다.

예를 들어 분기 'dev'에서 커밋 asdfasd14314->를 체크 아웃하십시오.

'git checkout asdfasd14314'

당신은 지금 분리 된 머리 상태에 있습니다

'git branch'는 다음과 같은 것을 나열합니다->

* (detached from asdfasdf)
  dev
  prod
  stage

그러나 분리 된 헤드 상태에서 벗어나 dev로 돌아갑니다.

'git checkout dev'

그런 다음 'git branch'가 나열됩니다->

* dev
  prod
  stage

그러나 물론 분리 된 헤드 상태에서 변경 사항을 유지하지 않으려는 경우 변경을 시도하지 않고 이전 커밋을 보려고 많이 노력하고 있습니다.


6

Chris가 지적했듯이 다음과 같은 상황이있었습니다.

git symbolic-ref HEAD 실패 fatal: ref HEAD is not a symbolic ref

그러나 git rev-parse refs/heads/master복구 할 수있는 곳에서 좋은 커밋을 가리키고있었습니다 (제 경우에는 커밋을 사용하여 커밋을 볼 수 있습니다)git show [SHA]

그 후 많은 지저분한 일을했지만 해결 된 것처럼 보입니다.

git symbolic-ref HEAD refs/heads/master

그리고 머리가 다시 붙어 있습니다!


1
감사! 내 머리가 분리되었습니다. 나는 그것을 마스터에게 붙잡을 수 있었지만 그들은 커밋을 가리키는 헤드를 가리키는 머리 대신 동일한 커밋을 가리키고 있었다. 좋은 팁 = D
RagingRoosevelt

4

대신에 git checkout origin/master

그냥 해 git checkout master

그런 다음 git branch지점을 확인합니다.


4

오늘이 문제가 있었는데 하위 모듈을 업데이트했지만 지점에 없었습니다. 나는 이미 커밋 했으므로 스 태싱, 체크 아웃 및 스 태싱이 작동하지 않습니다. 나는 분리 된 머리의 커밋을 체리 피킹했습니다. 그래서 내가 저지른 직후 (푸시가 실패했을 때), 나는했다 :

git checkout master
git cherry-pick 99fe23ab

내 생각은 갔다 : 나는 분리 된 머리에 있지만 마스터가되고 싶습니다. 분리 된 상태가 마스터와 크게 다르지 않다고 가정하면 커밋을 마스터에 적용 할 수 있다면 설정됩니다. 바로 체리 픽이하는 일입니다.


3

마스터 위에서 커밋 하고 "뒤로 병합" master(즉 , master을 가리키고 자 함 HEAD) 하려는 경우 한 줄짜리는 다음과 같습니다.

git checkout -B master HEAD
  1. master이미 존재하는 경우에도 라는 이름의 새 분기를 만듭니다 (이동하는 것과 같고 master원하는 것).
  2. 새로 만든 지점이 현재 위치를 가리 키도록 설정되어 HEAD있습니다.
  3. 새 지점이 체크 아웃되었으므로 master나중에 시작하십시오.

하위 리포지토리의 경우 특히 유용하지만 분리 된 상태에 자주 있습니다.


3

나는 같은 문제가 있었고 다음 단계를 통해 문제를 해결했습니다.

변경 사항을 유지해야하는 경우

  1. 먼저 git checkout master마스터 브랜치로 돌아가려면 명령 을 실행해야합니다 .
  2. 변경 사항을 유지해야 할 경우 바로 실행 git checkout -b changes하고 git checkout -B master changes

변경이 필요하지 않은 경우

  1. 분기에서 추적되지 않은 파일을 모두 제거하려면 다음을 실행하십시오 git clean -df.

  2. 그런 다음 리포지토리 내의 모든 비 단계적 변경 사항을 지워야합니다. 그렇게하려면git checkout --

  3. 마지막으로 git checkout master명령 을 사용하여 브랜치를 마스터 브랜치로 되돌려 놓아야합니다 .


3

필자는 푸시하려는 로컬 커밋이 없으므로 로컬 브랜치를 다시 삭제하는 것만 큼 쉽습니다.

그래서 나는했다 :

git branch -d branchname

그런 다음 지점을 다시 확인하십시오.

git checkout branchname

1

내가없는 동안 master(예 : HEAD바로 위에 분리되어 master있고 그 사이에 커밋이없는) 일부 변경 사항이 있음을 알게 된 상황에서 개인적으로 자신을 발견하면 숨김이 도움이 될 수 있습니다.

git stash # HEAD has same content as master, but we are still not in master
git checkout master  # switch to master, okay because no changes and master
git stash apply  # apply changes we had between HEAD and master in the first place

1

간단히 말해 분리 된 HEAD 상태는 분기의 HEAD (또는 팁)에 체크 아웃되지 않았 음을 의미 합니다. .

예제 이해

대부분의 경우 브랜치는 다음과 같은 여러 커밋 순서입니다.

커밋 1 : 마스터-> 분기 _HEAD (123be6a76168aca712aea16076e971c23835f8ca)

커밋 2 : 마스터-> 123be6a76168aca712aea16076e971c23835f8ca-> branch_HEAD (100644a76168aca712aea16076e971c23835f8ca)

커밋 순서의 경우 위에서 볼 수 있듯이 분기는 최신 커밋을 가리 킵니다. 따라서이 경우 123be6a76168aca712aea16076e971c23835f8ca 커밋을 체크 아웃하면 지점의 HEAD가 100644a76168aca712aea16076e971c23835f8ca가리키고 기술적으로 분기가없는 HEAD에서 체크 아웃 되므로 헤드 상태가 분리 됩니다. 따라서 분리 된 HEAD 상태에 있습니다.

이론적 설명

이 블로그에서는 Git 저장소가 커밋 트리이며 각 커밋 포인터가 업데이트 된 조상을 가리키는 각 커밋이 업데이트되고 각 브랜치에 대한 이러한 포인터가 .git / refs 하위 디렉토리에 저장되어 있음을 분명히 밝힙니다. 태그는 .git / refs / tags에 저장되고 브랜치는 .git / refs / heads에 저장됩니다. 파일을 살펴보면 각 태그가 40 자 커밋 해시가있는 단일 파일에 해당하며 @Chris Johnsen 및 @Yaroslav Nikitenko가 위에서 설명한 것처럼 이러한 참조를 확인할 수 있습니다.


0

나는 정말로 바보 같은 상태에 빠졌다. 다른 누군가가 이것을 유용하게 사용할 수 있을지 의심 스럽다.

git ls-remote origin
0d2ab882d0dd5a6db93d7ed77a5a0d7b258a5e1b        HEAD
6f96ad0f97ee832ee16007d865aac9af847c1ef6        refs/heads/HEAD
0d2ab882d0dd5a6db93d7ed77a5a0d7b258a5e1b        refs/heads/master

내가 결국 고쳐

git push origin :HEAD

0

이것은 나를 위해 완벽하게 작동했습니다.

1. git stash로컬 수정 사항 저장

변경 사항을 취소하려면
git clean -df
git checkout -- .
git clean은 추적되지 않은 모든 파일을 제거합니다 (경고 : .gitignore에서 직접 언급 된 무시 된 파일은 삭제하지 않지만 폴더에있는 무시 된 파일은 삭제 될 수 있음) .git checkout은 모든 스테이지되지 않은 변경 사항을 지 웁니다.

2. git checkout master메인 브랜치로 전환하기 (마스터를 사용한다고 가정)
3. git pull마스터 브랜치에서 마지막 커밋을 가져 오기
4. git status모든 것이 잘 보이는지 확인하십시오.

On branch master
Your branch is up-to-date with 'origin/master'.

0

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

리베이스 작업을 수행하려면 필요하지 않기 때문에 청소해야했습니다.


0

Eclipse에서 EGit 을 사용하는 경우 : 마스터가 주요 개발 지점이라고 가정하십시오.

  • 지점, 일반적으로 새로운 지점으로 변경 사항을 커밋하십시오.
  • 그런 다음 리모컨에서 당겨
  • 프로젝트 노드를 마우스 오른쪽 버튼으로 클릭하고 팀을 선택한 다음 내역 표시를 선택하십시오.
  • 그런 다음 마스터를 마우스 오른쪽 버튼으로 클릭하고 체크 아웃을 선택하십시오.
  • 이클립스가 말하면, 하나의 로컬 하나의 원격 장치가있는 두 개의 마스터가 있습니다.

이 후 오리진 마스터에 다시 연결할 수 있어야합니다.


-1

나는 같은 문제가 있었다. 나는 변경 사항을 숨기고 git stash로컬의 브랜치를 이전 커밋으로 재설정했다 git pull. git stash apply다시 변경하는 것을 잊지 마십시오.


-2
git checkout checksum  # You could use this to peek previous checkpoints
git status # You will see HEAD detached at checksum
git checkout master # This moves HEAD to master branch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.