git pull --help
말한다 :
기본 모드에서는
git pull
약어가git fetch
뒤에옵니다git merge FETCH_HEAD
.
이것은 FETCH_HEAD
무엇이며 실제로 병합되는 것은 무엇입니까 git pull
?
git merge FETCH_HEAD
Git 2.5, 2015 년 2 분기 이후) 에 대한 자세한 내용 은 stackoverflow.com/a/30425991/6309
git pull --help
말한다 :
기본 모드에서는
git pull
약어가git fetch
뒤에옵니다git merge FETCH_HEAD
.
이것은 FETCH_HEAD
무엇이며 실제로 병합되는 것은 무엇입니까 git pull
?
git merge FETCH_HEAD
Git 2.5, 2015 년 2 분기 이후) 에 대한 자세한 내용 은 stackoverflow.com/a/30425991/6309
답변:
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
내부적으로 사용하여 이름을 지정하지 않고 가져온 단일 참조를 가져 오는 것과 약간 비슷 합니다 .
git fetch
뿐만 아니라 원격 저장소에서 모든 객체 데이터를 업데이트 (병합)합니다 . 그래서 나는 당신의 대답에서 git이 어떤 지점을 가리킬지를 어떻게 결정하는지 이해하지 못합니다 . 또한 자식 문서 (예가 아닌 정의)를 찾을 수 없습니다 . 의 존재를 더 해결 방법처럼 나에게 외모, 만드는 일을 어떻게 든 . FETCH_HEAD
FETCH_HEAD
FETCH_HEAD
git pull
FETCH_HEAD
지정한 원격 분기의 팁에 해당 branch.<BRANCH>.merge
합니다. 따라서 fetch
실제로 원격 스토리지에서 모든 객체 데이터를 가져 오는 동안 FETCH_HEAD
로컬 브랜치가 추적 한 원격 브랜치의 위치를 나타내는 데 사용됩니다. 로컬에있는 경우 그래서 master
지점 및 실행 git fetch
, 그리고 branch.master.merge
포인트 refs/heads/master
, 다음 FETCH_HEAD
과 같은 값이됩니다 origin/master
즉시 가져 오기 작업 후입니다.
FETCH_HEAD
를 통해 모든 원격 지점을 가져 오면 어떻게 git fetch -a
됩니까?
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
gitserver
git 저장소를 저장하는 내 컴퓨터의 이름입니다.
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에 해당 이름의 파일 만)을 기록한 다음 이러한 커밋이 작업 디렉토리에 병합됩니다.
git fetch origin master
는 실제로origin/master
뿐만 아니라 업데이트됩니다FETCH_HEAD
. 참조 stackoverflow.com/a/20967347/6309