힘내 HEAD 및 ORIG_HEAD


253

이 기호들은 무엇을 의미하며 무엇을 의미합니까?

(공식 문서에서 설명을 찾을 수 없습니다)


4
참고 : HEAD이제 (다음 git1.8.4) ' @'입니다! 아래에서 편집 한 답변
VonC 2016 년

참고 -bis : ' @'(for HEAD)은 (는 ) 계속오고 있지만 1.8.4 답변은 편집 및 수정 되지 않았습니다 .
VonC

1
참고 : ' @' HEADfor git 1.8.5 / 1.9로 돌아 왔습니다. 답변이 다시 수정되었습니다 .
VonC

21
HEAD그리고 ORIG_HEAD힘내에서처럼 $PWD$OLDPWD배쉬에서. :)
musiphil

답변:


324

HEAD현재 커밋에 대한 (직접 또는 간접, 즉 기호) 참조입니다. 작업 디렉토리에서 확인한 커밋 (변경 사항 또는 이와 동등한 사항이 아닌 한)은 "git commit"이 새 것을 만드는 커밋입니다. 일반적으로 HEAD이름이 지정된 다른 분기에 대한 기호 참조입니다. 이 지점은 현재 체크 아웃 된 지점 또는 현재 지점입니다. HEAD커밋을 직접 가리킬 수도 있습니다. 이 상태를 "분리 된 HEAD"라고하며 이름이없는 익명 분기에있는 것으로 이해 될 수 있습니다.

그리고 Git 1.8.5 이후로 @는 홀로 바로 가기입니다 HEAD.

ORIG_HEADHEAD위험한 상태 일 수있는 명령으로 설정하여 이전 상태 로 쉽게 되돌릴 수 있습니다. Git에 reflog가 있으므로 이제는 유용하지 않습니다. HEAD@{1}대충 같습니다 ORIG_HEAD( HEAD@{1}항상 마지막 값은 HEAD이고 위험한 작업 전의 ORIG_HEAD마지막 값입니다 HEAD).

자세한 내용은 git (1) 맨 페이지 , Git 사용 설명서 , Git 커뮤니티 북Git 용어집을 참조하십시오.


2
안녕하세요 자쿠 브. 설명은 +1입니다. HEAD @ {1}의 "거의 동등한"부분을 자세히 설명해 주시겠습니까? 나는 thread thread.gmane.org/gmane.comp.version-control.git/38379 (당신은 2007 년 2 월에 다시 왔음)에 대한 대답을 참조하며 , 당신이 주변에서 가지고있는 토론을 정확하게 이해하지 못했습니다. @ {...} 구문
VonC 2016 년

19
ORIG_HEAD는 HEAD를 하나 이상의 커밋으로 이동시키는 '위험한'명령에 의해서만 설정됩니다. 따라서 ORIG_HEAD가 항상 설정되는 것은 아니며 HEAD @ {1}이 항상 설정됩니다. @ {1}은 $ (git symbolic-ref HEAD) @ {1}입니다. 즉 HEAD reflog가 아닌 현재 브랜치에 reflog를 사용합니다.
Jakub Narębski

Riiight ... 나는 지금 그것을 얻는다 :) 그 설명에 감사드립니다. 그것의 가치에 대해, 나는 당신의 의견도 찬성했습니다!
VonC 2016 년

1
"그리고 HEAD는"git commit "이 새로운 것을 만들 것입니다. 또한 @VonC에서 '그것은 커밋 "git commit"빌드와 "git diff --cached"및 "git status"와 비교합니다.'
Minqi Pan

1
git help 개정판은 git-scm.com/docs/gitrevisions를 가져와 커밋을 참조하는 모든 방법을 설명합니다 ( HEAD및 포함 ORIG_HEAD).
dahlbyk

104

에서 자식 리셋

"풀"또는 "병합"은 항상 현재 분기의 원래 팁을에 둡니다 ORIG_HEAD.

git reset --hard ORIG_HEAD

열심히 재설정하면 인덱스 파일과 작업 트리가 해당 상태로 돌아가고 분기의 끝이 해당 커밋으로 재설정됩니다.

git reset --merge ORIG_HEAD

병합 결과를 검사 한 후 다른 분기의 변경 사항이 만족스럽지 않을 수 있습니다. " git reset --hard ORIG_HEAD"을 (를) 실행 하면 현재 위치로 돌아갈 수 있지만 원하지 않는 로컬 변경 사항은 삭제됩니다. " git reset --merge"는 로컬 변경 사항을 유지합니다.


패치가 적용되기 전에 ORIG_HEAD는 현재 분기의 끝으로 설정됩니다.
이 방법은 git am잘못된 분기 에서 ' '를 실행 하거나 사서함을 변경하여보다 쉽게 ​​수정되는 커밋의 오류 (예 : "보낸 사람 :"줄의 + 오류) 와 같은 여러 커밋에 문제가있는 경우에 유용합니다 .

또한 병합은 항상 ' .git/ORIG_HEAD'를 HEAD의 원래 상태로 설정 하므로 문제가있는 병합은 ' git reset ORIG_HEAD' 를 사용하여 제거 할 수 있습니다 .


참고 : 여기에서

HEAD는 움직이는 포인터입니다. 때로는 현재 분기를 의미하고 때로는 그렇지 않습니다.

