Почему git иногда показывает, а иногда не выводит сообщение: «Ваша ветвь впереди« what / upstream »n коммитов?» - PullRequest
0 голосов
/ 29 декабря 2018

Для многих моих репозиториев, для всех из которых правильно установлен апстрим и сообщается командой git remote --v, но когда я фиксирую локально и перед тем, как отправлять на сервер, только для некоторых репозиториев это говоритмне услужливо сообщение:

$ git status
  Your branch is ahead of 'whatever/upstream' by n commits.

В то время как для других, он всегда говорит только:

$ git status
  nothing to commit, working tree clean.

Когда ясно, что мое локальное репо является несколькими коммитами вперед, чем удаленным.

Я полагаю, что это как-то связано с тем, как я создал локальное репо: клонированием существующего удаленного репо или git init, а затем настройкой апстрима и продвижением?Но я не могу быть уверен.

1 Ответ

0 голосов
/ 29 декабря 2018

Команда git status делает много вещей - вероятно, наиболее важным является то, что она запускает два git diff с, чтобы выяснить, как ваш HEAD коммит, ваш индекс и ваше рабочее деревосвязаны друг с другом, но первые несколько вещей, которые он делает:

  • Напечатайте имя текущей ветви, если вы находитесь на ветви.
  • Печать подсчитывает вперед и/ или позади, если вы находитесь на ветке и , эта ветвь имеет восходящий поток набор и , значения отличны от нуля.

Вы можете отключить счет вперед / назад с помощью --no-ahead-behind или включить их с помощью --ahead-behind.(По умолчанию включено.)

Чтобы вычислить количество, Git использует git rev-list --count.Подробности о том, как это работает, см. В ветке git впереди и сзади для локальной ветки? Обратите внимание, что подсчет основан на восходящей настройке ветви, поэтому, если вы находитесь на ветке Bи восходящий поток - origin/<em>B</em>, это результат подсчета коммитов, которые доступны из вашей ветви B, но не из вашего имени для удаленного отслеживания origin/<em>B</em>, и наоборот.Если origin/<em>B</em> не соответствует текущему значению B для origin, этот счетчик не так полезен, как вы могли бы пожелать;запустите git fetch origin, чтобы обновить его при необходимости.

Каждая ветвь имеет свой отдельный параметр восходящего потока.Любое одно имя ветви может иметь одно восходящее или отсутствующее.Вверх по течению обычно используется имя для удаленного отслеживания (origin/whatever), но оно может быть любым именем, включая другие обычные локальные имена ветвей.Команда git branch --set-upstream-to, или git branch --unset-upstream, является основным современным способом манипулирования настройкой восходящего потока любого существующего имени ветви.(Фактическая настройка сложна и может быть изменена с помощью git config или путем редактирования .git/config.)

Что касается отсоединенного HEAD, упомянутого в комментариях, отсоединенный HEAD просто означает, что вы не находитесь на ветке.Этот режим является нормальным, когда вы запросили его, либо через git checkout --detach, либо с помощью git checkout для чего-то, что не является именем ветви.Как вы упоминаете, это также нормально, когда вы находитесь в середине операции перебазировки, которая еще не завершена.В этих случаях современный git status выдает информативное сообщение о том, что вы находитесь в этом режиме отключенного HEAD, и (в некоторой степени) почему.

Поскольку у отключенного HEAD нет восходящего потока - только имена ветвей имеют восходящийнастройки - в этом режиме никогда нет отсчета вперед / назад.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...