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

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

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

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

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

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

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

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

7 ответов

Решение

Книга 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, надеюсь, это будет полезно для будущих посетителей:

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


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

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

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

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

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

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

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

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

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

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

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

git branch --set-upstream-to origin/Development new-branch

TL;DR Помните, что все ветки git сами по себе используются для отслеживания истории набора файлов. Следовательно, не каждая ветвь на самом деле является «ветвью отслеживания» , потому что эти ветки используются для того, чтобы отслеживать историю файлов с течением времени. Таким образом, нам, вероятно, следует вызывать обычные git «ветки», «трекинг-ветки», но мы этого не делаем. Вместо этого мы сокращаем их название до «ветвей».

Отчасти поэтому термин «отслеживание ветвей» так ужасно сбивает с толку: для непосвященных он может легко означать две разные вещи.

В git термин «Отслеживающая ветка» - это краткое название более полного термина: «Удаленная-отслеживающая ветка» .

Возможно, сначала будет лучше, если вы замените их более формальными терминами, пока вы не освоитесь с этими концепциями.

Давайте перефразируем ваш вопрос так:

Что такое "Удаленное отслеживание-ветка?"

Ключевым словом здесь является «Удаленный», так что переходите к тому, где вы запутались, и я опишу, что такое ветка удаленного отслеживания и как она используется.


Чтобы лучше понять терминологию git , включая ветки и отслеживание , что поначалу может сбивать с толку, я думаю, что проще всего, если вы сначала получите кристально ясное представление о том, что такое git, и о базовой структуре того, как он работает . Без такого твердого понимания, я обещаю, вы потеряетесь во многих деталях, поскольку git имеет много сложностей; (перевод: многие люди используют его для очень важных вещей).

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


ЧТО ТАКОЕ GIT И ДЛЯ ЧЕГО

Репозиторий git похож на семейный фотоальбом: в нем хранятся исторические снимки, показывающие, как все было в прошлые времена. «Снимок» - это запись чего-либо в определенный момент времени.

Репозиторий git не ограничивается хранением семейных фотографий людей. Его, скорее, можно использовать для записи и организации всего, что развивается или меняется с течением времени .

Основная идея - создать книгу, чтобы мы могли легко оглядываться во времени,

  • сравнивать прошлые времена с настоящим или другими моментами времени, и
  • воссоздать прошлое.

Когда вы увязнете в сложности и терминологии, постарайтесь вспомнить, что репозиторий git - это, прежде всего, репозиторий снимков , и, как и фотоальбом, он используется как для хранения, так и для организации этих снимков.


СНИМКИ И ОТСЛЕЖИВАНИЕ

отслеживается - следовать за человеком или животным в поисках доказательства того, что они где-то были (dictionary.cambridge.org )

В git « ваш проект » относится к дереву каталогов файлов (один или несколько, возможно, организованных в древовидную структуру с использованием подкаталогов), историю которых вы хотите сохранить.

Git с помощью трехэтапного процесса записывает « снимок » дерева каталогов вашего проекта в определенный момент времени.

Каждый снимок git вашего проекта затем упорядочивается по « ссылкам », указывающим на предыдущие снимки вашего проекта.

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

Например , мы можем начать с самого последнего вашего сегодняшнего снимка, а затем, используя ссылку, искать в прошлом ваши фотографии, сделанные, возможно, вчера или на прошлой неделе, или когда вы были младенцем, или даже кем была ваша мать. , так далее.

Это называется « отслеживанием» ; в данном примере это отслеживание вашей жизни или определение того, где вы оставили след и откуда пришли.


ОБЯЗАНЫ

Фиксация похожа на одну страницу в вашем фотоальбоме с одним снимком в том смысле, что это не только снимок, который там содержится, но также имеет связанную метаинформацию об этом снимке. Это включает в себя:

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

Коммит - самая важная часть хорошо организованного фотоальбома.


СЕМЕЙНОЕ ДЕРЕВО ВО ВРЕМЯ, С ОТРАСЛЯМИ И СЛИЯНИЯМИ

Устранение неоднозначности: «Дерево» здесь относится не к дереву файловых каталогов, как использовалось выше, а скорее к генеалогическому дереву связанных родительских и дочерних коммитов с течением времени.

Структура генеалогического дерева git смоделирована на основе наших собственных генеалогических деревьев.

В дальнейшем, чтобы упростить понимание ссылок, я буду ссылаться на:

  • родитель совершает просто как « родитель », и
  • ребенок совершить просто как « ребенок » или «ребенок» , если множественное число.

Вы должны понимать это инстинктивно, поскольку в основе этого лежит древо жизни:

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

Таким образом, все коммиты, кроме совершенно новых (вы могли бы сказать «подростковые коммиты»), имеют один или несколько дочерних элементов, указывающих на них.

  • Если никакие дочерние элементы не указывают на родителя, тогда эта фиксация является лишь « подсказкой для роста » или местом, откуда будет рождаться следующий ребенок.

  • Когда только один дочерний элемент указывает на родителя, это просто отношения с единственным родителем <- дочерний элемент.

