Что такое ветка трекинга?

173

Может кто-нибудь объяснить "отслеживание ветки", как оно относится к git?

Вот определение из git-scm.com :

'Отслеживающая ветвь' в Git - это локальная ветвь, которая подключена к удаленной ветке. Когда вы нажимаете и тянете за эту ветку, она автоматически толкает и тянет к удаленной ветке, с которой она связана.

Используйте это, если вы всегда вытягиваете из одной ветки вверх по течению в новую ветку, и если вы не хотите явно использовать «git pull».

К сожалению, будучи новичком в git и пришедшим из SVN, это определение не имеет для меня никакого смысла.

Я читаю « Прагматическое руководство по Git » (кстати, отличную книгу), и они, похоже, предполагают, что отслеживание ветвей - это хорошая вещь и что после создания вашего первого удаленного (в данном случае источника) вам следует настройте свою основную ветвь как ветвь отслеживания, но, к сожалению, она не охватывает то, почему ветвь отслеживания является хорошей вещью или какие преимущества вы получаете, настроив основную ветвь в качестве отслеживающей ветви вашего исходного репозитория .

Может ли кто-нибудь, пожалуйста, просветить меня (на английском языке)?

jerhinesmith
источник
6
Одно замечание по терминологии: слово track в Git очень сильно перегружено. Некоторые файлы отслеживаются, а некоторые - нет; некоторые имена веток называются ветвями удаленного отслеживания; и вы можете использовать эту --trackопцию, чтобы создать (локальную) ветвь, в которой одна из этих веток удаленного отслеживания установлена ​​в качестве восходящей . Терминология несколько развилась в период между 2006 и 2019 годами, поэтому разные люди могут иногда означать что-то другое под каждым из этих слов.
Торек
Я лично рекомендую использовать фразу удаленного отслеживания вместо ветвей удаленного отслеживания , отчасти потому, что слово ветвь также довольно перегружено. Имена удаленного слежения выглядят так origin/master: они находятся в вашем репозитории, но они представляют собой способ помнить имена веток в вашем Git, как это видно в каком-то другом репозитории Git origin. Если вы затем использовать слово вверх по течению , которое является более современным термином, чтобы сказать , что ваш masterуже origin/masterустановлен в качестве его вверх по течению , вы можете избежать всего этого терминологической путаницы.
Торек

Ответы:

141

Книга ProGit имеет очень хорошее объяснение :

Отслеживание филиалов

Извлечение локальной ветки из удаленной ветки автоматически создает так называемую ветку отслеживания. Отслеживающие ветви - это локальные ветви, которые имеют прямое отношение к удаленной ветви. Если вы используете отслеживающую ветвь и вводите git push, Git автоматически знает, какой сервер и ветвь использовать. Кроме того, выполнение в git pullто время как в одной из этих ветвей выбирает все удаленные ссылки, а затем автоматически сливается в соответствующую удаленную ветку.

Когда вы клонируете репозиторий, он обычно автоматически создает основную ветвь, которая отслеживает происхождение / мастер. Именно поэтому git pushи git pullработают из коробки без других аргументов. Однако вы можете настроить другие ветви отслеживания, если хотите - те, которые не отслеживают ветви по источнику и не отслеживают основную ветку. Простой случай - пример, который вы только что видели, работает git checkout -b [branch] [remotename]/[branch]. Если у вас Git версии 1.6.2 или новее, вы также можете использовать --trackсокращение:

$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "serverfix"

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

$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "sf"

Теперь ваш местный филиал sfбудет автоматически выдвигать и вытягивать origin/serverfix.

БОНУС: дополнительная git statusинформация

С помощью ветки трекинга git statusвы узнаете, насколько далеко вы находитесь за вашей веткой трекинга - полезно напомнить, что вы еще не отправили свои изменения! Это выглядит так:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

или

$ git status
On branch dev
Your branch and 'origin/dev' have diverged,
and have 3 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

Assaf Lavie
источник
21
Просто хотел прояснить это: «Извлечение локальной ветки из удаленной ветки автоматически создает так называемую ветку отслеживания». Это вводит в заблуждение. Без опции --track любая созданная вами ветка не будет отслеживаться.
JohnO
@JohnO, возможно, захочу поговорить с парнем из Pro Git. Вся книга является результатом массового редактирования редактирования IIRC.
Ассаф Лави
2
@ JohnO, в соответствии с: sbf5.com/~cduan/technical/git/git-4.shtml - по умолчанию включено - и не является обязательным.
Хэнк Лин
50

