Git pull без проверки?

133

Я привык запускать git pull и другие команды из ветки, над которой я работаю. Но я настроил сервер разработки, на котором работают несколько человек, поэтому я не хочу, чтобы мне приходилось переключать ветки, когда я это делаю. Если я хочу обновить существующую ветку на сервере разработки из репозитория github, который мы все используем, что было бы правильным способом сделать это? Если я запустил команду «git pull github branchname», это просто перетянет ветвь в текущую?

Все примеры git, которые я могу найти, похоже, указывают на то, что сначала вы запускаете checkout branchname, а затем выполняете вытягивание. Я пытаюсь этого избежать. Как я уже сказал, это существующая ветка, и я просто хочу обновить ее до последней версии.

Дайана Сондерс
источник
6
git fetchдолжен делать то, что хочешь.
Брэд
11
git fetchобновит локальную копию удаленной ветки, но не любую локальную ветвь, даже если она настроена для отслеживания этой конкретной удаленной ветки. Это может быть то, что нужно, а может и не быть. (Изменить: по умолчанию, в любом случае. Можно вызвать его с аргументами, чтобы заставить его вести себя по-другому, но в этом случае аргументы действительно должны быть указаны.)
2
Я не совсем понимаю ... все ли используют один и тот же локальный репозиторий на сервере разработки? Поэтому вы не хотите переключаться между ветвями? Почему бы просто не позволить каждому создать свой собственный частный клон, в котором они могут работать? См. Также git: обновить локальную ветку, не проверяя ее? ,

Ответы:

221

Я искал то же самое и, наконец, нашел ответ, который сработал для меня, в другом сообщении stackoverflow: слияние, обновление и извлечение веток Git без использования проверок

В принципе:

git fetch <remote> <srcBranch>:<destBranch>

кораль
источник
Есть ли способ использовать восходящую ветвь вместо указания исходной ветки?
cambunctious
К сожалению, но pullесть параметры , которые fetchне делает: -s <strategy>, -Xsubtree=...который был жизненно важным для меня, так что это не является равноценной заменой. У меня была проблема, описанная здесь: congruityservice.com/blog/… но в моем случае я вообще не хотел оформлять заказ.
Andry
2
Учитывая, что вопрос касается тяги, кажется, что ответ должен быть таким git pull <remote> <srcBranch>:<destBranch>.
J
Если коммиты уже находятся в вашем локальном репозитории:git fetch . origin/master:master
Эван
74

У меня была такая же проблема с необходимостью зафиксировать или сохранить текущие изменения функций, главную ветвь проверки , pullкоманду do получить все, от удаленной до локальной masterрабочей области, затем снова переключиться на ветвь функции и выполнить, rebaseчтобы обновить ее с помощью мастер.

Чтобы все это было сделано, оставьте рабочую область в функциональной ветке и избегайте всех переключений, я делаю следующее:

git fetch origin master:master

git rebase master

И это прекрасно помогает.

Марцин Т.П. Лучиньски
источник
19
Это хороший совет, но он скрывает суть: согласно приведенным ниже ответам, если вы подключены, featureи ВСЕ, что вы хотите сделать, это обновить свой локальный код, masterчтобы он соответствовал происхождению, БЕЗ прикосновения feature, просто сделайте git fetch origin master:master... и это как если бы вы это сделали копить-checkoutMaster-Pull-checkoutFeature-stashPop!
btown
7
Чтобы объединить мастер-источник с вашей локальной веткой, вам не нужно извлекать локальный мастер. Вы можете использовать git merge origin/master
Дэн
-1

Если вы хотите, чтобы советы местного отделения были перенаправлены после git fetch, вам потребуются дополнительные шаги.

Более конкретно, предположим , что GitHub репо имеет филиалы D, B, Cи master(причина этого странного ответвлением имя-набора будет ясно , в настоящее время). Вы находитесь на хосте, devhostи вы находитесь в репозитории, где originнаходится репозиторий github. Вы делаете git fetch, который приносит более все объекты и обновления origin/D, origin/B, origin/C, и origin/master. Все идет нормально. Но теперь вы говорите , что вы хотите что - то случится, на devhost, в местных филиалах D, B, Cи / или master?

У меня есть эти очевидные (по крайней мере, для меня) вопросы:

  1. Зачем нужно обновлять подсказки всех веток?
  2. Что, если в какой-то ветке (например, B) есть коммиты, которых нет в удаленном репозитории (github)? Их следует объединить, переустановить или ...?
  3. Что делать, если вы находитесь в некоторой ветке (например, C), а рабочий каталог и / или индекс изменены, но не зафиксированы?
  4. Что, если в удаленном репо добавлены новые ветки ( A) и / или удалены ветки ( D)?

Если ответ на (1): «потому что на devhostсамом деле он не предназначен для разработки, а скорее является локальным зеркалом, которое просто хранит локально доступную копию репозитория github, чтобы все наши настоящие разработчики могли быстро читать из него, а не медленно читать из github ", то вам нужно" зеркало ", а не" нормальное "репо. У него не должно быть рабочего каталога, и, возможно, он также не должен принимать push-запросы, в этом случае оставшиеся вопросы просто исчезнут.

Если есть другой ответ, (2-4) станут проблематичными.

В любом случае, вот способ обновить локальные ссылки на основе удаленных ссылок (например, после запуска git fetch -p):

for ref in $(git for-each-ref refs/remotes/origin/ --format '%(refname)'); do
    local=${ref#refs/remotes/origin/}
    ... code here ...
done

Что входит в ... code here ...раздел, зависит от ответов на вопросы (2-4).

Торек
источник
-5

использование

git fetch

вместо. Он обновляет удаленные ссылки и объекты в вашем репо, но оставляет только локальные ветки, HEAD и рабочее дерево.

SZG
источник
17
Но это не обновляет локальные ветки его сервера разработки ... он обновляет только «исходные» ветки в этой папке git, которые соответствуют репозиторию github запрашивающего.
ANeves 03
1
Или, если вам нужна моя версия проблемы: я хочу объединить свою рабочую ветку с «master», а не с «origin / master of ssh: // bla bla bla». Выполнение выборки обновит origin / master, но не master.
ANeves 03
-6

РЕДАКТИРОВАТЬ: используйте 'git pull'. Он будет извлекать все ветки из репо, а также обновлять до последней версии, если ветка выходит в локальной системе только для текущей ветки. Примечание: git pull эквивалентен fetch + merge, который извлекает все ветки, но объединяет только текущую ветку.

Анудж Анея
источник
6
Проще говоря: pullвыполняет выборку (которая, да, извлекает все с пульта дистанционного управления), но затем объединяет только текущую ветвь.
torek
Я не оскорбляю свой голос против, я знаю, что то, что вы говорите, является правильным и фактическим, и ОП действительно запросил подтверждение того, что делает тяга (и вы дали ему это объяснение), но это не касается суть того, что он искал: есть ли способ обновить одну из ваших локальных веток до последних коммитов в связанной с ней удаленной ветке без необходимости сначала проверять ветку.
Gurce