분기 하나만 선택 : fetch
/ merge
vs. pull
사람들은 종종 "가져 오기"와 "병합"을 분리하라고 조언합니다. 대신 다음과 같이 말합니다.
git pull remoteR branchB
이 작업을 수행:
git fetch remoteR
git merge remoteR branchB
그들이 언급하지 않은 것은 그러한 가져 오기 명령이 실제로 원격 리포지토리에서 모든 분기를 가져 오는 것이며 , 이는 가져 오기 명령이 수행 하는 작업이 아닙니다 . 원격 저장소에 수천 개의 브랜치가 있지만 모든 브랜치를보고 싶지 않은 경우 다음 모호한 명령을 실행할 수 있습니다.
git fetch remoteR refs/heads/branchB:refs/remotes/remoteR/branchB
git branch -a # to verify
git branch -t branchB remoteR/branchB
물론, 그것은 엄청나게 기억하기 어렵 기 때문에 정말로 모든 브랜치를 가져 오는 것을 피하고 싶다면 .git/config
ProGit에 설명 된대로 변경하는 것이 좋습니다 .
어?
이 모든 것에 대한 가장 좋은 설명은 ProGit, Git Internals-The Refspec의 9-5 장 ( 또는 github를 통해 )에 있습니다. Google을 통해 찾기가 놀랍도록 어렵습니다.
먼저 몇 가지 용어를 정리해야합니다. 원격 분기 추적의 경우 일반적으로 알아야 할 세 가지 분기가 있습니다.
- 원격 저장소의 분기 :
refs/heads/branchB
다른 저장소 내부
- 귀하의 원격 추적 브랜치 :
refs/remotes/remoteR/branchB
에서 당신 의 repo
- 자신의 지점 :
refs/heads/branchB
내부 당신 의 repo
원격 추적 분기 ( refs/remotes
)는 읽기 전용입니다. 직접 수정하지 마십시오. 자체 분기를 수정 한 다음 원격 저장소의 해당 분기로 푸시합니다. 결과는 refs/remotes
적절한 가져 오기 또는 가져 오기가 완료 될 때까지 반영되지 않습니다 . 그 구분은 주로 로컬 브랜치 () 때문에 git 맨 페이지에서 이해하기 어려웠습니다.refs/heads/branchB
)가 .git/config
정의 할 때 원격 추적 브랜치를 "추적"한다고 말했기branch.branchB.remote = remoteR
입니다.
'refs'를 C ++ 포인터로 생각하십시오. 물리적으로 이들은 SHA 다이제스트를 포함하는 파일이지만 기본적으로 커밋 트리에 대한 포인터 일뿐입니다.git fetch
커밋 트리에 많은 노드를 추가하지만 git이 이동할 포인터를 결정하는 방법은 약간 복잡합니다.
에서 언급 한 바와 같이 다른 답변 , 어느 쪽도 없습니다
git pull remoteR branchB
...도 아니다
git fetch remoteR branchB
움직일 refs/remotes/branches/branchB
것이고, 후자는 확실히 움직일 수 없습니다 refs/heads/branchB
. 그러나 둘 다 FETCH_HEAD
. ( cat
내부 .git/
에서 이러한 파일 중 어느 것이 든 변경되는시기를 확인할 수 있습니다.) 그리고 , 설정 중 등을git merge
참조합니다 .FETCH_HEAD
MERGE_ORIG
git fetch origin an-other-branch
가져온 팁을에 저장FETCH_HEAD
하지만 저장 하지 않습니다origin/an-other-branch
(예 : 일반적인 '원격 추적 분기'). 따라서 할 수는git fetch origin an-other-branch && git merge FETCH_HEAD
있지만 @Gareth가 말한 것처럼하는 것이 더 좋습니다 (또는 git pull 사용 ).