'git pull origin mybranch'는 로컬 mybranch N이 원본보다 먼저 커밋합니다. 왜?


92

방금에 대해 이상한 점을 관찰했는데 git pull이해가 안됩니다.

금요일에는 지역 지부에서 일했습니다. 그것을 부르 자 mybranch. 사무실을 떠나기 전에 나는 그것을 origin (내 github repo)으로 밀었습니다 git push origin mybranch.

어제 집에서 pullmybranch를 랩톱으로 연결하고 더 많은 코딩을 한 다음 변경 사항을 github (origin)으로 다시 푸시했습니다.

이제 다시 일하고 있으며 어제 변경 사항을 내 작업 시스템으로 가져 오려고했습니다 (주말 동안 작업장의 로컬 저장소에서 아무것도 변경하지 않았습니다).

git pull origin mybranch

빨리 감기 병합이 발생했습니다. 그런 다음을했고 다음 git status과 같이 말했습니다.

# On branch mybranch
# Your branch is ahead of 'origin/mybranch' by 6 commits.
#
nothing to commit (working directory clean)

어? 주말 동안 건드리지 않고 원래에서 가져온 커밋이 6 개가 될 수 있습니까? 그래서 나는git diff origin/mybranch 했고 diff는 내가 방금 원격에서 가져온 6 가지 변경 사항이었습니다.

다음을 실행하여 "수정"할 수 있습니다 git fetch origin.

From git@github.com:me/project
af8be00..88b0738  mybranch -> origin/mybranch

분명히 내 로컬 저장소에 일부 참조 객체가 누락되었지만 어떻게 그럴 수 있습니까? 나는 풀은 이미 인출하지, 난 그 지점을 제외하고 아무것도에 일을하지 않았다, 소위, 의미 git fetch origingit fetch origin mybranch같은 결과를해야합니까?

git pull origin대신 항상 사용해야 git pull origin branchname합니까?

혼란 스럽습니다.


나는 이것도 알아 차렸다. git push도 ( "모든 최신에"보고) 그것을 해결하는 것 것입니다.
Ben James

4
git config --get-regexp br.*구성에 로컬 브랜치가 다른 브랜치를 추적하고 있는지 알려줄 수 있습니다
VonC

3
git config branch.master.remote yourGitHubRepo.gitworkRepo 를 입력 git pull origin하고 상태가 'ahead'경고로 남아 있는지 확인할 수 있습니까?
VonC

설정되지 않았습니다 (빈 출력). 하지만 git remote show origin원점이 내 GitHub 저장소를 가리키고 있다는 것을 보여 주므로 괜찮을 것 같아요?
Matthias

1
git remote 단독으로는 (GitHub 저장소에 대한 올바른 주소 표시) 충분하지 않습니다 . Your branch is ahead뒤에 " "경고 메시지가 표시 되지 않도록하려면 git pull먼저 분기에 대한 원격 이름 정의 해야합니다 . 따라서 내 제안 :을 입력 git config branch.master.remote yourGitHubRepo.git한 다음 a git pull와 a 를 시도 git status하고 문제가 남아 있는지 확인하십시오.
VonC

답변:


115

git pullgit fetch명시 적으로 가져온 헤드 (또는 병합을 위해 구성된 원격 분기가없는 경우)를 현재 분기로 병합하기 전에 적절한 매개 변수로 호출합니다 .

구문 : git fetch <repository> <ref>where <ref>is just a branch name with colon without colon is a 'one shot'fetch that do not do a standard fetch of all the tracked branch of the specified remote but fetching just the named branch into FETCH_HEAD.

업데이트 : 1.8.4 이후 Git 버전의 경우 가져 오도록 요청한 참조를 추적하는 원격 추적 분기가있는 경우 추적 분기는 이제 fetch. 이 변경은 특히 이전 동작으로 인한 혼란을 피하기 위해 만들어졌습니다.

당신이 수행 할 때 git pull <repository> <ref>,FETCH_HEAD 위와 같이 업데이트 된 다음에 병합하여 체크 아웃 HEAD하지만 원격 저장소의 표준 추적 가지 중 어느 것도 업데이트되지 않습니다 (망할 놈의 <1.8.4). 즉, 로컬 에서는 원격 분기보다 앞서있는 것처럼 보이지만 실제로는 최신 상태입니다.

