Что git remote -v show
возвращается, когда дело доходит до происхождения?
Если origin указывает на github, статус должен быть актуальным, а не перед удаленным репо. По крайней мере, с Git1.6.5 я использую для быстрого тестирования.
В любом случае, чтобы этого избежать, явно определите удаленное репо главной ветки:
$ git config branch.master.remote yourGitHubRepo.git
затем a git pull origin master
, за которым git status
следует a, должен вернуть чистый статус (не впереди).
Зачем? потому что мастер источника получения извлечения (включенный в мастер источника извлечения git) не будет просто обновлять FETCH_HEAD
(как объясняет Чарльз Бейли в своем ответе ), но он также обновит «удаленную главную ветку» в вашем локальном репозитории Git.
В этом случае ваш локальный мастер больше не будет «опережать» удаленного мастера.
Я могу проверить это с помощью 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, создавая голое репо (которое может получать push отовсюду)
PS D:\git\tests\pullahead\workrepo> cd ..
PS D:\git\tests\pullahead> git clone --bare workrepo github
Я добавляю модификатор в свое рабочее репо, которое я нажимаю в репозиторий 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 упоминается master geing перед ' 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)
Но это только origin
не 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)
Но если я повторю последовательность в репо, который имеет происхождение от 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
, status
было бы чисто для git1.6.5.
Это может быть с предупреждением «впереди» для более раннего git, но в любом случае, git config branch.master.remote yourGitHubRepo.git
явно определенный должен иметь возможность позаботиться об этом, даже с ранними версиями Git.
git push
также, кажется, решает эту проблему (сообщение «все в актуальном состоянии»).