Линейная диаграмма простой единственной родительской цепочки, соединяющейся в обратном направлении во времени:

      (older) ... <--link1-- Commit1 <--link2-- Commit2 <--link3-- Commit3 (newest)

ВЕТВИ

ветка - «Ветка» - это активное направление развития. Самая последняя фиксация в ветке называется вершиной этой ветки. На вершину ветви ссылается головка ветви, которая перемещается вперед по мере того, как в ветви выполняется дополнительная разработка. Один репозиторий Git может отслеживать произвольное количество ветвей, но ваше рабочее дерево связано только с одной из них («текущая» или «извлеченная» ветвь), а HEAD указывает на эту ветвь. ( )

Ветвь git также относится к двум вещам:

  • имя, данное растущему наконечнику (идентификатор), и
  • актуальная ветвь в графе связей между коммитами.

Более чем один дочерний элемент указывает - на родителя -> - это то, что git называет « ветвлением ».

ПРИМЕЧАНИЕ: В действительности любой ребенок, любой родитель, будь то первый, второй, третий и т. Д., Может рассматриваться как их собственная маленькая ветвь с их собственным растущим кончиком. Таким образом, ветвь не обязательно должна быть длинной с множеством узлов, скорее, это небольшая вещь, созданная одним или несколькими коммитами от данного родителя.

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

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

Формально «ветвь» git - это просто имя , например «foo», присвоенное определенной растущей вершине семейной иерархии. Это один из видов того, что они называют « рефери ». (Теги и пульты дистанционного управления, которые я объясню позже, также являются ссылочными.)

ref - имя, которое начинается с refs / (например, refs / heads / master), которое указывает на имя объекта или другую ссылку (последняя называется символической ссылкой). Для удобства ссылку иногда можно сократить, когда она используется в качестве аргумента команды Git; подробности см. в gitrevisions (7). Ссылки хранятся в репозитории.

Пространство имен ref является иерархическим. Различные подиерархии используются для разных целей (например, ссылки / главы / иерархия используются для представления локальных ветвей). Есть несколько специальных ссылок, которые не начинаются с refs /. Самый яркий пример - HEAD. ( )

(Вам следует взглянуть на дерево файлов внутри вашего каталога .git. Здесь сохраняется структура git.)

Так, например, если вас зовут Том, то связанные вместе коммиты, которые включают только ваши снимки, могут быть веткой, которую мы называем «Том».

Итак, хотя вы можете думать о ветке дерева как о всей ее древесине, в git ветка - это просто название, данное ее кончикам роста, а не всей деревянной палке, ведущей к ней.

Специальная верхушка для выращивания и ее ветка, которую арборист (парень, подрезающий фруктовые деревья) назвал бы «центральным лидером», - это то, что git называет « хозяином ».

Основная ветвь существует всегда.

Линейная диаграмма: Commit1 с двумя дочерними элементами (или то, что мы называем " ветвью " git ):

                      parent      children

                        +-- Commit <-- Commit <-- Commit (Branch named 'Tom')
                       /
                      v
(older) ... <-- Commit1 <-- Commit                       (Branch named 'master')    

Помните, что ссылка указывает только от дочернего элемента к родительскому. Нет никакой ссылки, указывающей в обратном направлении, то есть от старого к новому, то есть от родителя к потомку.

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


СЛИЯНИЕ

У детей один или несколько родителей.

  • С одним родителем это просто родительский <- дочерний коммит.

  • При наличии более чем одного родителя это то, что git называет « слиянием ». Каждый ребенок может указывать на более чем одного родителя одновременно, как если бы у него были и мать, и отец, а не только мать.

Линейная диаграмма: Commit2 с двумя родителями (или то, что мы называем git " слияние ", то есть потомство от нескольких родителей):

                      parents     child

           ... <-- Commit
                        v
                         \
(older) ... <-- Commit1 <-- Commit2  

УДАЛЕННЫЙ

Это слово также используется для обозначения двух разных вещей:

  • удаленный репозиторий и
  • локальное имя псевдонима для удаленного репозитория, то есть имя, которое указывает с помощью URL-адреса на удаленный репозиторий.

удаленный репозиторий - репозиторий, который используется для отслеживания того же проекта, но находится в другом месте. Чтобы общаться с пультами дистанционного управления, см. Выборку или нажатие. ( )

(Удаленный репозиторий может даже быть другим репозиторием git на нашем собственном компьютере.) На самом деле существует два URL-адреса для каждого удаленного имени: один для отправки (т.е. загрузки коммитов) и один для извлечения (т.е. загрузки коммитов) из этого удаленного репозитория git.

