원격 추적 분기 (예 : 'git pull')에서 'git fetch'및 'git merge'를 어떻게 수행합니까?


111

git에 원격 추적 분기를 설정했지만 'git fetch'로 업데이트하면 로컬 분기에 병합 할 수없는 것 같습니다.

예를 들어 'an-other-branch'라는 원격 분기가 있다고 가정합니다. 나는 그것을 사용하여 추적 분기로 로컬로 설정했습니다.

git branch --track an-other-branch origin/an-other-branch

여태까지는 그런대로 잘됐다. 그러나 해당 분기가 업데이트되고 (일반적으로 컴퓨터를 이동하고 해당 컴퓨터에서 커밋하여) 원래 컴퓨터에서 업데이트하고 싶다면 가져 오기 / 병합에 문제가 발생합니다.

git fetch origin an-other-branch
git merge origin/an-other-branch

이 작업을 수행 할 때마다 '이미 최신 상태'라는 메시지가 표시되고 아무것도 병합되지 않습니다.

그러나

git pull origin an-other-branch

항상 예상대로 업데이트합니다.

또한 git diff 실행

git diff origin/an-other-branch

차이가 있음을 보여 주므로 구문이 잘못되었다고 생각합니다.

내가 뭘 잘못하고 있죠?

편집 [2010-04-09] : 몇 번 확인했는데 확실히 다른 지점에 있지 않습니다. 내 'git fetch'다음에 'git merge'(위 그림 참조)가 git pull과 똑같은 작업을 수행해야합니까? git 상태 등의 결과를 보여주는 워크 플로가 표시됩니다.

답변:


170

분기를 가져 오지 않고 전체 리모컨을 가져옵니다.

git fetch origin
git merge origin/an-other-branch

8
자세한 내용 : 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 사용 ).
Chris Johnsen

그래서 오리진에 1000 개의 브랜치가 있다면 모두에 대한 원격 브랜치일까요?
Gauthier

4
확실한. 1000 개의 브랜치가있는 원격 저장소를 내 원격 저장소에 추가하고 원격에 어떤 브랜치가 있는지 물어 보면 1000
개를

것이다 git merge origin/an-other-branch병합 origin/an-other-branch을 추적하기 위해 설정된 모든 지역 지점에? 어떻게 하나의 로컬 브랜치로 병합 할 수 있습니까?
양서류

1
그래서 git pull(인수없이) 무엇을 하는가 -어느 분기가 병합됩니까? 현재 분기에 해당하는 원격 추적 분기를 병합합니까 ?
The Red Pea

69

분기 하나만 선택 : 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/configProGit에 설명 된대로 변경하는 것이 좋습니다 .

어?

이 모든 것에 대한 가장 좋은 설명은 ProGit, Git Internals-The Refspec의 9-5 장 ( 또는 github를 통해 )에 있습니다. Google을 통해 찾기가 놀랍도록 어렵습니다.

먼저 몇 가지 용어를 정리해야합니다. 원격 분기 추적의 경우 일반적으로 알아야 할 세 가지 분기가 있습니다.

  1. 원격 저장소의 분기 : refs/heads/branchB다른 저장소 내부
  2. 귀하의 원격 추적 브랜치 : refs/remotes/remoteR/branchB에서 당신 의 repo
  3. 자신의 지점 : 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_HEADMERGE_ORIG


1
Git 내부에 대한 링크가 동일한 질문에 대한 링크라는 것을 알고 있습니까?
Shahbaz

9

an-other-branch병합 할 때 로컬에 있습니까?

git fetch origin an-other-branch
git checkout an-other-branch
git merge origin/an-other-branch

다른 설명 :

병합하려는 브랜치의 모든 변경 사항은 이미 현재있는 브랜치에 병합되었습니다.
더 구체적으로 말하면 병합하려는 분기가 현재 분기의 부모임을 의미합니다.

한 번의 커밋으로 원격 저장소보다 앞서 있다면, 당신이 아니라 오래된 원격 저장소입니다.

그러나 귀하의 경우, git pull작동 한다면 귀하가 올바른 지점에 있지 않다는 것을 의미합니다.


3

Git pull은 실제로 콤보 도구입니다. git fetch (변경 사항 가져 오기) 및 git merge (현재 복사본과 병합)를 실행합니다.

올바른 지점에 있습니까?


나는 OP가 다른 것이라고 생각합니다. 가지, 나에게 일어난다.
Chaklader Asfak Arefe

1

다음은 명령입니다.

git fetch origin
git merge origin/somebranch somebranch

두 번째 줄에서 이렇게하면 :

git merge origin somebranch

로컬 마스터를 현재 브랜치에 병합하려고합니다.

내가 이해했듯이 질문은 이미 로컬에서 가져 왔고 이제 분기를 동일한 분기 의 최신 분기에 병합하려는 것 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.