자식의 머리는 무엇입니까?


232

마지막 커밋, HEAD 및 내 디렉토리에서 볼 수있는 파일의 상태에는 차이가있는 것 같습니다.

HEAD 란 무엇이며 어떻게해야합니까? 그리고 어떤 실수를 피해야합니까?



1
Git v1.8.4부터는 아래의 모든 답변 이 대신 사용 HEAD되거나 대신 head사용될 수 있습니다 . 왜 그렇게 할 수 있는지 알아 보려면 이 답변 (마지막 섹션) 을 참조하십시오 . @HEAD

3
git-scm에서 : Git의 HEAD는 현재 분기 참조에 대한 포인터이며, 마지막으로 커밋 또는 작업 디렉토리로 체크 아웃 한 마지막 커밋에 대한 포인터입니다. 그것은 또한 다음 커밋의 부모가 될 것임을 의미합니다. HEAD가 마지막 커밋의 스냅 샷이라고 생각하는 것이 일반적으로 가장 간단합니다.
Quazi Irfan

답변:


185

HEAD는 현재 체크 아웃 된 분기의 마지막 커밋에 대한 참조입니다.


여기에는 분리 된 HEAD 인 작은 예외가 있습니다. 분리 HEAD는 당신이 체크 아웃 할 때마다에 결국 상황이다 커밋 대신 지점 (또는 태그). 이 경우 이름이없는 임시 지점으로 생각해야합니다 . 명명 된 분기 참조를 갖는 대신 HEAD 있습니다. 여전히 커밋을 수행 할 수 있으므로 (HEAD 업데이트) 분리 된 HEAD를 이름이없는 임시 분기로 생각하면 위의 짧은 정의는 여전히 참입니다.


1
그렇다면 왜 두 개의 머리를 가질 수 있습니까?
e-satis

1
@ e-satis : 때때로 분기라고하는 분기가 표시됩니다 refs/heads. 이 분기는에 저장됩니다 . HEAD그러나 소문자 헤드는와 다릅니다 . 내 대답은 이것을 조금 명확하게합니다.
Cascabel

7
@ e-satis : 정규식이 아닙니다. 이것은 ^"커밋 이전"에 대한 git의 표기법입니다. 그것은 현재 커밋 이전의 커밋입니다. (현재가 병합 인 경우 첫 번째 부모를 사용합니다.)
Cascabel

1
@ e-satis : 커밋을 지정하는 모든 방법에 대한 자세한 내용은 git-rev-list에 대한 매뉴얼 페이지의 수정 버전 지정 섹션을 참조하십시오. kernel.org/pub/software/scm/git/docs/…
Cascabel

1
아닙니다. rev와 HEAD가 동일한 커밋을 가리키면 차이가 없습니다. rev 또는 HEAD 대신 커밋 ID (SHA-1 값)를 작성할 수도 있습니다. 그리고 당신은하지 괴롭 우리를 질문 :)으로 수행 걱정하지 마세요 (나 적어도 : P)
찌를

87

HEAD 현재 체크 아웃 된 커밋에 대한 참조 (참조)입니다.

정상적인 상태에서는 실제로 체크 아웃 한 브랜치에 대한 상징적 참조입니다. .git / HEAD의 내용을 보면 "ref : refs / heads / master"와 같은 것을 볼 수 있습니다. 브랜치 자체는 브랜치 끝의 커밋에 대한 참조입니다. 따라서 정상 상태 HEAD에서 현재 분기의 끝에있는 커밋을 효과적으로 나타냅니다.

"분리 된 HEAD"를 가질 수도 있습니다. 이것은 원격 브랜치, 특정 커밋 또는 태그와 같이 (로컬) 브랜치 이외의 것을 체크 아웃 할 때 발생합니다. 이를 확인하는 가장 일반적인 장소는 커밋을 편집 할 때 대화식 리베이스 동안입니다. 분리 된 HEAD 상태에서 HEAD는 커밋에 대한 직접적인 참조입니다. .git / HEAD의 내용은 SHA1 해시입니다.

일반적으로 HEAD는 "체크 아웃 한 항목"을 의미하는 편리한 이름 일 뿐이므로 걱정할 필요가 없습니다. 체크 아웃 한 것을 알고, 브랜치에 있지 않은 경우 (분리 된 HEAD 상태) 커밋을 원하지 않을 것입니다 (예 : 대화식 리베이스에 있음). .


6
이것은 내가 이해하지 못하는 것입니다. 원격 지점을 체크 아웃하면 "분리 된 헤드"가 발생하는 이유는 무엇입니까? 리모컨에 해당하는 로컬 리포지토리의 지점으로 자동 이동하지 않는 이유는 무엇입니까?
e-satis

3
@ e-satis : 로컬 지점을 원하면 로컬 지점을 확인하십시오. 이 둘이 반드시 동일 할 필요는 없음을 기억하십시오. 로컬 하나에 원격 하나를 병합 (또는 풀)하도록 지시해야합니다. 추적은 요청시 자동으로 당겨야하는 것을 알려줍니다. 분리 된 이유는 원격 브랜치가 원격 리포지토리에서 브랜치의 마지막 위치를 가리키는 포인터이기 때문입니다. 커밋하려고하면 원격 저장소가 변경되지 않으므로 원격 지점도 변경되지 않아야합니다.
Cascabel

1
좋아, 그것이 내가 얻지 못한 것 : 어떤 방법으로 이름이 지정된 로컬 브랜치를 갖는 것이 그것이 원격 브랜치와 동일하다는 것을 암시하지는 않습니다. SVN 배경에서 시작한 원인을 찾기가 정말 어렵습니다. :-) 고맙습니다. BTW, 어떻게 헤드리스 HEAD를 로컬 지점으로 이동하여 여기에 커밋합니까?
e-satis

3
@ e-satis : 일반적인 대답은 git rebase <branch> HEAD입니다. 이것은의 마지막 공통 조상 찾을 수 <branch>HEAD다음 거기에서 모든 커밋을 HEAD에 (을 리베이스)를 및 적용 <branch>. 본질적으로 패치로 패치를 적용하여이 작업을 수행하므로 두 분기가 실제로 다른 경우 충돌이 발생할 수 있습니다. 그러나 (즉, 당신이 올바른 장소에 있었고, 당신이 분리 된 것을 잊어 버렸습니다) <branch>조상의 경우 rebase는 단지 빨리 감기 병합입니다. HEADHEAD
Cascabel

3
이것은 잠시 동안 검색 한 후 내가 본 git HEAD에 대한 가장 명확하고 정확한 설명 중 하나입니다.
LarsH

21

나는 항상 HEAD~55 커밋에 가기를 의미 한다고 생각했다 . 그러나 명령의 GO 부분을 수행하지는 않습니다. 명령 의 참조 / 'where to' 부분 만 전달합니다 .

: 평신도 측면에서이 질문에 대답하는 데 사용 내가 가야를? 어느 커밋에?

  • HEAD 현재 커밋을 의미합니다.
  • HEAD~1 1 커밋 전 (참조)
  • HEAD~ ALSO는 (1) 커밋 전을 의미합니다.
  • HEAD~87 87 커밋 전에 의미 (참조)

용법:

  • git checkout HEAD~1 실제로 1 커밋 / 참조 전에 GO / 체크 아웃합니다.
  • git reset HEAD~3 변경 사항을 제거하지 않고 마지막 3 개의 커밋을 커밋 해제합니다. 즉, 마지막 3 개의 커밋에서 이루어진 모든 변경 사항을 함께 볼 수 있고, 마음에 들지 않거나 추가하지 않은 것을 제거하고 다시 커밋 할 수 있습니다.
  • git reset --hard HEAD~3마지막 커밋을 해제 하고 변경 사항을 제거합니다 . 변경 사항이 완전히 제거됩니다. 자세한 내용은 여기를 참조 하십시오 .
  • git diff HEAD~3 마지막 3 개의 커밋의 변경 사항 확인

3
내 대답으로 돌아 오는 :)
Honey

15

Git의 HEAD 포인터

힘내 HEAD라는 참조 변수를 유지합니다. 그리고 우리는이 변수를 포인터라고 부릅니다. 왜냐하면 그 목적은 저장소의 특정 커밋을 참조하거나 가리 키기 때문입니다. 새로운 커밋을 만들 때 포인터는 새로운 커밋을 가리 키도록 변경되거나 이동합니다. HEAD는 항상 우리 저장소의 현재 브랜치 팁을 가리 킵니다. 이제 이것은 준비 색인이나 작업 디렉토리가 아닌 저장소와 관련이 있습니다.

그것을 생각하는 또 다른 방법은 저장소의 마지막 상태 또는 마지막으로 체크 아웃 한 것입니다. 저장소가 중단 된 곳이나 마지막 상태이기 때문에 HEAD가 다음 커밋의 부모를 가리 키거나 말할 수 있습니다. 커밋 작성이 진행되는 곳.

카세트 테이프 레코더의 재생 및 레코드 헤드라고 생각하면 좋은 비유라고 생각합니다. 오디오 녹음을 시작하면 테이프가 헤드를 지나서 녹음됩니다. Stop을 누르면 레코드 헤드가 중지 된 곳이 Record를 두 번 누르면 다시 레코딩을 시작하는 위치입니다. 이제 이동할 수 있고 헤드를 다른 위치로 이동할 수 있습니다. 녹음을 다시 누르면 녹음이 시작됩니다.

Git의 HEAD 포인터는 매우 유사하므로 다음에 녹음을 시작할 위치를 가리 킵니다. 그것은 우리가 저지른 것들을 위해 우리 저장소에서 중단 한 곳입니다.


0

간단히 말해서 HEAD는 현재 체크 아웃 브랜치의 마지막 커밋에 대한 참조입니다.

HEAD를 "현재 분기"로 생각하십시오. git checkout으로 분기를 전환하면 HEAD 개정이 새 분기의 끝을 가리 키도록 변경됩니다.

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

cat .git/HEAD

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

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