[git] 힘내 HEAD 란 무엇입니까?

Git 문서에 다음과 같은 내용이 나와 있습니다.

지점은 HEAD에 완전히 병합되어야합니다.

그러나 Git은 HEAD정확히 무엇입니까?



답변

HEAD를 “현재 분기”로 생각할 수 있습니다. 로 분기를 전환 git checkout하면 HEAD 개정판이 새 분기의 끝을 가리 키도록 변경됩니다.

다음을 수행하여 HEAD가 가리키는 내용을 확인할 수 있습니다.

cat .git/HEAD

필자의 경우 출력은 다음과 같습니다.

$ cat .git/HEAD
ref: refs/heads/master

HEAD가 분기 이름과 연관되지 않은 특정 개정을 참조 할 수 있습니다. 이 상황을 분리형 HEAD 라고합니다 .


답변

다른 사람 을 인용하려면 :

헤드는 단순히 커밋 객체에 대한 참조입니다. 각 헤드에는 이름 (브랜치 이름 또는 태그 이름 등)이 있습니다. 기본적으로 모든 저장소에는 master라는 헤드가 있습니다. 리포지토리에는 원하는 수의 헤드가 포함될 수 있습니다. 언제든지 하나의 헤드가 “현재 헤드”로 선택됩니다. 이 헤드는 항상 대문자로 HEAD의 별칭입니다. “

이 차이점에 유의하십시오. “헤드”(소문자)는 리포지토리의 명명 된 헤드 중 하나를 나타냅니다. “HEAD”(대문자)는 현재 활성화 된 헤드만을 가리 킵니다. 이 차이점은 Git 문서에서 자주 사용됩니다.

