Git 문서에 다음과 같은 내용이 나와 있습니다.
지점은 HEAD에 완전히 병합되어야합니다.
그러나 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
등
git checkout HEAD~2
알려진 커밋의 커밋 ID가 아닌 지정한 커밋의 커밋 ID를 가리 킵니다 (예 :). 자세한 설명은 eagain.net/articles/git-for-computer-scientists 의 기사를 참조하십시오 .
git revert
때문에 브랜치를 팁으로 이동시키지 않는 좋은 예는 아닙니다 git revert
.
commit
의 행동에 영향을 미칠 것입니다 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 명령은 새로운 브랜치를 만들었고 그 브랜치로 전환하지 않았습니다.
34ac2
위의 예에서 체크 아웃하면 HEAD가 해당 커밋을 가리키고 분리 된 HEAD라고합니다. 이 상태에서는 변경, 실험 및 커밋 변경도 가능하지만 다른 지점을 체크 아웃하면 새 지점을 만들지 않는 한 모든 변경 내용이 손실됩니다.
git log
뭔가를 가지면 분기가 커밋 id에 대한 참조 commit ad0265... HEAD -> foo ...
임을 의미합니다 . 텍스트 참조를 체크 아웃 하는 것은 분리 된 헤드가 아닙니다. 커밋 ID를 체크 아웃하면 헤드가 분리됩니다. 내가 의사 소통하는 내용의 미묘한 부분이 누락되었을 수 있습니다. 이 벽이 내가 잃어버린 곳을 찾는 데 도움이되기를 바랍니다. foo
ad0265
foo
ad0265
이 답변에는 미묘하지만 중요한 오해가 있습니다. 나는 그것을 정리하기 위해 대답을 추가 할 것이라고 생각했습니다.
무엇입니까
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
그러나 의지 할 것입니다.
.git/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를 사용하는 운영 체제에서 대문자 를 사용할 필요가 없습니다.
브랜치 생성 및 재생 살펴보기
HEAD는 실제로 내용이 HEAD 변수가 참조하는 위치를 결정하는 파일입니다.
$ cat .git/HEAD
ref: refs/heads/master
$ cat .git/refs/heads/master
35ede5c916f88d8ba5a9dd6afd69fcaf773f70ed
이 저장소에서 HEAD 파일의 컨텐츠는 refs / heads / master 라는 두 번째 파일을 참조합니다 . refs / heads / master 파일 은 마스터 브랜치에서 가장 최근의 커밋 해시를 포함합니다.
결과적으로 HEAD는 .git / refs / heads / master 파일 에서 마스터 브랜치 커밋을 가리 킵니다 .
Greg Hewgil의 인정받는 답변에 몇 가지 사항을 자세히 설명하고 싶습니다. 힘내 포켓 가이드 에 따르면
분기:
분기 자체는 명명 된 커밋 (분기의 "팁")에서 커밋 그래프에 도달 할 수있는 모든 지점으로 정의됩니다.
HEAD : 특별한 유형의 Ref
특별 심판 HEAD는 당신이 어떤 지점에 있는지 결정합니다 ...
심판
Git은 두 종류의 참조 또는 "refs"라고하는 명명 된 포인터를 정의합니다.
- 객체 참조 (보통 커밋 또는 태그)를 직접 가리키는 간단한 참조
- 다른 참조 (단순 또는 기호)를 가리키는 기호 참조 (또는 symref)
Greg가 언급했듯이 HEAD는 "분리 된 상태"에있을 수 있습니다. 따라서 HEAD는 간단한 참조 (분리 된 HEAD의 경우)이거나 symref 일 수 있습니다.
HEAD가 기존 분기에 대한 상징적 참조 인 경우 해당 분기에 "있는"것입니다. 반면에 HEAD가 SHA-1 ID로 커밋의 이름을 직접 지정하는 간단한 참조 인 경우 분기가 "온"되지 않고 "분리 된 HEAD"모드에 있습니다. 조사하겠다고 결심하십시오.
'HEAD'는 현재 체크 아웃 커밋이라고 생각합니다. 즉, 'HEAD'는 현재 체크 아웃 된 커밋을 가리 킵니다.
방금 복제하고 체크 아웃하지 않은 경우 그것이 가리키는 것이 무엇인지, 아마도 잘못된 위치 일지 모릅니다.
master
분기를 체크 아웃 하므로 HEAD는 마스터를 가리 킵니다.
master
으로이지만 항상 그런 것은 아닙니다. 참조remote set-head
remote set-head
했습니다. 로컬 기본 분기에만 영향을 미치며 서버의 기본값은 변경되지 않습니다.
헤드는 현재 체크 아웃 된 분기의 끝을 가리 킵니다.
리포지토리에는 .git 폴더가 있습니다. .git \ refs \ heads 위치에서 파일을여십시오. 해당 파일의 (sha-1 해시) 코드 (대부분의 경우 마스터)가 가장 최근의 커밋이됩니다 (예 : 명령 출력에서 볼 수 있음) git log
. .git 폴더에 대한 추가 정보 : http://gitready.com/advanced/2009/03/23/whats-inside-your-git-directory.html
git reset HEAD^
가장 최근의 커밋 (이전 팁)이 더 이상 지점의 팁으로 지시되지 않습니다.
이전 답변을 모두 읽은 후에도 여전히 더 명확 해지기를 원했습니다. 공식 git 웹 사이트 http://git-scm.com/blog 의이 블로그는 내가 찾고있는 것을 나에게 주었다.
망할 놈의 머리는이다 포인터 차례에 현재 가지 기준에 포인터를 당신이 만든 또는 마지막으로 그 작업 디렉토리에 체크 아웃 된 확약 마지막에. 그것은 또한 다음 커밋의 부모가 될 것임을 의미합니다. HEAD가 마지막 커밋의 스냅 샷이라고 생각하는 것이 일반적으로 가장 간단합니다.
HEAD
커밋이 아닙니다. 그것은 가리키는 하나.
checkout HEAD^
인 경우 이제 HEAD는 분기의 마지막 커밋 스냅 샷을 가리 키지 않습니다.
commit
, merge
, rebase
, log
"(포인터) 현재의 위치를"등 그러나 개념적으로 어쩌면을 좋은 요약입니다.
한 번 봐 가지고 http://git-scm.com/book/en/Git-Branching-What-a-Branch-Is을
그림 3-5. 현재 지점을 가리키는 HEAD 파일.
개념으로, 헤드는 지점의 최신 개정판입니다. 명명 된 브랜치 당 하나 이상의 헤드가있는 경우 병합하지 않고 로컬 커밋을 수행 할 때 아마도 헤드를 생성하여 명명되지 않은 브랜치를 효과적으로 만듭니다.
"깨끗한"리포지토리를 만들려면 명명 된 분기당 하나의 헤드가 있어야하며 로컬에서 작업 한 후에는 항상 명명 된 분기에 병합해야합니다.
Mercurial 도 마찬가지입니다 .