'Ваша ветвь опережает'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 переменная конфигурации.

Другие вопросы по тегам