카테고리 보관물: Git

Git

원격 추적 분기 (예 : ‘git pull’)에서 ‘git fetch’및 ‘git merge’를 어떻게 수행합니까? an-other-branch git merge origin/an-other-branch 이 작업을 수행 할 때마다

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 상태 등의 결과를 보여주는 워크 플로가 표시됩니다.



답변

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

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


답변

분기 하나만 선택 : 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


답변

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

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

다른 설명 :

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

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

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


답변

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

올바른 지점에 있습니까?


답변

다음은 명령입니다.

git fetch origin
git merge origin/somebranch somebranch

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

git merge origin somebranch

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

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


답변