질문자 :Daniel
내 리포지토리에서 일부 작업을 수행하고 파일에 로컬 변경 사항이 있음을 발견했습니다. 더 이상 원하지 않아 파일을 삭제했습니다. 그냥 새 사본을 체크아웃할 수 있다고 생각했습니다. 나는 Git에 해당하는 것을하고 싶었습니다.
svn up .
git pull
사용하면 작동하지 않는 것 같습니다. 무작위 검색을 통해 누군가가 권장하는 사이트로 이동했습니다.
git checkout HEAD^ src/
( src
는 삭제된 파일이 있는 디렉토리입니다).
이제 나는 분리 된 머리가 있음을 알았습니다. 나는 그것이 무엇인지 전혀 모른다. 어떻게 취소할 수 있습니까?
분리된 헤드는 더 이상 지점에 있지 않고 기록에서 단일 커밋을 체크아웃했음을 의미합니다(이 경우 HEAD 이전 커밋, 즉 HEAD^).
분리된 HEAD와 관련된 변경 사항 을 삭제 하려는 경우
당신은 당신이 있던 지점만 체크아웃하면 됩니다.
git checkout master
다음에 파일을 변경하고 인덱스에 있는 상태로 복원하려면 먼저 파일을 삭제하지 말고 다음을 수행하십시오.
git checkout -- path/to/foo
이렇게 하면 foo 파일이 인덱스에 있는 상태로 복원됩니다.
분리된 HEAD와 연결된 변경 사항을 유지하려면
-
git branch tmp
실행 tmp
라는 새 브랜치에 저장됩니다. -
git checkout master
실행 - 변경 사항을
master
에 통합하려면 master
브랜치 git merge tmp
git checkout master
실행 후 master
브랜치에 있어야 합니다.
ralphtheninja잃어버리고 싶지 않은 파일을 변경했다면 푸시할 수 있습니다. 나는 그것들을 detached 모드로 커밋했고 그 후에 당신은 나중에 master에 통합하기 위해 임시 브랜치로 이동할 수 있습니다.
git commit -m "....." git branch my-temporary-work git checkout master git merge my-temporary-work
다음에서 추출:
분리된 헤드에서 만든 커밋으로 수행할 작업
Toni Gamez임시 분기를 만들지 않는 솔루션입니다.
이 모드에서 이미 무언가를 변경하고 선택적으로 변경 사항을 저장하려는 경우 분리된 HEAD 상태를 종료("수정")하는 방법:
유지하려는 변경 사항을 커밋합니다. 분리된 HEAD 상태에서 수행한 변경 사항을 인수하려면 커밋하십시오. 좋다:
git commit -a -m "your commit message"
유지하고 싶지 않은 변경 사항은 버리십시오. 하드 리셋은 분리된 HEAD 상태에서 수행한 커밋되지 않은 모든 변경 사항을 삭제합니다.
git reset --hard
(이렇게 하지 않으면 분리된 HEAD에서 커밋되지 않은 수정된 파일에 대해 불평하면서 3단계가 실패합니다.)
지점을 확인하세요. 이전에 작업한 분기를 확인하여 분리된 HEAD 상태를 종료합니다. 예를 들면 다음과 같습니다.
git checkout master
커밋을 인수합니다. 다른 질문에 대한 내 답변 에서 볼 수 있듯이 이제 체리 선택을 통해 분리된 HEAD 상태에서 수행한 커밋을 인수할 수 있습니다.
git reflog git cherry-pick <hash1> <hash2> <hash3> …
tanius분리된 헤드는 다음을 의미합니다.
- 당신은 더 이상 지점에 있지 않습니다.
- 기록에서 단일 커밋을 체크아웃했습니다.
변경 사항이 없는 경우: 다음 명령을 적용하여 마스터로 전환할 수 있습니다.
git checkout master
유지하려는 변경 사항이 있는 경우:
분리된 HEAD의 경우 명명된 분기가 업데이트되지 않는다는 점을 제외하고 커밋은 정상적으로 작동합니다. 커밋된 변경 사항으로 마스터 브랜치를 업데이트하려면 현재 위치에 임시 브랜치를 만들고(이 방법으로 임시 브랜치는 분리된 HEAD에서 수행한 커밋된 모든 변경 사항을 갖게 됩니다) 마스터 브랜치로 전환하고 임시 브랜치를 다음과 병합합니다. 마스터.
git branch temp git checkout master git merge temp
Razan PaulHEAD는 포인터 이며, 직접 또는 간접적으로 특정 커밋을 가리킵니다.
가 (이 지점을 가리키는 IE) 일부 지점에 연결되어 있는지 HEAD 수단을 첨부.
분리된 HEAD는 분기에 연결 되지 않았음을 의미합니다. 즉, 일부 커밋을 직접 가리킵니다.
![여기에 이미지 설명 입력](https://i.stack.imgur.com/6mrfN.jpg)
다시 말해:
- 커밋을 직접 가리키면 HEAD가 분리 됩니다.
- 커밋을 간접적으로 가리키는 경우(즉, 분기를 가리키고 커밋을 가리키는 경우) HEAD가 연결 됩니다.
HEAD가 부착/분리된 상황을 더 잘 이해하기 위해 위 그림의 네 개로 이어지는 단계를 보여 드리겠습니다.
저장소의 동일한 상태로 시작합니다(모든 사분면의 그림은 동일함).
![여기에 이미지 설명 입력](https://i.stack.imgur.com/a9uTf.jpg)
이제 개별 사진의 다른 대상을 사용하여 git checkout
을 수행하려고 합니다( 그 위의 명령은 해당 명령만 적용한다는 것을 강조하기 위해 흐리게 표시됨).
![여기에 이미지 설명 입력](https://i.stack.imgur.com/Ph7Y5.jpg)
다음은 해당 명령 을 수행한 후의 상황입니다.
![여기에 이미지 설명 입력](https://i.stack.imgur.com/ZgKkM.jpg)
보시다시피, HEAD는 git checkout
명령 의 대상 을 가리킵니다. 브랜치 (4중항의 처음 3개 이미지) 또는 (직접) 커밋 (4중항의 마지막 이미지)을 가리킵니다.
작업 디렉토리의 내용도 적절한 커밋(스냅샷), 즉 HEAD가 가리키는 커밋(직접 또는 간접)에 따라 변경됩니다.
이제 우리는 이 답변의 시작 부분과 같은 상황에 있습니다.
![여기에 이미지 설명 입력](https://i.stack.imgur.com/6mrfN.jpg)
MarianD다음은 내가 머리가 분리되어 있고 이미 몇 가지 변경 사항을 적용한 것을 깨달은 후에 수행한 작업입니다.
변경 사항을 커밋했습니다.
$ git commit -m "..." [detached HEAD 1fe56ad] ...
커밋의 해시(1fe56ad)를 기억했습니다. 그런 다음 내가 있어야 할 지점을 확인했습니다.
$ git checkout master Switched to branch 'master'
마지막으로 커밋의 변경 사항을 브랜치에 적용했습니다.
$ git cherry-pick 1fe56ad [master 0b05f1e] ...
임시 브랜치를 만드는 것보다 이게 더 쉽다고 생각합니다.
Philippe Gerber변경한 후 분리된 헤드에 있다는 것을 깨달았다면 다음을 수행할 수 있습니다. stash -> 체크아웃 마스터 -> 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'
아무 일도 일어나지 않은 것처럼 커밋되지 않은 변경 사항과 정상적인 "연결된" HEAD를 갖게 됩니다.
mojubagit
에서 특정 커밋을 체크아웃하면 분리된 헤드 상태가 됩니다...즉, 작업 복사본이 더 이상 명명된 참조(예: "마스터")의 상태를 반영하지 않습니다. 이것은 리포지토리의 과거 상태를 검사하는 데 유용하지만 실제로 변경 사항을 되돌리려는 경우 원하는 것이 아닙니다.
특정 파일에 변경 사항을 적용하고 단순히 삭제하려는 경우 다음과 같이 checkout
git checkout myfile
이것은 커밋되지 않은 변경 사항을 버리고 현재 분기의 헤드에 있는 상태로 파일을 되돌립니다. 이미 커밋한 변경 사항을 취소하려면 reset
명령을 사용할 수 있습니다. 예를 들어, 이것은 저장소를 이전 커밋 상태로 재설정하고 모든 후속 변경 사항을 무시합니다.
git reset --hard HEAD^
그러나 다른 사람들과 리포지토리를 공유하는 경우 git reset
이 중단될 수 있습니다(리포지토리 기록의 일부가 지워지기 때문에). 이미 다른 사람들과 변경 사항을 공유했다면 일반적으로 git revert
대신 살펴보고 싶습니다. 즉, 해당 변경 사항을 "실행 취소"하는 새 커밋을 생성합니다.
Git Book 에 자세한 내용이 있습니다.
larsks"분리된 헤드 상태"는 임시 분기에 있기 때문에 git checkout -
사용하면 됩니다. 그러면 마지막 분기에 있게 됩니다.
Mikegit reset --hard origin/your-branch
를 수행했을 것입니다.
git checkout your-branch
시도하십시오.
Johnny Cage@Philippe Gerber의 답변을 더 명확히 하기 위해 다음과 같습니다.
![자식 체리 픽](https://i.stack.imgur.com/Q1HKx.png)
cherry-pick
전에 git checkout master
가 필요합니다. detached head
commit
에서만 필요합니다.
Timo분리된 헤드는 분기를 제대로 체크아웃하지 않았거나 방금 단일 커밋을 체크아웃했음을 의미합니다.
이러한 문제가 발생하면 변경 사항을 잃지 않도록 먼저 로컬 변경 사항을 숨깁니다.
그 후 ... 명령을 사용하여 원하는 분기를 확인하십시오.
MyOriginalBranch 브랜치를 원한다고 가정해 보겠습니다.
git checkout -b someName origin/MyOriginalBranch
Dhirendra Gautam"분리된 헤드"에 있다는 것은 HEAD가 명명되지 않은 특정 커밋(명명된 분기와 반대)을 참조한다는 것을 의미합니다(참조: https://git-scm.com/docs/git-checkout section Detached head ). 실제로 이것은 커밋을 체크아웃했지만 연결된 브랜치 이름이 없음을 의미합니다.
다음과 같이 커밋과 관련된 새 분기만 생성하도록 선택할 수 있습니다.
git branch new-branch-name
.
이를 통해 현재 상태를 새 분기에 저장할 수 있습니다.
또는 이전 상태로 돌아간 다음 이를 수행하려면 이전에
git checkout @{-1}
Pat. ANDRIA부록
반환하려는 분기가 마지막 체크아웃인 경우 간단히 checkout @{-1}
사용할 수 있습니다. 이렇게 하면 이전 결제로 돌아갑니다.
또한 이 명령의 별칭을 git global --config alias.prev
같이 git prev
를 입력하기만 하면 이전 체크아웃으로 다시 전환할 수 있습니다.
David BrowerGit이 방법을 알려줬습니다.
입력한 경우:
git checkout <some-commit_number>
상태 저장
git add . git commit -m "some message"
그 다음에:
git push origin HEAD:<name-of-remote-branch>
Sterling Diaz일반적으로 HEAD
는 분기를 가리킵니다. 분기를 가리키지 않고 69e51
과 같은 커밋 해시를 가리키면 분리된 HEAD가 있음을 의미합니다. 문제를 해결하려면 두 지점을 가리켜야 합니다. 이 문제를 해결하기 위해 두 가지 작업을 수행할 수 있습니다.
- git checkout other_branch // 해당 커밋
hash
- 새 분기를 만들고 커밋 해시를 새로 만든 분기를 가리킵니다.
HEAD는 분기를 가리켜야 하며 커밋 해시가 황금률이 아닙니다.
Krishnadas PC이 접근 방식은 커밋 히스토리의 일부를 잠재적으로 버릴 것이지만 이전 마스터 브랜치와 현재 상태의 병합이 까다롭거나 커밋 히스토리의 일부를 잃어도 상관없는 경우 더 쉽습니다.
병합하지 않고 현재 상태를 유지하려면 현재 분리된 HEAD를 마스터 분기로 전환합니다.
- 일이 예기치 않게 잘못될 경우에 대비하여 수동으로 저장소를 백업하십시오.
- 유지하려는 마지막 변경 사항을 커밋합니다.
- 현재 상태의 파일을 포함할 임시 분기(이름을
detached-head
git checkout -b detached-head
- (a) 마스터 브랜치를 유지할 필요가 없으면 삭제
git branch -D master
- (b) 또는 유지하려면 이름을 바꿉니다.
git branch -M master old-master
- 임시 분기의 이름을 새 마스터 분기로 바꿉니다.
git branch -M detached-head master
크레딧: Gary Lai의 이 Medium 기사 에서 각색했습니다.
alexhg헤드가 분리된 상황에서 새 파일을 만든 경우 먼저 다음과 같이 새 파일이 인덱스에 추가되었는지 확인합니다.
git add .
그러나 기존 파일만 변경하거나 삭제했다면 다음을 통해 메시지를 추가(-a)하고 커밋(-m)할 수 있습니다.
git commit -a -m "my adjustment message"
그런 다음 다음을 사용하여 현재 상태로 새 분기를 간단히 만들 수 있습니다.
git checkout -b new_branch_name
새 분기가 생기고 모든 조정이 새 분기에 있게 됩니다. 그런 다음 계속해서 원격으로 푸시하거나 원하는 대로 체크아웃/당기기/병합할 수 있습니다.
DZet내가 어떻게 그것을 얻을 수 있었는지 모른 채 분리된 헤드가 있다는 것을 깨닫고(예: 세 개의 커밋을 멀리 떨어뜨림), merge
, rebase
또는 cherry-pick
을 시도하면 수백 개의 병합 충돌이 발생한다는 것을 알게 되었기 때문에 다른 접근 방식을 취했습니다.
(모든 것이 커밋되었다고 가정(작업 트리는 "깨끗함"))
내 커밋 메시지 저장: git log > /tmp/log
내 작업 트리 저장: mkdir /tmp/backup && cp -a all_my files_and_directories /tmp/backup
master
되돌리기 : git checkout master
모든 작업 파일과 디렉토리를 제거하십시오: rm ...
백업을 사용하십시오: cp -a /tmp/backup/. .
git add
및 git commit
/tmp/log
메시지를 사용하여 다른 파일 하위 세트로 반복할 수 있습니다...
master
이후에 하나의 파일이 여러 번 변경되면 커밋 기록이 손실된다는 것입니다. 하지만 결국에는 깨끗한 master
갖게 되었습니다.
U. Windl변경 사항을 유지하고 싶었으므로 이 작업을 수행하면 됩니다.
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
나를 위해 일하는
CRLZXOgit pull origin master
나를 위해 일했다. 원격 및 분기 이름을 명시적으로 지정하는 것이었습니다.
Amjedonline분리된 HEAD는 현재 어떤 지점에도 있지 않음을 의미합니다. 현재 변경 사항을 유지하고 단순히 새 분기를 만들고 싶다면 다음과 같이 하십시오.
git commit -m "your commit message" git checkout -b new_branch
나중에 이 새 분기를 다른 분기와 병합할 수 있습니다. 항상 도움이 되는 것은 git "dog" 명령입니다.
git log --all --decorate --oneline --graph
gebbissimo이것은 나를 위해 작동합니다. 분리 된 헤드에 새 분기를 할당합니다.
git checkout new_branch_name detached_head_garbage_name
Alok Gupta나는 비슷한 상황에 있었다.
어떤 이유로 나는 분리 된 헤드로 끝났습니다. 나는 내가 있다고 생각한 브랜치와 동일한 경로에서 커밋했습니다. 예를 들어 HEAD는 브랜치 태그의 자식 이었지만 어떤 이유로 브랜치 태그는 역사적인 위치에 머물렀습니다. 커밋 ... 아마도 내가 밀었기 때문에??
내가 속해 있다고 생각한 지점에 있는 것으로 간주되지 않았기 때문에 밀어붙일 수 없었습니다.
나는 내 기록을 변경하거나 체리 따기를 원하지 않았고 지점에서 작업하는 데 약 8주를 보냈으므로 reset --hard
가 나를 약간 긴장하게 만들었습니다!
해결책은 다음을 수행하는 것뿐이었습니다.
git branch -f myStuckBranch HEAD git checkout myStuckBranch
HEAD와 myStuckBranch가 이제 동일한 것을 가리키고 있더라도 여전히 분리된 헤드 상태(분기가 아님)에 있는 것으로 간주되기 때문에 체크아웃을 수행해야 합니다.
나는 git 전문가가 아니지만(주로 이 이상한 상황을 일으키지 않는 수은을 사용함) 이 명령에 대한 내 이해는 "myStuckBranch를 HEAD를 가리키도록 변경"이라고 되어 있다는 것입니다.
나는 일상적으로 이 명령을 사용하여 작업 디렉토리를 교체하지 않고 가져온 후 마스터의 변경 사항을 병합한다는 것을 알게 됩니다.
git fetch git branch -f master origin/master -- err yeah don't just ignore what's been going on remotely - eg point my master at the real master git merge master -- merge the changes into my local branch
항상 수동으로 이 작업을 수행해야 하는 것은 약간 성가신 일이지만 작업 디렉터리에서 변경 사항을 병합하기 위해 다른 분기를 업데이트하기 위해 작업 디렉터리를 변경하는 것보다 여전히 낫습니다.
JonnyRaagit rebase 를 사용하면 HEAD를 원하는 커밋으로 이동할 수 있습니다.
다음과 같이 분기가 분리된 상태라고 가정합니다.
* bfcb8f9 Commit 4 * 540a123 Commit 3 * 4356d64 Commit 2 | * fecb8d2 Commit 2 |/ | * 8012f45 Commit 2x |/ | * 6676d15 (HEAD -> master) Commit 2 --amend |/ * 1818f91 Commit 1
분리된 헤드는 이전에 git commit --amend 명령으로 인해 생성된 분리된 커밋을 가리키는 실수로 리베이스하여 생성되었습니다.
HEAD ref를 가장 최근 커밋으로 이동하려면 가리키고 싶은 HASH 커밋으로 rebase를 적용하십시오. 이 예에서 해시는 가장 최근 커밋의 것입니다.
git rebase bfcb8f9
이렇게 하면 HEAD가 원하는 커밋(이 경우 가장 최근)을 가리키는 지점이 남게 됩니다.
* bfcb8f9 (HEAD -> master) Commit 4 * 540a123 Commit 3 * 4356d64 Commit 2 --amend | * fecb8d2 Commit 2 |/ | * 8012f45 Commit 2x |/ | * 6676d15 Commit 2 |/ * 1818f91 Commit 1
Edgar Alejandro Ramirez출처 : http:www.stackoverflow.com/questions/10228760/how-do-i-fix-a-git-detached-head