Git pull/fetch с различиями refspec
Использование refspec - это удобный способ захвата удаленной ветки и создания аналогичного, но с заданным именем (или наоборот: создание удаленного с заданным именем, отличным от локального). Я озадачен одной крошечной штукой, так как притяжение будет также слияние с текущей ветвью. Я бы ожидал от другого поведения:
git fetch origin master:mymaster
и из
git pull origin master:mymaster
Обе вышеприведенные команды, похоже, дают точно такой же результат - это локальная ветвь с именем mymaster, такая же, как origin/master. Я прав или есть неопределенное различие между этими двумя?
Наконец, использование refspec создаст локальную ветвь не ветки отслеживания, правильно? Поскольку ветки отслеживания автоматически выдвигаются, когда вы вызываете git push без каких-либо аргументов AFAIK
Ответы
Ответ 1
Параметр refspec является только исходной/целевой. Использование refspec x:y
с fetch
сообщает git сделать ветку в этом репо с именем "y", которая является копией ветки с именем "x" в удаленном репо. Больше ничего.
С pull
, git выдает слияние сверху. Во-первых, выборка выполняется с использованием заданного refspec, а затем ветвь назначения объединяется в текущую ветку. Если это смущает, здесь шаг за шагом:
git pull origin master:mymaster
- Перейдите в начало и получите "master" в ветке
- Сделайте копию локально с именем "mymaster"
- Объединить "mymaster" в текущую ветвь
Полностью квалифицированный, который будет refs/heads/mymaster
и refs/heads/master
. Для сравнения, refspec по умолчанию, установленный git на клоне, +refs/heads/*:refs/remotes/origin/*
. refs/remotes
делает удобное пространство имен для ветки отдельных ветвей от локальных. То, что вы делаете, сообщает git разместить ветку удаленного отслеживания в том же пространстве имен, что и ваши локальные ветки.
Что касается "ветвей отслеживания", это просто запись в вашем файле конфигурации, сообщающая git, куда потянуть и поместить локальную ветвь в/из по умолчанию.
Ответ 2
git fetch origin master:mymaster
обновляет ветвь mymaster в локальном репозитории путем выбора из главной ветки удаленного репозитория.
git pull origin master:mymaster
делает выше и объединяет его в текущую ветвь.
Ответ 3
мастер происхождения git fetch: mymaster
Однако команда должна строго соответствовать следующим двум условиям:
Местная текущая ветвь не может быть mymaster.
Местный филиал mymaster является предком происхождения /master.
затем произойдет ускоренное слияние. В противном случае он сообщит о фатальном.
Если оба вышеуказанных условия выполняются, выполните команду:
мастер происхождения git pull: мой мастер
В дополнение к выполнению команды:
мастер происхождения git fetch: mymaster
Также выполню :
git merge FETCH_HEAD.
Обратите внимание: не Git Merge Mymaster
FETCH_HEAD отличается от mymaster ,, потому что mymaster, возможно, уже слился с ускоренной перемоткой вперед.
Ответ 4
Я использовал smartgit для создания ветки, так что, возможно, в этой ветке не было должным образом объединено в master.
Созданная ветвь поддержки для выпуска, т.е. Поддержка /4.2, тег автоматически создается, но теперь, когда я пытаюсь сделать git pull, он показывает мне ту же ошибку.
Поскольку поддержка /4.2 brannch создается в github, но не правильно объединена в локальном.
Поэтому я использовал это:
git pull origin master: mymaster
В моем случае - git поддержка источника происхождения /4.2: поддержка/4.2
Он работает:)