'Ваша ветвь опережает'origin/master'на 1 коммит' при явном нажатии
Я новичок в Git, и я не могу понять следующее поведение:
У меня есть репозиторий Bitbucket, который я клонирую локально, затем я изменяю и фиксирую локально, затем я отправляю в удаленное репо. Если я делаю неявный push или "push origin", проблем не возникает. Если я нажимаю с использованием явного удаленного URL, я получаю сообщение о состоянии "Ваша ветвь впереди" origin/master "на 1 коммит".
Похоже, что git не распознает явный адрес как совпадающий с origin, так что именно происходит. Если я делаю еще один скрытый толчок, он ничего не делает, но очищает упомянутое сообщение.
Вот пример сеанса:
baz@bhost:/more/coding/git-tests/ask1$ git --version
git version 1.7.2.5
baz@bhost:/more/coding/git-tests$ git clone https://shishani@bitbucket.org/shishani/dirasi.git ask1
Cloning into ask1...
Password:
remote: Counting objects: 24054, done.
remote: Compressing objects: 100% (6300/6300), done.
remote: Total 24054 (delta 17124), reused 24024 (delta 17106)
Receiving objects: 100% (24054/24054), 11.83 MiB | 251 KiB/s, done.
Resolving deltas: 100% (17124/17124), done.
baz@bhost:/more/coding/git-tests$ cd ask1
baz@bhost:/more/coding/git-tests/ask1$ jed setup.py
baz@bhost:/more/coding/git-tests/ask1$ git commit -a
[master a053f28] modified: setup.py
1 files changed, 1 insertions(+), 0 deletions(-)
baz@bhost:/more/coding/git-tests/ask1$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
baz@bhost:/more/coding/git-tests/ask1$ git remote show origin
Password:
* remote origin
Fetch URL: https://shishani@bitbucket.org/shishani/dirasi.git
Push URL: https://shishani@bitbucket.org/shishani/dirasi.git
HEAD branch: master
Remote branch:
master tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (fast-forwardable)
baz@bhost:/more/coding/git-tests/ask1$ git push
Password:
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 314 bytes, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: bb/acl: shishani is allowed. accepted payload.
To https://shishani@bitbucket.org/shishani/dirasi.git
5e9ffd1..a053f28 master -> master
baz@bhost:/more/coding/git-tests/ask1$ git status
# On branch master
nothing to commit (working directory clean)
baz@bhost:/more/coding/git-tests/ask1$ jed setup.py
baz@bhost:/more/coding/git-tests/ask1$ git commit -a
[master 6d0e236] modified: setup.py
1 files changed, 1 insertions(+), 0 deletions(-)
baz@bhost:/more/coding/git-tests/ask1$ git push https://shishani@bitbucket.org/shishani/dirasi.git master
Password:
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 298 bytes, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: bb/acl: shishani is allowed. accepted payload.
To https://shishani@bitbucket.org/shishani/dirasi.git
a053f28..6d0e236 master -> master
baz@bhost:/more/coding/git-tests/ask1$ git status
# On branch master
**# Your branch is ahead of 'origin/master' by 1 commit.** <-- this does not reflect current state
#
nothing to commit (working directory clean)
baz@bhost:/more/coding/git-tests/ask1$ git push
Password:
Everything up-to-date
baz@bhost:/more/coding/git-tests/ask1$ git status
# On branch master
nothing to commit (working directory clean)
4 ответа
Я считаю, что вам нужно отменить изменения, прежде чем git
поймет, что удаленный конец был обновлен. Вы можете сделать это через быстрый git pull
(или, как вы показываете в своем примере, git push
к отслеживаемому происхождению).
Вы также можете вручную изменить коммит, на который refs/remotes/origin
точки.
Несправедливо ожидать, что трекер контента распознает произвольные удаленные синонимы для репозиториев; представьте, если у вас есть пять разных URL-адресов, которые являются одним и тем же серверным хранилищем. Когда вы нажимаете на репо А, означает ли это, что ваши изменения были переданы в репо Б (источник вашей ветви)? мерзавец не имеет возможности узнать. Вместо этого он обновляет ссылку на удаленную головку только в двух случаях: извлечение и отправка в пункт назначения по умолчанию.
Когда статус говорит Your branch is ahead of 'origin/master' by 1 commit
это на самом деле означает origin/master
, То есть есть указатель с именем origin/master
в вашем репо, указывая на коммит, который является HEAD
того, что remote branch
, и ваш master
впереди этого коммита.
Для всех пультов, которые распознает ваш репозиторий, он создает <remote>/<branchname>
указатель в репо, если вы тянете / толкаете / выбираете. Это просто указатель на коммит, и если вы попытаетесь checkout
эта ветка, вы бы только в отдельном состоянии.
Видимо, этот указатель обновляется, когда вы делаете git push
или же git push origin master
, но явное нажатие на URL не будет обновлять этот указатель и, следовательно, статус.
Если вы просто делаете git fetch
или же git pull
после нажатия на URL, сообщение о состоянии также исчезнет в этом случае.
ПРИМЕЧАНИЕ. Если у вас есть несколько пультов дистанционного управления, и вы настроили свою ветвь для отслеживания какой-либо другой удаленной ветки, например, скажем, upstream master
сообщение о вашем статусе в этом случае будет, например, Your branch is ahead of 'upstream/master' by 1 commit
, Так что это только отслеживаемая удаленная ветвь, что сравнение сделано. Увидеть git config
чтобы увидеть, какую удаленную ветку отслеживает ваша текущая ветка.
Да, вам придется сделать git fetch
или же git fetch origin
в таком случае. Git не волнует, куда вы нажимаете, только удаленный (и удаленные ветви отслеживания) - это все, что имеет значение, когда вы сообщаете о состоянии, сколько коммитов вы впереди и т.д.
Обратите внимание, что, начиная с git1.8.1rc1 (декабрь 2012 г.), Git будет включать подсказки:
if (advice_status_hints)
+ strbuf_addf(sb,
+ _(" (use \"git push\" to publish your local commits)\n"));
Когда "
git checkout
"проверяет ветку, она сообщает пользователю, насколько далеко (или впереди) новая ветка относительно удаленной ветви отслеживания, на которой она построена.
Сообщение теперь также советует, как синхронизировать их, нажимая или вытягивая.Это можно отключить с помощью
advice.statusHints
переменная конфигурации.