Почему ветвь статуса git актуальна, когда изменения существуют вверх по течению?

Изменения происходят вверх по течению в отслеживаемой ветки, но когда я набираю git status, это указывает на то, что моя локальная ветка обновлена. Это новое поведение, я изменил настройку конфигурации или что-то не так?

Спасибо за помощь.

[email protected]:/my/repo# git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working directory clean


[email protected]:/my/repo# git pull
remote: Counting objects: 11, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 11 (delta 6), reused 0 (delta 0)
Unpacking objects: 100% (11/11), done.
From bitbucket.org:my/repo
   1234567..abcdefg  master     -> origin/master
Updating 1234567..abcdefg
Fast-forward
 file1        |  1 -
 file2        | 43 +++++++++++++++++++++++++++++++++++++++++++
 file3        | 21 ++++++++++++---------
 file4        | 21 ++++++++++++---------
 4 files changed, 67 insertions(+), 19 deletions(-)
 create mode 100644 file5

Ответ 1

Что говорит вам статус, так это то, что вы находитесь за ссылкой ref origin/master, которая является локальным ref в вашем локальном репо. В этом случае ref проверяет ветвь на каком-то удаленном устройстве, называемом origin, но статус ничего не говорит о ветке на пульте дистанционного управления. Он сообщает вам о ref, который является только идентификатором фиксации, хранящимся в вашей локальной файловой системе (в этом случае он обычно находится в файле с именем .git/refs/remotes/origin/master в вашем локальном репо).

git pull выполняет две операции; сначала он выполняет git fetch, чтобы обновиться с фиксацией в удаленном репо (который обновляет ref origin/master в вашем локальном репо), затем он git merge объединяет эти коммиты в текущую ветвь.

Пока вы не сделаете шаг fetch (самостоятельно или через git pull), ваше местное репо не сможет узнать, что есть дополнительные коммиты вверх по течению, а git status просматривает только локальный origin/master ref.

Когда git status говорит обновленный, это означает "обновленный с веткой, что текущие ветки отслеживаются", что в данном случае означает "обновленный с локальным ref, называемый origin/master". Это соответствует только "актуальному состоянию восходящего потока, который был получен в последний раз, когда мы сделали fetch", который не совпадает с "последним с последним статусом в реальном времени восходящего потока".

Почему это работает? Ну, шаг fetch - это потенциально медленная и дорогая сетевая операция. Конструкция Git (и других распределенных систем управления версиями) заключается в том, чтобы избежать сетевых операций, когда это не нужно, и является совершенно другой моделью для типичного система клиент-сервер, к которой привыкли многие люди. Полностью можно использовать Git офлайн, без подключения к централизованному серверу, и вывод git status отражает это.

Создание и переключение ветвей (и проверка их состояния) в Git должно быть легким, а не тем, что выполняет медленную работу сети с централизованной системой. Предположения при проектировании Git и вывода git status заключались в том, что пользователи это понимают. С принятием Git множеством и множеством пользователей, которые не знакомы с DVCS, это предположение не всегда актуально.

Ответ 2

Это связано с тем, что ваше местное репо не проверено с помощью пультов дистанционного управления. Чтобы выполнить эту работу так, как вы ожидаете, используйте git fetch, затем снова запустите git status.

Ответ 3

"origin/master" относится к эталонному сопоставлению с фиксацией HEAD ветки "origin/master" . Ссылка - это имя псевдонима для человека с объектом Git, как правило, объект commit. Ссылка "origin/master" обновляется только тогда, когда вы git push на ваш пульт (http://git-scm.com/book/en/v2/Git-Internals-Git-References#Remotes).

В корне вашего проекта запустите:

cat .git/refs/remotes/origin/master

Сравните отображаемый идентификатор фиксации с:

cat .git/refs/heads/master

Они должны быть одинаковыми, и поэтому Git говорит, что master обновлен с помощью origin/master.

При запуске

git fetch origin master

Получает новые объекты Git локально в папке .git/objects. И Git обновляет .git/FETCH_HEAD, так что теперь он указывает на последнюю фиксацию извлеченной ветки.

Итак, чтобы увидеть различия между текущей локальной ветвью и ветвью, полученной с восходящего потока, вы можете запустить

git diff HEAD FETCH_HEAD