Расширения Git + Git для Windows: получение ветки, которая не существует локально, не создает новую локальную ветку

Я запускаю Git Extensions 2.32 в Git для Windows (ранее известный как msysgit) 1.7.10.msysgit.1.

Другой пользователь создал новую ветку и отправил ее в удаленный репозиторий. Я хочу загрузить эту новую ветку в свой локальный репозиторий.

На этом изображении показано, что я пытаюсь сделать. Мастер в настоящее время извлечен, а другой пользователь добавил новую ветку «brentfo», которую он отправил в удаленный репозиторий. Теперь я хочу получить эту новую ветку в свой локальный репозиторий.

Я открываю диалоговое окно Git Extensions Pull, как показано на изображении. Я извлекаю из источника с параметром слияния «Не объединять, только извлекать удаленные изменения», выбирая новую удаленную ветку «brentfo». Когда я нажимаю кнопку Pull, я получаю диалоговое окно прогресса:

c:\Program Files (x86)\Git\bin\git.exe fetch --progress "origin" +refs/heads/brentfo
Done
From //dnzchfile1/git-chch$/mRouteDotNET
 * branch            brentfo    -> FETCH_HEAD

Диалоговое окно прогресса не показывает никаких ошибок. Кажется, процесс завершается нормально.

Файл FETCH_HEAD показывает следующее:

eea033921fea43acf34a5baa380d1666181b56aa        branch 'master' of //server/gitrepo/mRouteDotNET
5e0640e42d04a744aae2e95663a13c0747cacaf1    not-for-merge   branch 'brentfo' of //server/gitrepo/mRouteDotNET
934e6034c526b703ac69b26497e0131f9bb71c2c    not-for-merge   branch 'mRoutePCLib' of //server/gitrepo/mRouteDotNET

Однако, когда я потом смотрю журнал фиксации, кажется, что ничего не произошло (журнал фиксации появляется на заднем плане на изображении диалогового окна Pull выше). Новая ветка, brentfo, не была создана в моем локальном репозитории. Когда я открываю выпадающий список ветвей, остается только две: master и mRoutePCLib.

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

c:\Program Files (x86)\Git\bin\git.exe fetch --progress "origin" 
Done

Похоже, когда-то была ошибка, связанная с созданием локальных веток из удаленных в более ранних версиях Git Extensions. Однако, глядя на проект Git Extensions журнал изменений, похоже проблема была решена еще в версии 1.55. Так что я предполагаю, что я делаю что-то не так.

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

Я надеюсь получить ответы в том же духе:

а) Да, вы делаете это неправильно, и вот как вы должны это сделать (через графический интерфейс); или

б) Это известная проблема, вам придется делать это из интерфейса командной строки (Git Bash), пока ошибка не будет исправлена.

Привет Саймон


person Simon Tewsi    schedule 21.06.2012    source источник


Ответы (3)


Извлечение просто принесет все изменения в текущей ветке (и локально отслеживаемые ветки? кто-нибудь поможет мне с этим.) и знания обо всех удаленных ветках. Вы действительно не хотите, чтобы fetch обрушил все коммиты для всех веток, которые вы еще не проверили. Было бы плохо, если бы были тысячи веток. Для проверки удаленных ветвей, которые вы еще не видите, вы выбираете Fetch, а затем Checkout Branch.

Вы уже получили информацию о существовании удаленной ветки.

Теперь вы хотите сделать

Git Extensions -> Checkout Branch

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

Я рекомендую найти способ купить Smart Git 3. Это намного лучше, чем все другие продукты Windows Git. У них есть бесплатная лицензионная версия с открытым исходным кодом.

