Bad git pull создает неверную ветку удаленного отслеживания - PullRequest
1 голос
/ 03 марта 2012

На моем рабочем месте мы только что перешли на Git для контроля версий после более чем 10-летнего использования Source Safe (yay!).Теперь я должен поддержать наших инженеров в изучении нового инструмента.Важно отметить, что мы все используем пользовательский интерфейс GitExtensions под Windows.

Несколько коллег (из пользовательского интерфейса) сделали следующее:

  • клонировали центральное хранилище ( origin )
  • создать новую локальную ветвь ( A ) на основе основной velop branch
  • создать коммиты на A ветвь
  • , когда эта ветвь A все еще проверена, они (по ошибке) вытянули основную развивающуюся ветвь в их A branch

Вот как выглядит пользовательский интерфейс GitExtensions, когда мы выполняем тягу (к сожалению, я не могу публиковать снимки экрана с работы):

Pullиз: origin

Локальная ветвь: A

Удаленная ветвь: velop

Параметр объединения: Слияние удаленной ветви с текущей веткой

(затем нажимается кнопка Pull)

Вот что показывает журнал команд GitExtensionsЭто сделано для извлечения:

git pull --progress "origin" +refs/heads/develop:refs/remotes/origin/A

После этой команды пользователи увидели новую ветку удаленного отслеживания origin / A в своей истории, в то время как мы подтвердили отсутствие ветки A присутствует на источнике.

Я посмотрел руководство по git pull, чтобы попытаться понять, что произошло, но все еще не могу понять, является ли то, что мы видим, ошибкой GitExtensions или недоразумением с нашей стороны, что должен делать git pull.

Кто-нибудь может помочь мне разобраться, что здесь происходит?

Заранее спасибо

Редактировать

Я знаю, что потянув за удаленную развивающуюся веткув локальную ветку A не имеет смысла, и я знаю, как разрешить ситуацию, удалив ветку удаленного отслеживания.Что я действительно хочу, так это понять логику, лежащую в основе ветки удаленного отслеживания origin / A , создаваемой в первую очередь, так как ветки A никогда не присутствовали в источнике.

Спасибо

Ответы [ 2 ]

2 голосов
/ 03 марта 2012

Трудно сказать, является ли это ошибкой GitExtensions или нет.В корпоративной среде очень необычно (почти всегда ошибка) добавлять что-либо кроме идентично названной удаленной ветви, поэтому я не удивлен, что вы получили странные результаты.(Я бы сказал, что когда-либо использовать git pull из-за его ужасного дизайна, но это уже другая история.)

Часть +refs/heads/develop:refs/remotes/origin/A называется refspec (справочная спецификация).В нем говорится, чтобы локальный пункт назначения ссылка с именем refs/remotes/origin/A (сокращенно origin/A) указывал на тот же коммит, что и ссылка refs/heads/develop удаленного репозитория (ветвь develop в удаленном репозитории)в настоящее время указывает на.Знак «плюс» (+) в начале говорит о необходимости сопоставления ссылки, даже если ссылка назначения не может быть быстрой переадресации к исходной ссылке.

Таким образом, *Упомянутая вами команда 1020 * заставляет Git:

  1. выяснить, что фиксирует ветка develop удаленного репозитория, указывающая на
  2. загрузку, которая фиксирует и его предок фиксирует из удаленного репозитория (за исключением материала, уже находящегося в локальном репозитории)
  3. принудительно заставляет локальную ссылку refs/remotes/origin/A указывать на этот коммит
  4. слияние, которое фиксирует то, что в настоящий момент извлечено

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

git pull --progress origin refs/heads/develop

Опуская локальное имя ссылки (часть после двоеточия), Git делает следующее:

  1. выясняетто, что фиксирует ветка develop удаленного репозитория, указывает на
  2. загрузку этого коммита и его предка коммитов из удаленного репозитория (за исключением содержимого, уже находящегося в локальном репозитории)
  3. установить локальный FETCH_HEAD временная ссылка для указания на этот коммит
  4. слияние, которое фиксирует то, что в настоящий момент извлечено

Обратите внимание на разницу в шаге № 3.

I'mне знаком с GitExtensions, но вот что я думаю GitExtensions делает: Предполагается, что вы хотите, чтобы данная удаленная ветвь была обозначена как официальная ветвь восходящего потока данной локальной ветки.Исходя из этого предположения, создание origin/A в качестве ветви удаленного отслеживания для ветви develop удаленного узла имеет умеренный смысл.Мне было бы интересно узнать, изменяет ли GitExtensions параметры конфигурации remote.origin.fetch или branch.A.merge в .git/config, чтобы действительно сделать обозначение официальным.Если это так, это плохой дизайн пользовательского интерфейса.Если нет, то это, вероятно, ошибка.

1 голос
/ 03 марта 2012

Вы можете вытащить только проверенную ветку.Это где ваш трекинг запутался.

Самый простой способ увидеть, что происходит, - взглянуть на файл .git / conf.Вы увидите, какая ветка отслеживает какую удаленную ветку.Вы можете исправить это, либо отредактировав файл напрямую, либо используя опцию --set-upstream в git branch.

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

Также рассмотрите возможность использования командной строки.Вы получаете историю команд и другие преимущества.

...