Где находится "git fetch"?
Так скажем, я работаю над license.txt
в моем локальном хранилище, и я изменяю его. Перед тем как зафиксировать, Сьюзан модифицирует и фиксирует это в удаленном хранилище.
Если я сделаю git fetch
что именно происходит с моими обновлениями? Куда идут результаты?
2 ответа
С вашими обновлениями ничего не происходит. git fetch
из-за отсутствия лучшего слова извлекает коммиты из удаленного репозитория и помещает их в локальную копию базы данных объектов. Поскольку вы работаете над своей собственной веткой, между ними нет взаимодействия, пока вы явно не решите иметь какое-то взаимодействие, например, путем перебазирования, выбора вишни и т. Д.
Вы можете получить доступ к извлеченным коммитам, проверив их соответствующие ветви (например, origin/master
).
git fetch
не меняет состояние рабочего дерева. На самом деле, это не требует рабочего дерева: git fetch
может работать в пустом хранилище (хранилище, у которого нет рабочего дерева).
Коммит Сьюзен создает новый объект в ее хранилище. Этот объект не известен в вашей рабочей области, пока вы не выполните выборку. В этот момент этот объект становится доступным в вашем пространстве. Поскольку этот объект идентифицируется его хешем, который является очень большим целым числом, он почти наверняка отличается (не конфликтует) с любым другим объектом, который у вас уже есть.
В дополнение к извлечению нового коммита, git fetch
также обновит указатели удаленной ветки. Например, предположим, что Сьюзен master
Ветвь и твой были идентичны до совершения Сьюзен. После коммита Сьюзен в ее ветке появился новый коммит, которого нет у вас. Когда вы делаете git fetch
, ваш местный origin/master
указатель ветви обновляется, чтобы указать, что его голова теперь является коммитом Сьюзен. Тем не менее, ваш местный master
ветка остается без изменений.
На данный момент вы можете запустить git checkout
(без аргументов), и вы получите сообщение, как branch master is behind origin/master by 1 commit and can be fast-forwarded
, Это происходит из сравнения master
а также origin/master
,
Теперь вы можете интегрироваться с изменениями Сьюзен несколькими способами:
git rebase
: вишня выбирай из тех изменений, которые есть только в твоем местномmaster
на вершине новых изменений вorigin/master
(тем самым переписывая свою историю), и сделайте результат новымHEAD
на местномmaster
). После этого,master
строго впередиorigin/master
: это так же, какorigin/master
плюс ваши изменения.git merge
: сохраните ваши изменения без изменений и создайте новый коммитmaster
который разрушает их и сливает их. Этот коммит имеет двух родителей: предыдущий коммит наmaster
(в данном случае коммит Сьюзен) и последний коммит в вашей серии локальных коммитов в их первоначальном виде. Снова,master
сейчас строго впередиorigin/master
,git reset --hard origin/master
: в знак признательности Сьюзен за то, что вся ваша работа устарела, вы отбрасываете свою работу и просто ускоряете свою работуmaster
к измене Сьюзен. Сейчасmaster
идентичноorigin/master
,
Первые два действия в сочетании с git fetch
с использованием git pull
команда. git pull
выполняет либо git fetch
с последующим git merge
или он выполняет git fetch
в исполнении git rebase
, Поведение настраивается для каждой ветви, и есть глобальная опция о том, каким образом следует настраивать вновь созданные ветви. Вы можете изменить поведение, используя git pull --rebase
или же git pull --merge
,
Поскольку ваши локальные изменения не зафиксированы, вы не сможете выполнять эти интегрирующие действия (перебазирование или слияние). Git хочет, чтобы вы сначала преобразовали свои изменения в коммит. Взаимодействие между вновь полученными объектами отсутствует, и вы делаете коммит из своих локальных изменений.
Вам не нужно предпринимать никаких действий сейчас. Благодаря git fetch
, вы будете информированы о текущих операциях, без необходимости немедленной интеграции с ними. Вы можете, например, сделать git log origin/master
чтобы увидеть, что нового, и как это может повлиять на вашу работу. Но вы можете отложить это и продолжать делать новые коммиты.