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


221

git pull --help 말한다 :

기본 모드에서는 git pull약어가 git fetch뒤에옵니다 git merge FETCH_HEAD.

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


3
참고 : git 1.8.4 (2013 년 8 월) 이후로 git fetch origin master는 실제로 origin/master뿐만 아니라 업데이트됩니다 FETCH_HEAD. 참조 stackoverflow.com/a/20967347/6309
VonC

git merge FETCH_HEADGit 2.5, 2015 년 2 분기 이후) 에 대한 자세한 내용 은 stackoverflow.com/a/30425991/6309
VonC

답변:


218

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내부적으로 사용하여 이름을 지정하지 않고 가져온 단일 참조를 가져 오는 것과 약간 비슷 합니다 .


9
@Jefromi : 죄송합니다, 잘못 생각합니다 : 내가 아는 한, 브런치 git fetch뿐만 아니라 원격 저장소에서 모든 객체 데이터를 업데이트 (병합)합니다 . 그래서 나는 당신의 대답에서 git이 어떤 지점을 가리킬지를 어떻게 결정하는지 이해하지 못합니다 . 또한 자식 문서 (예가 아닌 정의)를 찾을 수 없습니다 . 의 존재를 더 해결 방법처럼 나에게 외모, 만드는 일을 어떻게 든 . FETCH_HEADFETCH_HEADFETCH_HEADgit pull
Alexey

14
Alexey : 로컬 저장소 구성에서 FETCH_HEAD지정한 원격 분기의 팁에 해당 branch.<BRANCH>.merge합니다. 따라서 fetch실제로 원격 스토리지에서 모든 객체 데이터를 가져 오는 동안 FETCH_HEAD로컬 브랜치가 추적 한 원격 브랜치의 위치를 ​​나타내는 데 사용됩니다. 로컬에있는 경우 그래서 master지점 및 실행 git fetch, 그리고 branch.master.merge포인트 refs/heads/master, 다음 FETCH_HEAD과 같은 값이됩니다 origin/master즉시 가져 오기 작업 후입니다.
larsks

4
@alexy FETCH_HEAD는 매뉴얼 페이지에서 git fetch에 대한 설명의 두 번째 단락에 설명되어 있습니다. 내 대답은 맞습니다. 그리고 인수없이 git fetch는 기본 원격에 대한 모든 원격 분기를 업데이트하지만 병합과 동일하지는 않습니다.
Cascabel

4
FETCH_HEAD를 통해 모든 원격 지점을 가져 오면 어떻게 git fetch -a됩니까?
stigi

2
@stigi 현재 체크 아웃 된 분기가 git config에서 가리키는 원격 추적 분기의 팁. 위의 의견에서 larsks의 답변을 참조하십시오.
Ankur Agarwal

19

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

1
내 5 센트를 추가합니다. 나를 혼란스럽게 한 것은 "변경 없음"을 반환하는 새로운 가져 오기를 수행하더라도 (이클립스에서) 내 FETCH_HEAD가 최신 커밋 뒤에 있다는 것입니다. 그 이유는 마지막 가져 오기 이후의 모든 변경 사항이 본인의 것이며 서버가 서버에 푸시했기 때문이라고 생각합니다. 따라서 후속 페치는 수행 할 작업이 없었으며 FETCH_HEAD도 업데이트하지 않았습니다. 이것이 이것이 GIT 또는 Eclipse Git 구현의 단점인지 확실하지 않습니다.
Torge

11

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는 기본적으로 현재 체크 아웃 된 분기의 원격 버전에 해당합니다.


9

나는 방금 발견하고 사용했습니다 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의 가비지 콜렉션을 남겨 서버에서 사본을 처리하는 좋은 방법 일 수 있습니다. (서버에 버그 수정 전체가 포함 된 멋진 태그 지정 커밋이 있다고 가정합니다!)


재미있는 피드백. +1
VonC

감사. 2 년 전에 FETCH_HEAD를 처음 발견했을 때 작성된 원래 게시물을 편집했습니다. Refspec의 source : dest 구문 대신 FETCH_HEAD를 사용하여 태그를 복사하는 것이 좋습니다. FETCH_HEAD를 어떻게 사용할 수 있는지 더 좋은 예를 들어 보았기를 바랍니다.
Ivan

3

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


3
@manjolds, " 가져온 것의 헤드 커밋 "은 무엇을 의미 합니까? Git은 모든 것을 가져옵니다.
Alexey

에서 @Alexey 자식 수동 : git-scm.com/docs/git-fetch : 함께 그들이 가리 개체 이름으로, 페치 심판의 이름은, .git / FETCH_HEAD에 기록됩니다
PJ_Finnegan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.