"git branch -r"을 실행할 때 왜 "origin / HEAD"가 표시됩니까?


160

당신은 git branch -r왜 불꽃이 나열 origin/HEAD됩니까? 예를 들어 GitHub에는 master와 굉장한 기능의 두 가지 분기가있는 원격 저장소가 있습니다. 내가 할 경우 git clone그것을 잡아하고 나의 새로운 디렉토리로 가서 가지를 나열하려면,이를 참조하십시오

$ git branch -r
origin/HEAD
origin/master
origin/awesome-feature

또는 순서에 관계없이 (알파? 무고한 저장소의 신원을 비밀로 유지하기 위해이 예를 위조하고 있습니다). 그래서 HEAD사업은 무엇입니까? 그것은 마지막 사람이 무엇인가 push자신했다 HEAD그들이 추진하는 경우에 지적을? 그것이 항상 그들이 무엇을 push먹고 있지 않습니까? HEADs HEAD다른 곳에서 누군가가 지적한 것을 신경 쓰는 이유는 무엇 입니까?

원격 추적 등을 처리하고 있기 때문에 이것은 혼란스러운 것 중 하나입니다. 감사!

편집 : 나는 전용 원격 저장소 (GitHub와 같은 사람은 아무도 코드를 작성하지 않고 밀어 넣거나 밀어 넣는 등)가 없었으며 기본적으로 HEAD가 없어야한다는 인상을 받았습니다. 작업 사본이 없습니다. 별로?


답변:


140

@robinst 가 맞습니다.

git에서는 기본적으로 체크 아웃 할 분기를 선택할 수 있습니다 (예 : 복제 할 때). 기본적으로 origin/HEAD그 점을 가리 킵니다.

GitHub의 GitHub 리포지토리 에 대한 관리자 설정에서이를 변경할 수 있습니다 . 명령 줄에서 다음을 통해 수행 할 수도 있습니다.

git remote set-head origin trunk

또는 전체를 통해 삭제

git remote set-head origin -d

. 'Switch Branches'드롭 다운을보십시오. 다음과 같이 trunk확인 origin/HEAD됩니다 trunk.


내가 할 다른 원격 개명 origin내이 otherremote/HEAD -> master날 귀찮게했다. 당신의 명령을 실행하면 나를 위해 그것을 고쳤습니다.
Felipe Alvarez

59

베어 리포지토리에 HEAD가있을 수있는 이유는 리포지토리 복제 후 처음으로 체크 아웃 한 분기를 결정하기 때문입니다.

일반적으로 HEAD는 마스터를 가리키며 사람들이 저장소를 복제 할 때 체크 아웃되는 분기입니다. 베어 브랜치 저장소에서 HEAD를 편집하여 다른 브랜치로 설정하면 해당 브랜치가 클론에서 체크 아웃됩니다.


2
밀지 않고이 참조를 제거 할 수 있기 때문에 origin/HEAD로컬 참조가 올바른가요? 제거하면 어떤 영향을 미칩니 origin까?
Zach Posten

@zposten : 아니요. 삭제 origin/master는 리모컨에 영향을 미치지 않는 것과 같은 방식입니다 .
robinst

즉, 복제 후 참조는 쓸모없는 정보 일뿐입니다.
Bachsau

@Bachsau 참조가 복제되지 않습니다.
robinst

27

전용 원격 저장소 (GitHub와 같이 아무도 코드를 넣지 않고 밀어 넣지 만 밀어 넣는 등)는 기본적으로 작동하지 않기 때문에 HEAD가 없어야한다는 인상을 받았습니다. 부. 별로?

당신이 말한 것과 똑같은 인상을 받았습니다.

그리고 심지어 github에서 복제 한 원산지 / HEAD 원격 추적 분기를 삭제할 수 없습니다

git branch -d -r origin/HEAD

이것은 효과가 없었습니다.

누군가 원산지 / HEAD 원격 추적 분기를 삭제하는 방법을 알려줄 수 있습니까?

최신 정보

github에서 복제 할 때 생성 된 원산지 / HEAD가있는 이유를 찾지 못했지만 삭제하는 방법을 찾았습니다.

git의 새로운 버전은

git remote set-head <name> -d

원격 추적 분기의 쓸모없는 HEAD 포인터를 삭제합니다.

또한 벙어리 기본 이름 인 'origin'을 원하는대로 변경할 수 있습니다.

git remote rename origin <new_name>

이것이 도움이되기를 바랍니다. :)


같은 문제가 발생하고 (GitHub에서도) 셋 헤드가 작동하지 않았습니다. 'git remote set-head HEAD -d'를 실행해야합니까?
Joost Schuur

5
@Joost : 그것은git remote set-head origin -d
znq

13

