IT

Git의 FETCH_HEAD는 무엇을 의미합니까?

lottoking 2020. 5. 14. 08:22
반응형

Git의 FETCH_HEAD는 무엇을 의미합니까?


git pull --help 말한다 :

기본 모드에서 git pull은 git fetch의 약어이며 git merge FETCH_HEAD입니다.

이것은 FETCH_HEAD무엇이며 실제로 합병되는 것은 무엇 git pull입니까?


FETCH_HEAD원격 저장소에서 가져온 내용을 추적하기위한 단기 참조입니다. 보통은 원격에서 브랜치를 가져 오는 git pull첫 번째 호출 git fetch; FETCH_HEAD이 분기의 끝을 가리 킵니다 (분기와 마찬가지로 커밋의 SHA1을 저장합니다). git pull그런 다음 현재 분기에 git merge병합하여을 호출합니다 FETCH_HEAD.

결과는 정확히 예상 한 것입니다. 적절한 원격 분기의 끝에있는 커밋이 현재 분기의 끝에있는 커밋에 병합됩니다.

이것은 git fetch인수 (또는 git remote update)를 사용 하지 않고 모든 원격 브랜치를 업데이트 한 다음 실행 git merge origin/<branch>하지만 FETCH_HEAD내부적으로 내부 참조를 사용 하여 이름을 지정할 필요없이 가져온 단일 참조를 가져 오는 것과 약간 비슷 합니다 .


FETCH_HEAD는 해당 페치가 페치 명령을 사용하여 직접 시작되었는지 풀의 일부로 시작되었는지에 관계없이 마지막 페치의 팁에 대한 참조입니다. FETCH_HEAD의 현재 값은 .git폴더에 이름이 지정된 파일로 저장됩니다 FETCH_HEAD.

그래서 내가 발행하면 :

git fetch https://github.com/ryanmaxwell/Fragaria

FETCH_HEAD는 다음을 포함 할 수 있습니다

3cfda7cfdcf9fb78b44d991f8470df56723658d3        https://github.com/ryanmaxwell/Fragaria

원격 저장소를 원격 추적 지점으로 구성한 경우 추적 지점을 병합하여 가져 오기를 수행 할 수 있습니다. 그렇지 않으면 FETCH_HEAD를 사용하여 마지막 페치 팁을 직접 병합 할 수 있습니다.

git merge FETCH_HEAD

Jonathan의 답변 에서 언급했듯이 FETCH_HEAD는 파일에 해당합니다 .git/FETCH_HEAD. 일반적으로 파일은 다음과 같습니다.

71f026561ddb57063681109aadd0de5bac26ada9                        branch 'some-branch' of <remote URL>
669980e32769626587c5f3c45334fb81e5f44c34        not-for-merge   branch 'some-other-branch' of <remote URL>
b858c89278ab1469c71340eef8cf38cc4ef03fed        not-for-merge   branch 'yet-some-other-branch' of <remote URL>

하나를 제외한 모든 가지가 어떻게 표시되는지 확인하십시오 not-for-merge. 이상한 점은 가져 오기 전에 체크 아웃 한 지점입니다. 요약하면 : FETCH_HEAD는 기본적으로 현재 체크 아웃 된 분기의 원격 버전에 해당합니다.


나는 방금 발견하고 사용했습니다 FETCH_HEAD. 서버에서 일부 소프트웨어의 로컬 사본을 원했고

git fetch gitserver release_1

gitservergit 저장소를 저장하는 내 컴퓨터의 이름입니다. release_1소프트웨어 버전의 태그입니다. 놀랍게도 release_1내 로컬 컴퓨터에서 찾을 수 없었습니다. 나는 입력해야했다

 git tag release_1 FETCH_HEAD 

원격 저장소에서 로컬로 태그 지정된 커밋 체인 (release_1) 의 사본을 완료합니다 . 가져 오기는 내 로컬 컴퓨터에 커밋 복사, 원격 태그를 발견했다고 하지 않았 로컬 태그를 만들었지 만 설정했다 FETCH_HEAD내가 찾아서 사용할 수 있도록 커밋의 값. 그런 다음 FETCH_HEAD리모컨의 태그와 일치하는 로컬 태그를 만들었습니다. 그것은 무엇이 무엇 FETCH_HEAD이고 어떻게 사용될 수 있는지에 대한 실용적인 그림이며 , git fetch가 왜 순진하게 기대하는 것을하지 않는지 궁금해하는 다른 사람에게 유용 할 수 있습니다.

내 의견으로는 그것은 그 목적을 위해 피하는 것이 가장 좋으며 내가하려는 것을 성취하는 더 좋은 방법은

git fetch gitserver release_1:release_1

즉, release_1을 가져 와서 release_1을 로컬로 호출합니다. (출처 : dest, https://git-scm.com/book/en/v2/Git-Internals-The-Refspec 참조 ; 다른 이름을 지정하려는 경우를 대비하여!)

FETCH_HEAD그래도 때때로 사용하고 싶을 수도 있습니다 .

git fetch gitserver bugfix1234
git cherry-pick FETCH_HEAD

Git 서버에서 버그 수정 번호 1234를 사용하고 수정 사항이 현재 지점에서 체리 픽 선택되면 Git의 가비지 콜렉션을 남겨 서버에서 사본을 처리하는 좋은 방법 일 수 있습니다. (서버에 버그 수정 전체가 포함 된 멋진 태그 지정 커밋이 있다고 가정합니다!)


git pull은 페치와 병합의 조합입니다. git fetch가 발생하면 FETCH_HEAD에서 가져온 것의 헤드 커밋 (.git에 해당 이름의 파일 만)을 기록한 다음 이러한 커밋이 작업 디렉토리에 병합됩니다.

참고 URL : https://stackoverflow.com/questions/9237348/what-does-fetch-head-in-git-mean

반응형