먼저 질문에 약간의 오해가 있음을 참고하십시오. origin / HEAD는 remote의 기본 분기 , 즉 origin을 호출하는 해당 원격 저장소 에있는 HEAD를 나타냅니다 . 리포지토리에서 분기를 전환해도 영향을 미치지 않습니다. 원격 브랜치에서도 마찬가지입니다. 당신은 할 수 master
및 origin/master
당신의 repo에서 origin/master
의 로컬 복사본 나타내는 master
원격 저장소에 지점을.
원산지의 HEAD는 원격 저장소에서 실제로 변경 해야하는 경우에만 변경됩니다. 기본적으로 절대 발생하지 않아야합니다. 기본 지점은 공개 지점이 안정적인 지점 (아마도 마스터)에서 일정하게 유지되기를 원합니다. origin / HEAD는 원격 저장소에서 HEAD의 로컬 사본을 나타내는 로컬 참조입니다. (이름은 심판 / 원격 / 원산지 / HEAD입니다.)
위의 내용은 실제로 알고 싶었던 것에 대답하지만, 명시 적으로 요청한 질문에 대답하기 위해 ... 원본 / HEAD는 저장소를 복제 할 때 자동으로 설정되며 그에 관한 것입니다. 기괴하게도 다음 과 같은 명령으로 설정 되지 않았습니다git remote update
. 수동으로 변경하면 변경되는 유일한 방법은 믿습니다. (변경으로 나는 다른 브랜치를 가리킨다; 분명히 브랜치가 변경되면 커밋 / 가져 오기 / 원격 업데이트에서 발생할 수있는 변경을 가리키는 커밋.)
편집 : 아래 논의 된 문제는 Git 1.8.4.3 에서 수정되었습니다 . 이 업데이트를 참조하십시오 .
그러나 작은 경고가 있습니다. HEAD는 커밋을 직접 가리 키지 않고 분기를 가리키는 기호 참조이지만 git 원격 전송 프로토콜은 참조에 대한 커밋 만보고합니다. 따라서 Git은 HEAD와 다른 모든 참조가 가리키는 커밋의 SHA1을 알고 있습니다. 그런 다음 동일한 커밋을 가리키는 분기를 찾아 HEAD의 가치를 추론해야합니다. 이것은 두 개의 가지가 거기를 가리키면 모호하다는 것을 의미합니다. (가능한 경우 마스터를 선택한 다음 알파벳순으로 먼저 돌아갑니다.) 다음과 같은 결과가 표시됩니다 git remote show origin
.
$ git remote show origin
* remote origin
Fetch URL: ...
Push URL: ...
HEAD branch (remote HEAD is ambiguous, may be one of the following):
foo
master
이상하게도, HEAD의 개념이 이런 식으로 인쇄되면 원격에서 변경 사항이있을 경우 (예 : foo가 제거 된 경우) 변경되지만 실제로 업데이트되지는 않습니다 refs/remotes/origin/HEAD
. 이것은 정말 이상한 상황으로 이어질 수 있습니다. 위 예제에서 origin / HEAD가 실제로 foo를 가리키고 나서 origin의 foo 분기가 제거되었다고 가정하십시오. 그런 다음이 작업을 수행 할 수 있습니다.
$ git remote show origin
...
HEAD branch: master
$ git symbolic-ref refs/remotes/origin/HEAD
refs/remotes/origin/foo
$ git remote update --prune origin
Fetching origin
x [deleted] (none) -> origin/foo
(refs/remotes/origin/HEAD has become dangling)
따라서 원격 쇼는 HEAD가 마스터임을 알고 있지만 아무것도 업데이트하지 않습니다. 오래된 푸 지사가 제대로 정리하고, HEAD는 (존재하지 않는 지점을 가리키는) 매달려된다, 그것은 여전히 마스터를 가리 키도록 업데이트하지 않습니다. 이 문제를 해결하려면 git remote set-head origin -a
위와 같이 원점의 HEAD를 자동으로 결정한 다음 실제로 원점 / HEAD를 적절한 원격 분기를 가리 키도록 설정합니다.
refs/origin/HEAD
입니다. 리포지토리 자체의 심볼릭 참조HEAD
가 어떻게 설정되는지에 관한 것이 아닙니다 .