당신은 맞아요 로 밀어 그들이 작업 디렉토리가없는 경우가있을 때 전용 원격의 repos이 훨씬 더 잘 작동, 즉, '베어'. Git의 아키텍처는 분산 VCS에서 의미가있는 패치 또는 pull( fetch) 로 업데이트하도록 설계되었습니다 . 문서가 어딘가에서 말했듯이 현재 체크 아웃 된 지점으로 밀면 "예기치 않은 결과"가 발생할 수 있습니다 .

HEAD는 유효한 저장소에 대한 요구 사항의 일부입니다. Git 리포지토리 레이아웃 은 다음과 같이 말합니다.

HEAD

A symref (see glossary) to the refs/heads/ namespace describing the currently active  
branch. It does not mean much if the repository is not associated with any working tree  
(i.e. a bare repository), but a valid git repository must have the HEAD file; some  
porcelains may use it to guess the designated "default" branch of the repository  
(usually master). It is legal if the named branch name does not (yet) exist.

따라서 "그다지 의미가 없다 ..."라고해도 HEAD를 분기 목록의 일부로 보게 될 것입니다.


이것은 말이되지 않습니다. 리포지토리는 맨손으로 시작하지만 무언가를 푸시하는 순간 더 이상 베어지지 않으며 "git branch"를 실행하면 현재 체크 아웃 된 브랜치를 표시합니다.
geoidesic

@geoidesic 저장소를 밀었더라도 저장소가 노출 될 수 있습니다. 다음은 mkdir foobar; cd foobar; git init --bare; cd ..; git clone foobar foobar_clone; cd foobar_clone; touch file; git add file; git config --global user.email "you@example.com"; git config --global user.name "Your Name"; git commit -m "test"; git push origin master; cd ..; cd foobar; git config core.baretrue를 출력합니다. 또한 해당 명령에 대해 foobar 저장소에 푸시 된 파일의 작업 사본이 없습니다.
Anders Lindén 2016 년

@geoidesic 저장소를 밀었더라도 저장소가 손상 될 수 있습니다. 다음은 mkdir foobar; cd foobar; git init --bare; cd ..; git clone foobar foobar_clone; cd foobar_clone; touch file; git add file; git config user.email "you@example.com"; git config user.name "Your Name"; git commit -m "test"; git push origin master; cd ..; cd foobar; git config core.baretrue를 출력합니다. 또한 해당 명령에 대해 foobar 저장소에 푸시 된 파일의 작업 사본이 없습니다.
Anders Lindén

@geoidesic --bare git repo는 작업 트리가없는 저장소, 즉 .git-directory 만 포함하지만 체크 아웃 된 파일을 전혀 가질 수없는 저장소를 의미합니다. 체크 아웃 된 파일을 가질 수 없으므로 실제로는 .git 디렉토리가 없으므로 모든 .git 파일을 기본 디렉토리에 직접 넣습니다. 하나를 만들면 볼 수 있습니다!
00prometheus

5

"origin"이 원격 저장소 인 경우 origin / HEAD는 해당 원격 저장소의 기본 분기를 식별합니다.

예:

$ git remote show
origin
$ git remote show origin
* remote origin
  Fetch URL: git@github.com:walkerh/pipe-o-matic.git
  Push  URL: git@github.com:walkerh/pipe-o-matic.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (fast-forwardable)

"HEAD branch : master"라는 줄을 적어 둡니다. 이것은 원격 저장소가 클라이언트가 기본적으로 어느 브랜치를 체크 아웃 할 것인지를 알려주는 곳입니다.


1

원격 저장소의 현재 체크 아웃 된 분기 를 가리키는 HEAD가 항상 있습니다 (마스터 일 수도 있고 아닐 수도 있음). 원격 저장소에도 현재 분기가 있습니다. 일반적으로 마스터이며 내 머리 꼭대기에서 나는 그것을 바꾸고 싶은 이유를 생각할 수 없지만 바꿀 수는 있습니다.


2
github repos는 분기를 체크 아웃하지 않았습니다. 이것이 왜 적용되는지 모르겠습니다.
더스틴

원격 저장소에는 작업 디렉토리가 없어야합니다. 원격 리포지토리는 --bare이어야하며 현재 체크 아웃 된 분기를 가질 수 없습니다.
n4rzul

-14

내 생각에 누군가가 지점을 밀고 그것을 HEAD라고 불렀습니다.

git push origin HEAD

이 문제에 대한 의견을 얻을 수 있습니까? github에서 원산지 / 헤드를 원한다면 그것이 내가 얻는 유일한 방법입니다.
더스틴

원격 HEAD는 상징적 참조입니다 (일반적으로 심판 / 헤드 / 마스터). 심볼릭 참조를 현재 브랜치 커밋의 해시 ID로 대체합니다.
Daniel Fanjul

2
추측에 대해 부정확 한 답변이 아닌 의견으로 논의해서는 안됩니까?
Luciano
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.