git의 내부 작업을 빠르게 다루고 헤드 / HEAD를 더 잘 이해하기위한 또 다른 좋은 소스는 여기 에서 찾을 수 있습니다 . 참조 (ref 🙂 또는 헤드 또는 브랜치는 커밋 히스토리에서 커밋에 붙어있는 포스트잇 메모처럼 간주 될 수 있습니다. 보통 그들은 커밋 시리즈의 끝을 가리 있지만 주변에 이동할 수 있습니다 git checkout또는 git reset


답변

github 개발자 Scott Chacon [ video reference ] 에서이 정의를 추천합니다 .

헤드는 현재 지점입니다. 기호 참조입니다. 분기에 대한 참조입니다. 당신은 항상 HEAD를 가지고 있지만 HEAD는 다른 포인터 중 하나를 가리키고 있습니다. 다음 커밋의 부모입니다. 작업 디렉토리에 마지막으로 체크 아웃 된 항목이어야합니다. 이것은 작업 디렉토리의 마지막 상태입니다.

전체 비디오는 전체 git 시스템에 대한 공정한 소개를 제공하므로 시간이 있다면 모든 비디오를 시청하는 것이 좋습니다.


답변

HEAD는 현재 사용중인 로컬 브랜치를 가리키는 특수 포인터입니다.

로부터 프로 힘내 책, 장 3.1 힘내 분기 – 요컨대 지점 섹션에서 새 지점 만들기 :

새 지점을 만들면 어떻게됩니까? 그렇게하면 움직일 수있는 새로운 포인터가 만들어집니다. testing이라는 새로운 브랜치를 생성한다고 가정 해 봅시다. git branch 명령을 사용하면됩니다 :

$ git branch testing

이것은 현재 커밋에서 새로운 포인터를 만듭니다.

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

Git은 현재 어떤 브랜치를 알고 있습니까? HEAD라는 특수 포인터를 유지합니다. 이것은 Subversion 또는 CVS와 같은 다른 VCS의 HEAD 개념과는 많이 다릅니다. Git에서 이것은 현재 위치한 로컬 브랜치에 대한 포인터입니다. 이 경우에도 여전히 마스터입니다. git branch 명령은 새로운 브랜치를 만들었고 그 브랜치로 전환하지 않았습니다.

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


답변

O’Reilly Git 책, 2nd edtion, p.69에 명시된 바와 같이 “분리 된 HEAD”라고하는 특별한 경우가 아니라고 가정하면 다음을 HEAD의미합니다.

HEAD항상 현재 분기에서 가장 최근의 커밋을 나타냅니다. 분기를 변경 HEAD하면 새 분기의 최신 커밋을 참조하도록 업데이트됩니다.

그래서

HEAD이다 현재 브랜치의 “팁” .

우리가 사용할 수있는 참고 HEAD커밋 가장 최근에 참조하고, 사용 HEAD~(가) 끝 이전에 커밋하고, HEAD~~또는 HEAD~2(가) 그 이전 커밋, 등 등.


답변

이 답변에는 미묘하지만 중요한 오해가 있습니다. 나는 그것을 정리하기 위해 대답을 추가 할 것이라고 생각했습니다.

무엇입니까 HEAD?

머리는 당신입니다

HEAD커밋 기록의 어느 위치를 가리키는 기호 참조입니다. 당신이 어디를 가든, 그림자처럼 당신을 따라갑니다. 커밋 HEAD하면 움직입니다. 당신이 뭔가를 체크 아웃 HEAD하면 이동합니다. 당신이 무엇을 하든지, 커밋 기록에서 새로운 곳으로 이사했다면 당신 HEAD과 함께 움직입니다. 하나의 일반적인 오해를 해결하려면 :에서 자신을 분리 할 수 ​​없습니다 HEAD. 분리 된 HEAD 상태가 아닙니다. 당신이 생각하는 것을 발견한다면 : “아뇨, 저는 분리 된 HEAD 상태입니다! 나는 HEAD를 잃었습니다!” 그것은 당신의 머리라는 것을 기억하십시오. 머리는 당신입니다. 당신은 HEAD에서 분리되지 않았습니다. 당신과 당신의 HEAD는 다른 것과 분리되었습니다.

HEAD에 무엇을 첨부 할 수 있습니까?

HEAD커밋을 가리킬 수 있지만 일반적으로 그렇지 않습니다. 다시 말씀 드리겠습니다. 일반적으로 HEAD커밋을 가리 키지 않습니다. 분기 참조를 가리 킵니다. 그것은되어 부착 된 해당 분기에, 당신은 어떤 일 (예를 들어, 수행 할 때 commit또는 reset) 첨부 지점과 함께 이동합니다 HEAD. 후드 아래를 보면 그것이 가리키는 것을 볼 수 있습니다.

cat .git/HEAD

일반적으로 다음과 같은 것을 얻습니다.

ref: refs/heads/master

때로는 다음과 같은 것을 얻을 수 있습니다.

a3c485d9688e3c6bc14b06ca1529f0e78edd3f86

이것이 HEAD커밋을 직접 가리킬 때 일어나는 일 입니다. HEAD분기 참조 이외의 것을 가리키고 있기 때문에 분리 된 HEAD라고합니다 . 이 상태에서 커밋을 수행하면 master더 이상에 연결 HEAD되지 않고 더 이상 나와 함께 이동하지 않습니다. 커밋이 어디에 있는지는 중요하지 않습니다. 마스터 브랜치와 동일한 커밋에있을 수 있지만 브랜치 HEAD가 아닌 커밋을 가리키면 분리되어 새 커밋이 브랜치 참조와 연결되지 않습니다.

다음 연습을 시도하면이를 그래픽으로 볼 수 있습니다. 자식 저장소에서 이것을 실행하십시오. 약간 다른 것을 얻을 수 있지만 핵심 비트가 있습니다. 커밋을 직접 체크 아웃해야 할 때 첫 번째 출력 (여기서는)에서 얻은 약식 해시를 사용하십시오 a3c485d.

git checkout master
git log --pretty=format:"%h:  %d" -1
# a3c485d:   (HEAD -> master)

git checkout a3c485d -q # (-q is for dramatic effect)
git log --pretty=format:"%h:  %d" -1
# a3c485d:   (HEAD, master)

여기 출력에 약간의 차이가 있습니다. 분기 대신 커밋을 직접 확인하면 화살표 대신 쉼표가 나타납니다. 우리는 HEAD 상태가 분리되어 있다고 생각합니까? HEAD는 여전히 브랜치 이름과 연관된 특정 개정을 참조하고 있습니다. 우리는 아직도 우리는 마스터 브랜치되지 않습니다?

이제 시도하십시오 :

git status
# HEAD detached at a3c485d

아니. 우리는 ‘분리 된 HEAD’상태에 있습니다.

당신은 같은 표현을 볼 수있다 (HEAD -> branch)(HEAD, branch)와를 git log -1.

결론적으로

HEAD당신입니다. 당신이 어디에 있든 당신이 체크 아웃 한 것을 가리 킵니다. 일반적으로 이것은 커밋이 아니며 브랜치입니다. 경우 HEAD 수행 에 가리킨는 커밋 (또는 태그) 같은 당신 (그리고,에 가지도 포인트 있다고하더라도, (또는 태그) 커밋 HEAD) 그 지점에서 분리되었다. 지점이 연결되어 있지 않으므로 새 커밋을 수행 할 때 지점이 따라 오지 않습니다. HEAD그러나 의지 할 것입니다.


답변

HEAD작업 복사본이 가리키는 현재 커밋, 즉 현재 체크 아웃 한 커밋을 나타냅니다. Git 개정판 지정에 대한 공식 Linux Kernel 문서에서 :

HEAD 작업 트리의 변경 사항을 기반으로 한 커밋의 이름을 지정합니다.

그러나 곧 출시 될 Git 1.8.4 버전 에서는 Git 기고자 Junio ​​C Hamano가 그의 Git Blame 블로그에서 언급 한대로 다음같이@ 속 기용으로 사용할 수 있습니다 .HEAD

“HEAD”를 입력하는 대신 “@”라고 말할 수 있습니다 (예 : “git log @”).

스택 오버플로 사용자 인 VonC또 다른 질문에 대한 답변에서 속기 (short 축)로 선택된 이유 @에 대한 흥미로운 정보를 발견 했습니다 .

또한 일부 환경 HEAD에서는 대소 문자를 구분하지 않는 파일 시스템, 특히 Windows 및 OS X를 사용하는 운영 체제에서 대문자 를 사용할 필요가 없습니다.