"Ваша ветка опережает" происхождение/мастер "на 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)
Ответы
Ответ 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
.