it-swarm.dev

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

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

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

내가 무엇을 잘못하고 있지?

EDIT [2010-04-09] : 몇 번 확인했는데 다른 지점에 있지 않습니다. 'git fetch'다음에 'git merge'(위 그림 참조)가 git pull과 똑같은 일을해야합니까? 자식 상태 등의 결과를 보여주는 워크 플로우를 얻습니다.

111
kaybenleroll

지점을 가져 오지 않고 전체 리모콘을 가져옵니다.

git fetch Origin
git merge Origin/an-other-branch
168
Gareth

하나의 지점 만 선택 : fetch/mergevs.pull

사람들은 종종 "가져 오기"와 "병합"을 분리하라고 조언합니다. 그들은 이것 대신에 말합니다 :

_    git pull remoteR branchB
_

이 작업을 수행:

_    git fetch remoteR
    git merge remoteR branchB
_

그들이 언급하지 않은 것은 그러한 페치 명령이 실제로 원격 리포지토리에서 all 브랜치를 페치한다는 것입니다. not 해당 풀 명령의 기능입니다. 원격 저장소에 수천 개의 지점이 있지만 모든 지점을보고 싶지 않은 경우이 모호한 명령을 실행할 수 있습니다.

_    git fetch remoteR refs/heads/branchB:refs/remotes/remoteR/branchB
    git branch -a  # to verify
    git branch -t branchB remoteR/branchB
_

물론, 그것은 엄청나게 기억하기 어렵 기 때문에 모든 브랜치를 가져 오기를 피하고 싶다면 ProGit에 설명 된대로 _.git/config_를 변경하는 것이 좋습니다.

응?

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

먼저 용어를 정리해야합니다. 원격 지점 추적의 경우 일반적으로 다음 3 가지 지점을 알고 있어야합니다.

  1. 원격 저장소의 지점 : 다른 저장소 내부의 _refs/heads/branchB_
  2. 귀하의 원격 추적 지점 : _refs/remotes/remoteR/branchB_ in your repo
  3. 자신의 지점 : _refs/heads/branchB_ inside your repo

_refs/remotes_에있는 원격 추적 분기는 읽기 전용입니다. 직접 수정하지 마십시오. 자신의 브랜치를 수정 한 다음 원격 리포지토리의 해당 브랜치로 푸시합니다. 적절한 끌어 오기 또는 가져 오기가 완료 될 때까지 _refs/remotes_에 결과가 반영되지 않습니다. _refs/heads/branchB_가 _.git/config_를 정의 할 때 로컬 분기 (_branch.branchB.remote = remoteR_)가 원격 추적 분기를 "추적"한다고했기 때문에 git 맨 페이지를 이해하기가 어렵습니다. .

'refs'를 C++ 포인터로 생각하십시오. 물리적으로 파일은 SHA 요약을 포함하는 파일이지만 기본적으로 커밋 트리에 대한 포인터입니다. _git fetch_는 커밋 트리에 많은 노드를 추가하지만 git이 이동할 포인터를 결정하는 방법은 약간 복잡합니다.

다른 답변 에서 언급했듯이

_    git pull remoteR branchB
_

...도 아니다

_    git fetch remoteR branchB
_

_refs/remotes/branches/branchB_로 이동하고 후자는 _refs/heads/branchB_으로 이동할 수 없습니다. 그러나 둘 다 _FETCH_HEAD_로 이동하십시오. (_.git/_에있는 파일 중 cat을 (를) 변경하면 볼 수 있습니다.) _git merge_은 _FETCH_HEAD_을 참조하고 _MERGE_ORIG_, = etc.

67
cdunn2001

지역 an-other-branch 병합 할 때?

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

다른 설명 :

병합하려는 지점의 모든 변경 사항이 이미 현재있는 지점으로 병합되었습니다.
더 구체적으로 말하면 병합하려는 지점이 현재 지점의 부모임을 의미합니다.

한 번의 커밋으로 원격 리포지토리보다 앞서있는 경우 사용자가 아닌 오래된 리포지토리입니다.

하지만 귀하의 경우 git pull 작동합니다. 그것은 당신이 올바른 지점에 있지 않다는 것을 의미합니다.

9
VonC

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

당신은 올바른 지점에 있습니까?

3
RDL

다음은 명령입니다.

git fetch Origin
git merge Origin/somebranch somebranch

두 번째 줄 에서이 작업을 수행하면 :

git merge Origin somebranch

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

내가 이해 한 것처럼, 당신은 이미 로컬로 가져 와서 분기를 최신 same 분기로 병합하려고합니다.

1
user1524957