Git pull / fetch с различиями в refspec - PullRequest
15 голосов
/ 24 августа 2011

Использование refspec - это удобный способ получить удаленную ветку и создать похожую ветку, но с заданным именем (или наоборот: создать удаленную ветку с данным именем, отличным от локального).Я озадачен одной крошечной вещью - поскольку pull также выполнит слияние с текущей веткой, я бы ожидал различного поведения от:

git fetch origin master:mymaster

и от

git pull origin master:mymaster

Обакажется, что приведенные выше команды дают точно такой же результат - это локальная ветка с именем mymaster, такая же, как origin / master.Я прав или есть неопределенная разница между ними?

Наконец, использование refspec создаст локальную ветку , а не a отслеживание филиал, верно?Так как ветви отслеживания автоматически передаются при вызове git push без каких-либо аргументов AFAIK

Ответы [ 3 ]

29 голосов
/ 24 августа 2011

Refspec - это просто пара источник / пункт назначения.Использование refspec x:y с fetch говорит git сделать ветку в этом репо с именем "y", которая является копией ветви с именем "x" в удаленном репо.Ничего другого.

С pull, git создает слияние сверху.Сначала выборка выполняется с использованием заданного refspec, а затем ветвь назначения объединяется с текущей веткой.Если это сбивает с толку, вот пошагово:

git pull origin master:mymaster
  1. Перейдите в источник и получите ветку "master"
  2. Сделайте копию этого файла локально с именем "mymaster"
  3. Слияние "mymaster" с текущей веткой

Полная квалификация, это будет refs/heads/mymaster и refs/heads/master.Для сравнения, заданная по умолчанию команда git для клона refspec имеет значение +refs/heads/*:refs/remotes/origin/*.refs/remotes создает удобное пространство имен для отделения удаленных веток от локальных.То, что вы делаете, говорит git поместить ветку удаленного отслеживания в то же пространство имен, что и ваши локальные ветви.

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

4 голосов
/ 24 августа 2011

git fetch origin master:mymaster обновляет ветку mymaster в локальном репозитории путем извлечения из основной ветки удаленного репозитория.

git pull origin master:mymaster делает выше и объединяет ее с текущей веткой.

0 голосов
/ 09 июля 2015

Я использовал smartgit для создания ветки, поэтому, возможно, в этой ветке неправильно слился с master.Создана ветка поддержки для релиза, т.е. support / 4.2, тег автоматически создается, но сейчас я пытаюсь сделать git pull, он показывает мне ту же ошибку.Так как support / 4.2 brannch создается в github, но не корректно объединяется в local.Поэтому я использовал это: - git pull origin master: mymaster

В моем случае - git pull origin origin / 4.2: support / 4.2

Работает :)

...