2

Я создал репозиторий в локальном и нажал все изменения в github. Позже я создал новую ветку («git branch v2») под названием «v2» и сделал некоторую модификацию, а также переместил эту ветвь в github. Позже, когда я выполнял команду «git remote show origin», я получаю следующий вывод.Отслеживание Git отслеживания

* remote origin 
    Fetch URL: https://github.com/mayuran19/se24_P03.git 
    Push URL: https://github.com/mayuran19/se24_P03.git 
    HEAD branch: master 
    Remote branches: 
    master tracked 
    v2  tracked 
    Local branch configured for 'git pull': 
    master merges with remote master 
    Local refs configured for 'git push': 
    master pushes to master (local out of date) 
    v2  pushes to v2  (local out of date) 

Но когда я выполнял команду «мерзавец ветвь -vv» он показывает ветвь «v2» не является отслеживание филиала.

master bad4ed9 [origin/master] Correct name 
    * v2  6ec46b0 Data files 

Мой вопрос, почему ветвь v2 не показывает, как гусеничная ветвь, даже если удаленный филиал доступен в GitHub и я могу сделать Нажимное эту отрасль?

Выходной сигнал команды «мерзавец ветви -a» показывает следующий вывод

master 
* v2 
    remotes/origin/master 
    remotes/origin/v2 

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

ответ

4

Прежде всего нам нужно несколько определений.

A Местный Ветвь (также называемая «веткой» без модификатора) - это имя, полное имя которого начинается с refs/heads/. При использовании git branch вы увидите свои филиалы по умолчанию. Команда git branch отбрасывает часть refs/heads/, оставляя вас с именами, такими как master и v2.

A удаленное отслеживание ветка - это имя, полное имя которого начинается с refs/remotes/ (а затем после этого имеет название пульта дистанционного управления). При использовании git branch -r команда покажет вам ветви удаленного отслеживания. Команда git branch -r отключает часть refs/remotes/, оставляя вас с именами origin/master и origin/v2.

Префикс-зачистки в обоих направлениях: git branch снимает его, и вы тоже можете его оставить. Это предназначено для удобства и работает хорошо, пока вы случайно не укажете свои (обычные, локальные) имена филиалов, начиная с origin/. (Если вы случайно назовете локальный филиал origin/abc, например, вы можете смутить себя, и полезная дезактивация префиксов git станет вредной.)