개인적으로 나는 병합하기 전에 강제 업데이트에 대한 경고를 볼 수 있기 때문에 항상 git fetch다음 작업을 수행합니다 git merge <remote>/<branch>. 병합중인 항목을 미리 볼 수 있습니다. 내가 사용 git pull하는 것보다 조금 더 사용 하면 git pull매개 변수가없는 일반 작업 을 대부분 수행합니다. 시간의,에 의존 branch.<branch>.remote하고 branch.<branch>.merge에 '옳은 일을'.


4
+1 정말 좋은 설명입니다! 나는 설명은 '가져 오기 자식의 도움'의 어딘가의 내부에 숨어하지만 ... 그것을 얻을 수 없었다 알고 있었다
스테판 Näwe


1
그렇다면 가져 오기가 표준 추적 분기를 업데이트하기 때문에 문제를 수정 한 git fetchgit pull <repository> <ref>문제가 해결 될까요? 또한,이 답변 주셔서 감사합니다 :) 이해하기 시작
바트 Jedrocha

1
나도이 문제로 실행하고 당신이 할 필요가 git fetch다음 git merge origin/master master.
user1027169

3

git remote -v show원산지에 관해서는 무엇을 반환합니까?

origin이 github를 가리키는 경우 상태는 최신 상태 여야하며 원격 저장소보다 앞서 있어야합니다. 적어도 Git1.6.5에서는 빠른 테스트를 위해 사용하고 있습니다.

어쨌든 이것을 피하려면 마스터 브랜치의 원격 저장소를 명시 적으로 정의하십시오.

$ git config branch.master.remote yourGitHubRepo.git

a git pull origin master다음에 a git status가 깨끗한 상태를 반환해야합니다 (앞으로 없음).
왜? get fetch origin master (git pull origin master에 포함됨)가 업데이트 FETCH_HEAD( Charles Bailey그의 답변 에서 설명 했듯이 )뿐만 아니라 로컬 Git 저장소 내의 "remote master branch" 업데이트하기 때문입니다 .
이 경우 로컬 마스터는 더 이상 원격 마스터보다 "앞서"있는 것처럼 보이지 않습니다.


git1.6.5로 이것을 테스트 할 수 있습니다.

먼저 작업 저장소를 만듭니다.

PS D:\git\tests> cd pullahead
PS D:\git\tests\pullahead> git init workrepo
Initialized empty Git repository in D:/git/tests/pullahead/workrepo/.git/
PS D:\git\tests\pullahead> cd workrepo
PS D:\git\tests\pullahead\workrepo> echo firstContent > afile.txt
PS D:\git\tests\pullahead\workrepo> git add -A 
PS D:\git\tests\pullahead\workrepo> git commit -m "first commit"

베어 리포지토리 (어디에서나 푸시를받을 수있는 리포지토리)를 만들어 GitHub 리포지토리를 시뮬레이션합니다.

PS D:\git\tests\pullahead\workrepo> cd ..
PS D:\git\tests\pullahead> git clone --bare workrepo github

내 작업 저장소에 modif를 추가하고 github 저장소에 푸시합니다 (원격으로 추가됨).

PS D:\git\tests\pullahead> cd workrepo
PS D:\git\tests\pullahead\workrepo> echo aModif >> afile.txt
PS D:\git\tests\pullahead\workrepo> git ci -a -m "a modif to send to github"
PS D:\git\tests\pullahead\workrepo> git remote add github d:/git/tests/pullahead/github
PS D:\git\tests\pullahead\workrepo> git push github

GitHub를 복제 한 홈 리포지토리를 만들고 몇 가지 수정하여 GitHub에 푸시합니다.

PS D:\git\tests\pullahead\workrepo> cd ..
PS D:\git\tests\pullahead> git clone github homerepo
PS D:\git\tests\pullahead> cd homerepo
PS D:\git\tests\pullahead\homerepo> type afile.txt
firstContent
aModif

PS D:\git\tests\pullahead\homerepo> echo aHomeModif1  >> afile.txt
PS D:\git\tests\pullahead\homerepo> git ci -a -m "a first home modif"
PS D:\git\tests\pullahead\homerepo> echo aHomeModif2  >> afile.txt
PS D:\git\tests\pullahead\homerepo> git ci -a -m "a second home modif"
PS D:\git\tests\pullahead\homerepo> git push github

그런 다음 첫 번째 실험을 위해 workrepo를 복제합니다.

