Подтвердить что ты не робот

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

Я слышал, что в Git вы можете оставить local branch A дорожку еще один local branch B.

Почему кто-то хочет это сделать?

4b9b3361

Ответ 1

Главное, что приходит в голову, если локальная ветвь отслеживает другую локальную ветвь, - это (1) более информированные сообщения из Git относительно ветки впереди/позади отслеживаемой ветки и (2) триггерных крючков.

В одной области Git отображается дополнительная информация при создании ветки. Создание основного ветки выглядит следующим образом:

$ git co -b A master
Switched to a new branch 'A'

При создании ветки отслеживания выглядит так:

$ git co --track -b B master
Branch B set up to track local branch master.
Switched to a new branch 'B'

Это добавит следующее в .git/config:

[branch "B"]
    remote = .
    merge = refs/heads/master

После выполнения некоторых изменений в ветвях A и B выполнение git status -s -b на ветке A отображает ## A, а на ветке B отображает ## B...master [ahead 1, behind 1], предоставляя некоторую быструю информацию о взаимосвязи между ветки B и master.

Другая область, в которой вы хотите, чтобы локальная ветвь отслеживала другую локальную ветвь, вызывает триггер hooks; в частности pre-receive, update, post-receive и post-update во время git push. У вас могут быть крючки, например, для запуска сборки на сервере непрерывной интеграции, проверки некоторых заголовков лицензий, проверки ошибок формата пробела и т.д.

Ответ 2

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

git checkout --track -b experiment stable
* do some experiments with some commits *
git push

Кроме того, это может быть для последовательности (это просто предположение).

Ответ 3

Обратите внимание, что информация о впереди/позади между одной ветвью "B" и другой "A", отслеживаемая первым, работает только в том случае, если конфигурация branch.B.merge строго определена: refs/heads/master.
Это не сработает, если он свободно определяет: 'master'.

Но с commit 05e7368, сделанный Junio ​​C Hamano (gitster) для Git 2.3.0 (Q1 2015), это тоже будет работать.

При проверке ветки, которая настроена для сборки поверх другого (часто, ветвь удаленного отслеживания), "git checkout" сообщает, как ваша работа относится к другой ветки, например.

Your branch is behind 'origin/master', and can be fast-forwarded.

Назад, когда эта функция была введена, это было сделано только для ветвей, которые построены на ветках удаленного отслеживания, но 5e6e2b4 (Сделать локальный ветки ведут себя как удаленные ветки, когда --tracked, 2009-04-01, Git 1.6.3) добавлена ​​поддержка, чтобы дать тот же отчет для ветвей, которые строятся на других локальных ветвях (например, ветки, чьи переменные branch.*.remote . ').
Однако, в отличие от поддержки ветвей, построенных на ветвях удаленного отслеживания, этот не учитывал тот факт, что конфигурации branch.*.merge разрешено записывать сокращенное название ветки.

Когда branch.*.merge установлено на 'master' (не 'refs/heads/master'), то есть "моя ветка строится на локальной" основной ветке ", это вызвало" git checkout "для отчета:

Your branch is based on 'master', but the upstream is gone.

Верхний поток - это наш репозиторий и определенно не ушел, поэтому это вывод - бессмыслица.

Ответ 4

Существует много случаев, когда полезно отслеживать другую локальную ветвь. Например, в некоторых рабочих процессах git есть что-то на месте, защищающее мастер от непосредственного получения push-запросов. Одним из примеров является система обзора кода или система непрерывной интеграции, которая должна пройти до совершения посылки на удаленную ветку. Другим примером является то, что управление проектом осуществляется набором коммиттеров, которые принимают только запросы на загрузку (проекты GitHub часто это делают). Как разработчик, я могу создать ветвь функции, а затем отправить эту ветку для просмотра (или отправить запрос на перенос коммиттерам репо). Затем я могу продолжить локальное развитие, в то время как мои товарищи по команде асинхронно просматривают мой код и сборки CI. Чтобы продолжить разработку поверх моей предыдущей фиксации, я могу создать вторую локальную ветвь, которая отслеживает мою первую локальную ветвь. Это позволяет мне строить из моей первой фиксации, даже если эта фиксация не попала в удаленную ветвь вверх. Кроме того, если кто-то предлагает изменения кода для моего первого ветки или сбои сборки CI, я могу обновить эту ветвь, а затем переустановить эти изменения в локальные ветки вниз по потоку. Вот как настроить ветвь для отслеживания другой локальной ветки.

Для локальной ветки функции:

$ git co -b branch-1
$ git branch -u origin/master
Switched to a new branch 'branch-1'
$ git branch -vv
* branch-1                9f0c361 [origin/master] Some commit message
  master                  85ede1a [origin/master] Some commit message

Это показывает, что локальные ветки отслеживания master и branch-1 отслеживают ветвь master на пульте origin. Теперь я могу создать другую ветку и настроить ее для отслеживания локальной ветки отслеживания branch-1.

$ git co -b branch-2
Switched to a new branch 'branch-2'
$ git branch -u branch-1 branch-2
Branch branch-2 set up to track local branch branch-1 by rebasing.
$ git branch -vv
  branch-1                85ede1a [origin/master] Some commit message
* branch-2                85ede1a [branch-1] Some commit message
  master                  85ede1a [origin/master] Some commit message