person Andrew T Finnell    schedule 21.06.2012
comment
Я подозреваю, что настоящая проблема здесь заключается в том, что я плохо разбираюсь в базовом API git, а не в том, что что-то не так с расширениями Git. Для большинства вещей я нашел Git Extensions действительно хорошим. Пользуюсь месяц или около того, все работает гладко, кроме субмодулей. Даже с подмодулями у меня сложилось впечатление, что Git Extensions обрабатывает вещи лучше, чем интерфейс командной строки (например, вы уже можете удалить подмодуль через CLI?). Однако кажется, что git является эквивалентом C++ для SCM - легко облажаться, если вы не знаете, что делаете. - person Simon Tewsi; 21.06.2012
comment
@SimonTewsi Большая проблема, с которой сталкивается большинство людей, это 1. Git не заботится об отдельных файлах. 2. Вы всегда работаете локально над всем, что делаете. Мне потребовалось некоторое время, прежде чем я понял, как связаны друг с другом Fetch, Pull и Checkout. Кроме того, с помощью Git довольно легко все испортить. Но я не нашел беспорядка, который также нельзя было бы исправить. Все остальное не поможет переписать историю и сказать всем остальным разработчикам, что они должны повторно клонировать. Переписывание истории является крайней мерой и требует, чтобы все остальные участники переделали свои локальные репозитории. - person Andrew T Finnell; 21.06.2012
comment
Проблема не в том, чтобы знать, чего я не знаю. Я думал, что понял разницу между pull и fetch, но я никогда раньше не сталкивался с проверкой удаленной ветки. Я думаю, что мне нужно вернуться и сделать что-то вроде учебника, чтобы заполнить пробелы в моих знаниях. Одна хорошая вещь, которую я нахожу в git, заключается в том, что я могу просто взять копию локального репо и поэкспериментировать с ней, зная, что у меня есть еще одна копия, если я что-то испорчу. - person Simon Tewsi; 21.06.2012
comment
@AndrewFinnell, то, что делает выборка, сильно зависит от того, были ли git fetch предоставлены какие-либо спецификации ссылок или что настроено в параметре конфигурации выборки для данного удаленного устройства, с которого выполняется выборка, когда спецификации ссылок не указаны явно. В наиболее распространенном случае (извлечение без явных спецификаций ссылок + стандартная спецификация ссылок в .git/config для данного удаленного устройства) выборка просто приносит все головки (ветви) с удаленного устройства и (принудительно) обновляет соответствующие локальные ветки удаленного отслеживания, создавая те, которых еще нет. - person kostix; 22.06.2012

В дополнение к ответу Эндрю Финнелла:

После выбора Git Extensions > Checkout Branch (в контекстном меню проводника Windows) откроется диалоговое окно Checkout Branch.

Выберите Удаленная ветка и имя удаленной ветки, которую нужно открыть, и нажмите Оформить заказ. Откроется диалоговое окно Checkout Remote Branch.

В диалоговом окне Checkout Remote Branch выберите Сбросить локальную ветвь с именем {branch name}' и убедитесь, что установлен флажок Объединить, а затем нажмите Checkout:

Диалоговое окно проверки удаленного отделения

Это создаст новую локальную ветку, обновит ее изменениями из удаленной ветки и создаст сопоставление между локальной и удаленной ветвями, чтобы изменения можно было передавать и извлекать между ними.

ПРИМЕЧАНИЕ. Не устанавливайте флажок «Создать локальную ветку с именем '{remote name}_{название ветки}'». Это создаст локальную ветвь, но перед ней будет указано имя удаленного репозитория (в приведенном выше примере локальная ветвь будет называться «origin_DSIChanges» вместо «DSIChanges»).

person Simon Tewsi    schedule 21.06.2012

Да, вы делаете это неправильно, и вот как вы должны это сделать (через графический интерфейс); Вы получаете коммиты удаленной ветки в свою локальную ветку, но вам также необходимо объединить удаленную ветку с локальной веткой. Пожалуйста, выберите опцию «Объединить удаленную ветку с текущей веткой», никогда не выбирайте «Только извлекать, не объединять».

person Prakhar Jain    schedule 28.10.2015