PS D:\git\tests\pullahead\workrepo4> cd ..
PS D:\git\tests\pullahead> git clone workrepo workrepo2
Initialized empty Git repository in D:/git/tests/pullahead/workrepo2/.git/
PS D:\git\tests\pullahead> cd workrepo2
PS D:\git\tests\pullahead\workrepo2> git remote add github d:/git/tests/pullahead/github
PS D:\git\tests\pullahead\workrepo2> git pull github master
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From d:/git/tests/pullahead/github
 * branch            master     -> FETCH_HEAD
Updating c2763f2..75ad279
Fast forward
 afile.txt |  Bin 46 -> 98 bytes
 1 files changed, 0 insertions(+), 0 deletions(-)

해당 저장소에서 git status는 ' origin' 보다 앞서 마스터 geing을 언급합니다 .

PS D:\git\tests\pullahead\workrepo5> git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
nothing to commit (working directory clean)

그러나 그것은 origingithub가 아닙니다.

PS D:\git\tests\pullahead\workrepo2> git remote -v show
github  d:/git/tests/pullahead/github (fetch)
github  d:/git/tests/pullahead/github (push)
origin  D:/git/tests/pullahead/workrepo (fetch)
origin  D:/git/tests/pullahead/workrepo (push)

그러나 github에 대한 출처가있는 저장소에서 시퀀스를 반복하면 (또는 출처가 전혀없고 원격 'github'만 정의 됨) 상태가 깨끗합니다.

PS D:\git\tests\pullahead\workrepo2> cd ..
PS D:\git\tests\pullahead> git clone workrepo workrepo4
PS D:\git\tests\pullahead> cd workrepo4
PS D:\git\tests\pullahead\workrepo4> git remote rm origin
PS D:\git\tests\pullahead\workrepo4> git remote add github d:/git/tests/pullahead/github
PS D:\git\tests\pullahead\workrepo4> git pull github master
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From d:/git/tests/pullahead/github
 * branch            master     -> FETCH_HEAD
Updating c2763f2..75ad279
Fast forward
 afile.txt |  Bin 46 -> 98 bytes
 1 files changed, 0 insertions(+), 0 deletions(-)
PS D:\git\tests\pullahead\workrepo4> git status
# On branch master
nothing to commit (working directory clean)

난 단지 한 경우 origin에 지적 github, statusgit1.6.5 깨끗하다.
이전 git에 대해 '미리'경고 git config branch.master.remote yourGitHubRepo.git가있을 수 있지만 어쨌든 명시 적으로 정의 된 사람은 초기 버전의 Git에서도이를 처리 할 수 ​​있어야합니다.


시간을내어 조사해 주셔서 감사합니다. 원점 원격은 이미 내 GitHub 저장소를 가리 킵니다. GitHub URL에서 해당 프로젝트를 복제했고 로컬 마스터 브랜치가 출처 / 마스터를 추적하고 있습니다. mybranch의 경우 자동으로 추적해야하는 origin / mybranch 브랜치에서 생성했다고 확신합니다. 하지만 여전히 이것이 문제일까요? 로컬 mybranch가 실제로 원산지 / mybranch를 추적하지 않는다고? 추신 : 저는 git 1.6.1 (MacPorts를 통해)을 사용하고 있습니다.
Matthias

로컬 브랜치가 다른 브랜치를 추적하는지 확인할 수있는 git 명령이 있습니까? 매뉴얼 페이지에서 찾을 수 없습니다.
Matthias

으로 추적되는 원격 분기를 확인할 수 있습니다 git remote show origin.
Ted Percival 2011

2

을 (를 origin) 사용하여 모든 리모컨 ( 원본 복제본과 함께 제공되는 항목 제외)을 추가하는 데주의를 기울이고 git remote add NAME URL있습니까? 방금 git 구성에 추가되었을 때이 버그를 보았습니다.


저장소를 복제 할 때이 작업을 수행했습니다. 그러나 나는 각 지점에서 이것을하지 않았다. 예를 들어 mybranch의 경우 먼저 원점에서 가져온 다음 git checkout -b mybranch origin/mybranch. git-branch의 man 페이지에 따르면 origin / mybranch가 시작점이며, 또한 --track : "... 항상 동일한 업스트림 브랜치에서 새 브랜치로 당기면 이것을 사용하십시오. "git pull <repository> <refspec>"을 명시 적으로 사용하지 않으려는 경우이 동작은 시작 지점이 원격 분기 일 때 기본값입니다. "
Matthias
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.