(Обратите внимание, что все эти объекты локальны в вашем собственном репозитории, несмотря на то, что имя "remote -tracking». Дополнительные ссылки могут существовать также и вы можете увидеть их все с git for-each-ref, который покажет все ссылки, используя его полное имя. Большую часть времени вам не нужно, и git branch достаточно.)

A (регулярная, локальная) ветвь может быть установлена ​​в трек другой филиал. Создание одной ветки отслеживает другую, делает несколько вещей для вас, например, git status скажет вам, когда вы впереди и/или сзади, и в том числе другую ветвь в git branch -vv. (Настройка отслеживания - это не то же самое, что и ветка удаленного отслеживания. Опять же, локальная ветвь - это имя, имя которого начинается с refs/heads/, и его имя не изменяется, установлено ли оно для отслеживания другой ветви. Однако терминология, безусловно, сбивает с толку.)

Чтобы сделать одну ветку дорожки другой, сначала проверьте первую ветку (ту, которую вы хотите выполнить отслеживание). Затем запустите git branch --set-upstream-to otherbranch. Например, чтобы сделать v2 трек origin/v2:

git checkout v2 
git branch --set-upstream-to origin/v2 

Чтобы сделать местное отделение отслеживать другой местный филиал, просто использовать локальное имя ветви, а не имя удаленного отслеживания филиала. Чтобы локальная ветка перестала отслеживать что-либо, используйте git branch --unset-upstream.

Там еще один трюк, чтобы все это, , который является то, что, когда вы просите git checkout проверить (но не создавать) местное отделение, который не существует, git checkout будет искать, чтобы увидеть, если есть remote- отслеживая ветку с похожим именем. Если это так, то будет создать местное отделение и настроить его для отслеживания ветви удаленного слежения. То есть, если ветвь v2не существует, например, если переименовать или удалить существующий локальный v2origin/v2 еще делает существует, то:

git checkout v2 

создает местное отделение v2и устанавливает его для отслеживания origin/v2, все сразу.

От ветке не нужно отслеживать другую ветку, чтобы нажимать и извлекать/объединять/перетаскивать/вытягивать, но настраивая ее как отслеживание, можно сделать все эти операции более удобными.


Как обычно с мерзавцем, есть на самом деле больше способов, чтобы сделать местные филиалы отслеживать что-то другое. Вы можете настроить локальный филиал для отслеживания ветки удаленного отслеживания на успешном git push, добавив -u к нажатию. Вы можете использовать команду (устаревшая) git branch --set-upstream. Вы можете использовать флаги для git checkout или git branch для создания или воссоздания филиала с набором отслеживания. И вы можете использовать git config (с двумя отдельными командами git config), чтобы локальная ветвь отслеживала другую ветвь.

+0

Хороший ответ. Интересно, почему git не устанавливает отслеживание для нового локального ветви, когда 'git push' из этой ветки? – Artyom

+0

@Artyom: 'git push' * будет * устанавливать восходящий поток *, если * вы добавляете флаг' -u', как я заметил в сноске.Эта функция была новой в git 1.7.0. – torek

2

TL; DR v2 не является отслежённой веткой - не установлен восходящий поток. pull не будет работать (как вы думаете). push работает по правилам push по умолчанию.

Моим вопрос, почему ветвь v2 не отображается как гусеничная ветвь

Если вы посмотрите на .git/конфигурации, вы увидите branch "master" строфы с отслеживанием информации, но вы не увидит строфу branch "v2", т. е. v2 не является ветвью отслеживания.

даже если удаленный филиал доступен в GitHub

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

$ git push -u origin v2 

я могу сделать Нажимное эту отрасль

pull не будет делать то, что вы ожидаете, так как v2 не отслеживает восходящий поток. Он обновит ветвь удаленного отслеживания origin/v2 в вашем локальном репо, но она не будет смириться (слияние или перебазировать), местная фиксация в локальной ветке v2 с любыми новыми коммитами, сделанными на пульте дистанционного управления. Однако, если никто не делает обновления в ветке v2 на пульте дистанционного управления, вы, вероятно, не заметите проблемы.

push работает из-за стандартных правил push, которые совпадают с именами филиалов.

Remote branches: 
    master tracked 
    v2  tracked 
Local branch configured for 'git pull': 
    master merges with remote master 
Local refs configured for 'git push': 
    master pushes to master (local out of date) 
    v2  pushes to v2  (local out of date) 
  • Remote branches: раздел показывает удаленный отслеживания ветви origin/v2 в вашем репо отслеживает ветвь пульта дистанционного управления v2. (Отслеживание ветви удаленного origin/v2 отличается от вашего местного v2 ветви.)
  • Local branch configured ... раздел показывает только местное отделение master зависит от pull, т.е. master дорожки дистанционного master. v2 не указан - pull не повлияет на него, поскольку он не имеет восходящего потока.
  • Local refs configured ... раздел показывает ваш v2 ветви будет подталкивать/обновление пульта v2 (и обновление origin/v2) - это основано на правилах соответствия по умолчанию кнопочных команд (также в зависимости от того, как установлен вашего push.default конфигурации и какой версия git вы с помощью).

Обратите внимание, что существует небольшое несоответствие или противоречивое поведение между push и pull. Традиционно push без полностью заданного refspec arg по умолчанию не заботится о восходящем потоке - он просто нажимает на удаленный филиал с одинаковым именем. Поскольку отслеживаемая удаленная ветвь часто называется так же, как и локальная ветвь, все работает, и команды push и pull отображают как используемую настроенную ветвь отслеживания. Однако push может работать не так, как ожидалось, если локальная ветвь и удаленная ветвь называются по-разному. Определенные изменения в различных версиях git по отношению к push и push.default, то есть tracking, current и simple, попытайтесь согласовать эти различия.

Дополнительное чтение: