'git pull origin mybranch'는 로컬 mybranch N이 원점보다 먼저 커밋합니다. 왜?
방금에 대해 이상한 점을 관찰했는데 git pull
이해가 안됩니다.
금요일에는 지역 지부에서 일했습니다. 그것을 부르 자 mybranch
. 사무실을 떠나기 전에 나는 그것을 origin (내 github repo) : git push origin mybranch
.
어제 집에서 pull
mybranch를 랩톱으로 연결하고 더 많은 코딩을 한 다음 변경 사항을 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 개가 될 수 있습니까? 그래서 나는 a를 실행 git diff origin/mybranch
했고 diff는 내가 방금 원격에서 가져온 6 가지 변경 사항이었습니다.
다음을 실행하여 "수정"할 수 있습니다 git fetch origin
.
From git@github.com:me/project
af8be00..88b0738 mybranch -> origin/mybranch
분명히 내 로컬 저장소에 일부 참조 객체가 누락되었지만 어떻게 그럴 수 있습니까? 내 말은, 당기기는 이미 가져 오기를 수행하고 해당 분기를 제외하고는 작업하지 않았으므로 git fetch origin
및 git fetch origin mybranch
동일한 결과를 가져야합니까?
git pull origin
대신 항상 사용해야 git pull origin branchname
합니까?
혼란 스럽습니다.
git pull
git fetch
명시 적으로 가져온 헤드 (또는 병합을 위해 구성된 원격 분기가없는 경우)를 현재 분기로 병합하기 전에 적절한 매개 변수로 호출합니다 .
구문 : git fetch <repository> <ref>
where <ref>
is just a branch name with colon without colon is a 'one shot'fetch that does 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
에 '옳은 일을'.
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"
I simulate a GitHub repo by creating a bare repo (one which can receive push from anywhere)
PS D:\git\tests\pullahead\workrepo> cd ..
PS D:\git\tests\pullahead> git clone --bare workrepo github
I add a modif to my working repo, that I push to github repo (added as a remote)
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
I create a home repo, cloned of GitHub, in which I make a couple of modifications, pushed to 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
I then clone workrepo for a first experiment
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(-)
In that repo, git status does mention master geing ahead of 'origin
':
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)
But that is only origin
is not github:
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)
But if I repeat the sequence in a repo which has an origin to github (or no origin at all, just a remote 'github' defined), status is clean:
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)
If I had only origin
pointing on github
, status
would be clean for git1.6.5.
It may be with a 'ahead' warning for earlier git, but anyway, a git config branch.master.remote yourGitHubRepo.git
defined explicitly should be able to take care of that, even with early versions of Git.
Are you careful to add all of your remote (except origin
which comes with your original clone) using git remote add NAME URL
? I've seen this bug when they've just been added to the git config.
'programing tip' 카테고리의 다른 글
xml을 사용하여 Android TextView에서 사용자 정의 글꼴 사용 (0) | 2020.09.04 |
---|---|
2 단계 인증을 사용하여 https를 통해 GitHub에서 Git 클론 (0) | 2020.09.04 |
0.0과 1.0 사이에는 몇 개의 이중 숫자가 있습니까? (0) | 2020.09.04 |
오픈 소스 Java 프로파일 러 (0) | 2020.09.04 |
Java 스택 추적 덤프의 표시되는 행 수를 늘리려면 어떻게합니까? (0) | 2020.09.04 |