Ниже приведены мои личные заметки о ветвях отслеживания GIT, надеюсь, это будет полезно для будущих посетителей:

введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь


Отслеживание веток и "git fetch":

введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь

hagrawal
источник
Спасибо за заметки! Не могли бы вы поделиться ими, если это возможно? Спасибо;
Адитья
@Aditya: Этот вопрос предназначен для отслеживания веток, и я разместил все свои заметки на эту тему. Если я найду другой важный вопрос, на котором я смогу опубликовать свои другие заметки GIT, я буду рад сделать это.
Хагравал
Спасибо! То, что я имел в виду, это опубликовать их в своем блоге или что-то :). Еще раз спасибо за хорошие заметки!
Адитья
@Aditya: Ах, я вижу. Теперь вам понятно, что вы имеете в виду. Я запаздываю на своем веб-сайте, но еще не создал его для себя.
Хагравал
43

Книга Pro Git упоминает :

Отслеживающие ветви - это локальные ветви, которые имеют прямое отношение к удаленной ветви.

Не совсем. Вопрос SO " Трудно понятьgit-fetch " включает в себя:

Нет такой концепции локальных отслеживающих ветвей, только удаленные отслеживающие ветви.
Так origin/masterэто дистанционное слежение отделение для masterв originрепо.

Но на самом деле, как только вы установите связь между ветвями вверх по течению :

  • местный филиал как master
  • и ветка удаленного отслеживания, как origin/master

Затем вы можете рассматривать masterкак локальную ветвь отслеживания : она отслеживает удаленную ветвь отслеживания, origin/master которая, в свою очередь, отслеживает основную ветвь репо восходящего потока origin .

альтернативный текст

VonC
источник
Пояснение к изображению: «Мой компьютер на 2 коммита впереди источника» Вот откуда берутся эти два коммита мастера. Изображение: progit.org/book/ch3-5.html
idbrii
Правильно ли я интерпретирую: если у меня локально установлены удаленные пульты для источника и восходящего потока, то моя локальная главная ветвь будет отслеживать источник напрямую и косвенно вверх? например: когда я git statusполучу сообщение об отслеживании фиксации в отношении репо как источника, так и вышестоящего репозитория? (Настройка: я локально клонировал чье-то репо, перенес свой клон в новое репо на своей учетной записи GitHub и локально установил удаленные и исходящие пульты для своего репозитория github и клонированного клонированного репо соответственно).
Шерил Хохман
3
@SherylHohman Нет: местный филиал не будет отслеживать ничего «прямо» или «косвенно». Он будет отслеживать удаленную ветку отслеживания, которую вы ему назначите. В случае разветвления лучше всего отслеживать восходящий поток (исходное репо) для общих веток (например, master) и отслеживать происхождение (ваш удаленный ветвь) для новых веток (ваш PR или ветки функций): см. Stackoverflow.com/ a / 21847690/6309
VonC
2
@VonC - утверждение «Нет такой концепции локальных ветвей отслеживания, только удаленные ветви отслеживания». интересно, потому что есть такая противоречивая терминология вокруг ветвей. Эта часто упоминаемая ссылка web.archive.org/web/20130419172453/http://www.gitguys.com/… различает «ветви отслеживания» и «ветви удаленного отслеживания». Они называют origin / master «удаленной ветвью отслеживания» - я согласен - но затем они также называют «master» «отслеживающей ветвью». Что такое мастер отслеживания? Они не правы или это проблема терминологии?
Howiecamp
2
@Howiecamp, то, что они называют «отслеживающей ветвью, называемой master», - это просто локальный ведущий филиал с ассоциированным источником / master удаленной отслеживающей ветви, здесь для запоминания последнего SHA1, извлеченного из источника относительно его удаленной главной ветви. Так что это «ярлык» для обозначения «локальной ветки с восходящей веткой»
VonC
7

Вот как я добавил ветку отслеживания, чтобы я мог извлечь ее из своей новой ветки:

git branch --set-upstream-to origin/Development new-branch
agrublev
источник