Прежде всего нам нужно несколько определений.
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
не существует, например, если переименовать или удалить существующий локальный v2
-И origin/v2
еще делает существует, то:
git checkout v2
создает местное отделение v2
и устанавливает его для отслеживания origin/v2
, все сразу.
От ветке не нужно отслеживать другую ветку, чтобы нажимать и извлекать/объединять/перетаскивать/вытягивать, но настраивая ее как отслеживание, можно сделать все эти операции более удобными.
Как обычно с мерзавцем, есть на самом деле больше способов, чтобы сделать местные филиалы отслеживать что-то другое. Вы можете настроить локальный филиал для отслеживания ветки удаленного отслеживания на успешном git push
, добавив -u
к нажатию. Вы можете использовать команду (устаревшая) git branch --set-upstream
. Вы можете использовать флаги для git checkout
или git branch
для создания или воссоздания филиала с набором отслеживания. И вы можете использовать git config
(с двумя отдельными командами git config
), чтобы локальная ветвь отслеживала другую ветвь.
Хороший ответ. Интересно, почему git не устанавливает отслеживание для нового локального ветви, когда 'git push' из этой ветки? – Artyom
@Artyom: 'git push' * будет * устанавливать восходящий поток *, если * вы добавляете флаг' -u', как я заметил в сноске.Эта функция была новой в git 1.7.0. – torek