따라서 HEAD는 이미 "현재 지점"과 동의어 가 아닙니다 .

HEAD는 git의 모든 곳 에서 "현재"를 의미 하지만 반드시 "현재 분기"(즉, 분리 된 HEAD)를 의미하지는 않습니다.

그러나 거의 항상 "현재 커밋"을 의미합니다.
커밋 " git commit"이 (가) 위에 구축되어 있으며 " git diff --cached"및 " git status"이 (가) 비교되었습니다.
현재 분기가 매우 제한된 상황에서만 의미합니다 (정확히 분기 이름이 작동하기를 원할 때 --- commit / rebase 등을 통해 분기 팁 재설정 및 성장).

Reflog는 시간과 시간을 거슬러 올라가는 차량으로, "현재"라는 개념과 흥미로운 상호 작용을합니다.

HEAD@{5.minutes.ago}"헤어 symref를 역 참조하여 현재 어떤 지점이 있는지 확인한 다음 5 분 전에 해당 지점의 끝이 어디에 있는지 확인하십시오."를 의미 할 수 있습니다.
또는 "5 분 전에 HEAD라고했던 커밋은 무엇입니까? 예를 들어"git show HEAD "를 수행 한 경우"를 의미 할 수 있습니다.


git1.8.4 (2013 년 7 월) 소개 새로운 표기법을 소개 했습니다!
(실제로 2013 년 4 분기 1.8.5 또는 1.9 일 것입니다 : commit 9ba89f4로 다시 도입 되었습니다 )

대신 네 개의 대문자 "을 입력하는 HEAD"당신은 말할 수있다 " @"지금,
예를 " git log @".

커밋 cdfd948 참조

HEAD특히 ' @'를 대신 사용할 수있는 경우 ' '를 입력하는 것은 지루 합니다.

' @' 를 선택하는 이유는 참조가없고 조작이없는 것을 제외하고는 ref@op구문 (예 :)에서 자연스럽게 뒤 따르기 때문에 ' ' HEAD@{u}를 사용하지 않는 것이 좋습니다 HEAD.

이제 우리는 ' git show @~1'를 사용할 수 있습니다 .

지금까지 ' @'은 (는) 유효한 이름이지만이 아이디어와 충돌하므로 유효하지 않게하겠습니다. 아마도이 이름을 사용한 사람은 거의 없을 것입니다.


1.8.4-RC3 기간 동안 블로그 게시물 (14 일, 2013 년 8 월)이 기능이 복귀 지연되었다 (감사합니다 발표 컵 케이크를 위한 헤드 업 ). 커밋 9ba89f4 (2013 년 9 월)
와 함께 다시 소개됩니다 .

commit 2c2b664를 참조하십시오 :

"새 @단축키 추가 HEAD"

커밋 cdfd948 은 " @"(그리고 수정자가 @{u}적용된 형식) 에만 적용되는 것이 아니라 " refs/heads/@/foo" 에도 영향을 미치므로 " "에 영향을 미칩니다 .

속기의 기본 개념이 좋을 수 있으며 나중에 주제를 다시 시도 할 수 있지만 다음 릴리스에서 현재 사용 사례에 영향을 미치지 않도록 되 돌리겠습니다.


git reset ORIG_HEAD를 실행하고 커밋합니다. ORIG_HEAD는 여전히 HEAD 옆의 참조 아래에 있습니다. 왜 뷰에서 제거되지 않았습니까?
powder366

@ powder366하지만 a git reset는을 생성합니다 ORIG_HEAD. 따라서 rm수동으로해야합니다. 예를 들어 stackoverflow.com/a/12418078/6309 를 참조하십시오 .
VonC

1
@VonC @별칭이 HEAD되고있다 (임시?) 복귀 힘내 1.8.4 출시 ! 오늘 막 발표되었습니다!

"헤드 업"댓글을 즐겼습니다!
Robino

2

HEAD는 현재 분기를 가리키고 ORIG_HEAD는 "위험한"작업을 수행하기 전에 이전 HEAD를 저장하는 데 사용됩니다.

예를 들어 git-rebase 및 git-am은 변경 사항을 적용하기 전에 분기의 원래 팁을 기록합니다.


4
HEAD가 항상 현재 분기를 가리키는 것은 아닙니다 (분리 가능)
VonC

1
HEAD가 "분리"될 때 "현재 분기"는 무엇입니까?
cjs

@ CurtJ.Sampson "아니 지점"입니다. 그래서 분리 된 head에있을 때 git branch foo -b고아가 커밋 할 분기를 "만들기"위해해야합니다.
Royi Namir

1

보낸 사람 man 7 gitrevisions:

HEAD는 작업 트리의 변경 사항을 기반으로하는 커밋의 이름을 지정합니다. FETCH_HEAD는 마지막 git 페치 호출로 원격 저장소에서 페치 한 브랜치를 기록합니다. ORIG_HEAD는 HEAD를 과감한 방식으로 움직여서 작동하기 전에 HEAD의 위치를 ​​기록하는 명령에 의해 작성되므로 분기의 팁을 실행하기 전에 상태로 쉽게 변경할 수 있습니다. MERGE_HEAD는 git merge를 실행할 때 브랜치로 병합하는 커밋을 기록합니다. CHERRY_PICK_HEAD는 git cherry-pick을 실행할 때 체리 피킹하는 커밋을 기록합니다.

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