Подтвердить что ты не робот

"Ваша ветка опережает" происхождение/мастер "на 1 фиксацию" при явном нажатии

Я новичок в git, и я не могу понять следующее поведение:

У меня есть репортаж bitbucket, который я клонировал локально, затем я изменяю и фиксирую локально, затем я нажимаю на удаленное репо. Если я делаю неявный толчок или "push origin", проблем нет. Если я использую явный удаленный URL-адрес, я получаю сообщение о состоянии "Ваша ветка впереди" origin/master "на 1 commit".

Кажется, что git не распознает явный адрес как то же самое, что и происхождение, и что именно происходит. Если я делаю еще один неявный push, он ничего не делает, но он очищает указанное сообщение.

Здесь пример сеанса:

[email protected]:/more/coding/git-tests/ask1$ git --version
git version 1.7.2.5

[email protected]:/more/coding/git-tests$ git clone https://[email protected]/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.

[email protected]:/more/coding/git-tests$ cd ask1

[email protected]:/more/coding/git-tests/ask1$ jed setup.py

[email protected]:/more/coding/git-tests/ask1$ git commit -a
[master a053f28]    modified:   setup.py
 1 files changed, 1 insertions(+), 0 deletions(-)

[email protected]:/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)

[email protected]:/more/coding/git-tests/ask1$ git remote show origin
Password: 
* remote origin
  Fetch URL: https://[email protected]/shishani/dirasi.git
  Push  URL: https://[email protected]/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)

[email protected]:/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://[email protected]/shishani/dirasi.git
   5e9ffd1..a053f28  master -> master

[email protected]:/more/coding/git-tests/ask1$ git status
# On branch master
nothing to commit (working directory clean)

[email protected]:/more/coding/git-tests/ask1$ jed setup.py

[email protected]:/more/coding/git-tests/ask1$ git commit -a
[master 6d0e236]    modified:   setup.py
 1 files changed, 1 insertions(+), 0 deletions(-)

[email protected]:/more/coding/git-tests/ask1$ git push https://[email protected]/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://[email protected]/shishani/dirasi.git
   a053f28..6d0e236  master -> master

[email protected]:/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)

[email protected]:/more/coding/git-tests/ask1$ git push
Password: 
Everything up-to-date

[email protected]:/more/coding/git-tests/ask1$ git status
# On branch master
nothing to commit (working directory clean)
4b9b3361

Ответ 1

Я считаю, что вам нужно вернуть изменения до того, как git поймет, что удаленный конец обновлен. Вы можете сделать это с помощью быстрого git pull (или, как показано в вашем примере, git push для отслеживаемого происхождения).

Вы также можете вручную изменить фиксацию, на которую указывает refs/remotes/origin.

Нечестно ожидать, что трекер контента распознает произвольные удаленные синонимы для репозиториев; представьте, если у вас было пять разных URL-адресов, все из которых были одним и тем же репозиторием на стороне сервера. Когда вы нажимаете на репо A, означает ли это, что ваши изменения были зафиксированы в репо B (происхождение вашей ветки)? git не знает. Вместо этого он обновляет ссылку на удаленную головку в двух случаях: pull и push до назначения по умолчанию.

Ответ 2

Когда статус говорит 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, чтобы узнать, какая удаленная ветвь отслеживает текущую ветку.

Ответ 3

Да, в этом случае вам нужно будет сделать git fetch или git fetch origin. Git не волнует, куда вы нажимаете, только удаленные (и удаленные ветки отслеживания) - это все, что имеет значение, когда сообщается о статусе того, сколько из вас совершает, и т.д.

Ответ 4

Обратите внимание, что поскольку 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.