Почему я должен выдвигать изменения, которые я только что вытащил из Git? - PullRequest
3 голосов
/ 12 марта 2011

У меня на локальном компьютере есть репозиторий Git, который я клонировал со своего удаленного сервера. Хранилище Git, из которого я клонировал, является голым хранилищем.

Одна вещь, которая все еще озадачивает меня, состоит в том, что, когда были внесены изменения в источнике, и я git pull origin master обновляю свой локальный репозиторий, git status затем говорит мне, что я X фиксирует перед источником, где X количество коммитов, которые я только что вытащил.

Это несмотря на то, что журналы фиксации уже идентичны.

Поэтому я всегда делаю git push origin master после этого, но мне просто интересно, может ли кто-нибудь объяснить, почему это необходимо, и могу ли я делать это неправильно.

Мне кажется, что если я просто вытяну изменения из источника, два репозитория должны быть идентичны. Так почему же мне сказали, что я впереди? Связано ли это с тем, что это пустой репозиторий?

Для ясности, вот ситуация чуть подробнее:

У меня есть пустой репозиторий (хаб) на удаленном сервере. В этом репо есть два клона: «dev» на моем локальном компьютере и «staging» на том же сервере, что и origin.

Когда я делаю изменения в dev, я затем git push origin master передаю их в голое репозиторий "hub". Затем я вхожу на удаленный сервер, cd в «промежуточное хранилище» и выполняю git pull origin master, чтобы обновить «промежуточное состояние» из «концентратора».

После того, как я это сделал, если я сравню журналы концентратора и промежуточной фиксации, используя git log --pretty=oneline, я могу видеть, что они идентичны.

Однако, если я сделаю git status в директории «staging», я получу следующее:

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)

Итак, я обычно делаю git push origin master оттуда, и мне говорят:

$ git push origin master
Everything up-to-date

Все работает должным образом, но у меня просто возникает этот мучительный вопрос, не допустил ли я ошибки при установке репозиториев, или это нормально ...

Ответы [ 2 ]

5 голосов
/ 12 марта 2011

Согласно man git-pull:

Объединить в текущую ветку удаленную ветку next:

$ git pull origin next

Это оставляет копию next временно в FETCH_HEAD, но не обновляет ветви удаленного отслеживания . Используя ветки удаленного отслеживания, то же самое можно сделать, вызвав fetch и merge:

$ git fetch origin
$ git merge origin/next

Акцент мой.

По сути, Git сообщает вам, что ваш обновленный мастер опережает origin/master, то есть ветвь удаленного отслеживания для мастера . Поскольку эта ветвь отслеживания не обновляется git pull origin master (как указано на странице руководства), вы технически опережаете . Вызов git fetch origin обновляет ваши удаленные ветви отслеживания, а затем вы можете объединить эту ветку отслеживания вручную (как указано во втором примере man-страницы).

AFAIK, если вы не укажете имя ветви с помощью git pull (например, git pull origin), оно будет читать .git/config, для чего оно должно быть выбрано, и ветви удаленного отслеживания будут обновляться.

1 голос
/ 12 марта 2011

Вы также вносили изменения локально?Если это так, то ваш git pull получает удаленные коммиты и генерирует коммит слияния по убыванию из ваших локальных HEAD и origin 'HEAD

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