« Удаленный » - это имя (идентификатор), с которым связан URL-адрес, указывающий на удаленный репозиторий git. (Он был описан как псевдоним для URL-адреса, хотя это нечто большее.)

Вы можете настроить несколько пультов дистанционного управления, если хотите использовать несколько удаленных репозиториев.

Хотя часто у вас есть только один, и его имя по умолчанию - «origin» (то есть исходный источник, из которого вы клонировали).

origin - исходный репозиторий по умолчанию . У большинства проектов есть, по крайней мере, один апстрим-проект, который они отслеживают. По умолчанию для этой цели используется происхождение. Новые обновления восходящего потока будут загружаться в ветки удаленного отслеживания с именем origin / name-of-upstream-branch, которые вы можете увидеть с помощью git branch -r. ( )

Источник указывает, откуда вы клонировали репозиторий.
Этот удаленный репозиторий называется «исходным» репозиторием, а ваш клонированный репозиторий называется «подчиненным» репозиторием.

upstream - В разработке программного обеспечения, upstream относится к направлению к оригинальным авторам или разработчикам программного обеспечения, которое распространяется как исходным кодом.википедия с

восходящая ветка - ветвь по умолчанию, которая объединяется с рассматриваемой ветвью (или ветвь, о которой идет речь, перебазируется на). Настраивается через branch..remote и branch..merge. Если восходящей ветвью A является origin / B, иногда мы говорим: «A отслеживает origin / B». ( )

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

ДИСТАНЦИОННОЕ ОТСЛЕЖИВАНИЕ

Удаленное отслеживание-ветка - это сначала просто имя ветки, как и любое другое имя ветки.

Он указывает на локальную растущую точку, то есть недавнюю фиксацию в вашем локальном репозитории git.

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

ветка удаленного отслеживания - ссылка, которая используется для отслеживания изменений из другого репозитория. Обычно он выглядит как refs / remotes / foo / bar (что указывает на то, что он отслеживает ветку с именем bar на удаленном компьютере с именем foo) и соответствует правой стороне настроенного refspec выборки. Ветвь удаленного отслеживания не должна содержать прямых изменений или иметь локальные коммиты. ( gitglossarygitglossarygitglossarygitglossarygitglossarygitglossary )

Скажем, удаленный, который вы клонировали, имеет только 2 коммита, например: parent42 <== child-of-4, и вы его клонируете, и теперь ваш локальный репозиторий git имеет те же самые точные два коммита: parent4 <== child-of-4.
Ваша ветка удаленного отслеживания с именем origin теперь указывает на child-of-4.

Теперь предположим, что на пульт добавлен коммит, поэтому он выглядит так: parent42 <== child-of-4 <== new-baby. Чтобы обновить локальный репозиторий, расположенный ниже по течению, вам необходимо получить new-baby и добавить его в локальный репозиторий git. Теперь ваша локальная ветка удаленного отслеживания указывает на новорожденного. Вы поняли, что концепция удаленной-отслеживающей ветки состоит в том, чтобы просто отслеживать то, что ранее было вершиной удаленной ветки, которая вам небезразлична.


ОТСЛЕЖИВАНИЕ В ДЕЙСТВИИ

Сначала мы начинаем отслеживать файл с помощью git.

Вот основные команды, связанные с отслеживанием файлов:

      $ mkdir mydir &&  cd mydir &&  git init             # create a new git repository

$ git branch                                        # this initially reports no branches
                                                    #  (IMHO this is a bug!)

$ git status -bs       # -b = branch; -s = short    # master branch is empty
## No commits yet on master

# ...
$ touch foo                                         # create a new file

$ vim foo                                           # modify it (OPTIONAL)


$ git add         foo; commit -m 'your description'  # start tracking foo 
$ git rm  --index foo; commit -m 'your description'  # stop  tracking foo 
$ git rm          foo; commit -m 'your description'  # stop  tracking foo & also delete foo

УДАЛЕННОЕ ОТСЛЕЖИВАНИЕ В ДЕЙСТВИИ

      $ git pull    # Essentially does:  get fetch; git merge    # to update our clone

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

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

ветка git -vv

чтобы увидеть все настроенные ветки отслеживания.

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

статус git

Отслеживание ветки - это не что иное, как способ избавить нас от набора текста.

Если мы отслеживаем ветку, нам не нужно всегда вводить git push origin <branch-name> или же git pull origin <branch-name> или же git fetch origin <branch-name> или же git merge origin <branch-name>. учитывая, что мы назвали наш пульт origin, мы можем просто использовать git push, git pull, git fetch,git mergeсоответственно.

Мы отслеживаем ветку, когда:

  1. клонировать репозиторий с помощью git clone
  2. Когда мы используем git push -u origin <branch-name>. Этот -u сделайте это ветвью отслеживания.
  3. Когда мы используем git branch -u origin/branch_name branch_name
Другие вопросы по тегам