Для чего я должен использовать git -worktree?

Я прочитал сообщение Github в git -worktree. Они пишут:

Предположим, что вы работаете в репозитории Git в ветки с именем feature, когда пользователь сообщает об ошибке с высокой срочностью в master. Сначала вы создаете связанное рабочее дерево с новой ветвью, hotfix, вывезено относительно мастера [...] Вы можете исправить ошибку, нажать исправление и создать запрос на перенос.

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

С другой стороны, использование git -worktree имеет свои ограничения:

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

Почему я должен выбрать более сложный рабочий процесс для проблемы, которая уже решена?

Есть ли что-нибудь о git-worktree, которое нельзя было сделать заранее, и что оправдывает всю эту новую сложную функцию?

Ответ 1

Для меня git worktree - самое большое улучшение за долгое время. Я работаю в области разработки программного обеспечения для предприятий. Там очень часто приходится поддерживать старые версии, такие как выпущенные 3 года назад. Конечно, у вас есть ветка для каждой версии, чтобы вы могли легко переключиться на нее и исправить ошибку. Однако переключение обходится дорого, потому что вы полностью реструктурировали хранилище и, возможно, собрали систему. Если вы переключитесь, ваша среда IDE начнет работать с ума, пытаясь адаптировать настройки проекта.

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

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

Теперь единственная недостающая часть - это официальная версия git 2.5 для Windows, но есть надежда, что скоро выйдет новый git для Windows :-) (редактировать: выпущен сейчас)

Ответ 2

Я могу увидеть некоторые варианты использования этого.

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

Итак, с git-worktree у меня появилась бы вторая идея для другого ветки, работающего там.

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

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

Ответ 3

Одно очевидное использование - одновременное сравнение поведения (не источника) разных версий - например, разных версий веб-сайта или только веб-страницы.

Я попробовал это локально.

  • создать каталог page1.

  • внутри создайте каталог src и git init it.

  • in src создайте page1.html с небольшим количеством содержимого и зафиксируйте его.

  • $ git branch ver0

  • $ git worktree add ../V0 ver0

  • в src мастер добавляет больше текста в page1.html и фиксирует его.

  • $ git branch sty1

  • отредактируйте page1.html в ветке sty1 (добавьте некоторый отличительный стиль CSS) и добавьте commit it.

  • $ git worktree add ../S1 sty1

Теперь вы можете использовать веб-браузер для одновременного открытия и просмотра этих трех версий:

  • ..\page1\src\page1.html//любой git имеет текущий

  • ..\page1\V0\page1.html//начальная версия

  • ..\page1\S1\page1.html//версия в стиле эксперимента

Ответ 4

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

    • манипулирование извлеченными файлами при необходимости внесения изменений в другое место (например, компиляция/тестирование)

    • Различают файлы с помощью обычных инструментов diff

    • во время конфликтов слияния я часто хочу перемещаться по исходному коду, поскольку он находится на стороне источника при разрешении конфликтов в файлах.

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

    • ментальная стоимость переключения ментального контекста между ветвями через git stashing не поддается измерению. Некоторые люди находят, что существуют ментальные издержки, связанные с тем, что их нет, просто открывая файлы из другого каталога.

  • Некоторые люди спрашивают: "Почему бы не сделать несколько локальных клонов". Это правда, что с флагом "--local" вам не нужно беспокоиться об использовании дополнительного дискового пространства. Это (или подобные идеи) - это то, что я сделал до этого момента. Функциональные преимущества для связанных рабочих мест над локальными клонами:

    • С помощью локальных клонов ваши дополнительные рабочие деревья (которые находятся в локальных клонах) просто не имеют доступа к источникам происхождения или вверх по течению. "Начало" в клоне не будет таким же, как "происхождение" в первом клоне.

      • Выполнение git log @{u}.. или git diff origin/feature/other-feature может быть очень полезным, и это невозможно или более сложно. Эти идеи технически возможны с локальными клонами через множество трудовых ресурсов, но каждое обходное решение, которое вы могли бы сделать, делалось лучше и/или проще с помощью связанных рабочих деревьев.
    • Вы можете делиться ссылками между рабочими. Если вы хотите сравнить или заимствовать изменения из другого локального ветки, теперь вы можете.

Ответ 5

tl; dr: В любой момент, когда вы хотите, чтобы два рабочих дерева проверялись одновременно по какой-либо причине, git-worktree - это быстрый и экономичный способ сделать это.

Если вы создаете другую рабочую строку, большинство частей репо (т.е. .git) будут разделяться, что означает, что если вы создадите ветвь или извлечете данные, когда находитесь в одном дереве работ, она также будет доступна из любой другой работы деревья у вас есть. Предположим, вы хотите запустить тестовый пакет на ветке foo, не нажимая его где-нибудь, чтобы клонировать его, и вы хотите избежать проблем с клонированием своего репо локально, используя git-worktree - это хороший способ создать только новую проверку некоторых в отдельном месте, временно или постоянно. Точно так же, как с клоном, все, что вам нужно сделать, когда вы закончите с ним, это удалить его, и ссылка на него будет собираться через мусор через некоторое время.

Ответ 6

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

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

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

Ответ 7

У меня довольно необычное: я занимаюсь разработкой Windows и Linux на одной машине. У меня есть виртуальная машина Linux, работающая под Linux. VirtualBox монтирует некоторые каталоги Windows и использует их непосредственно на машине Linux. Это позволяет мне использовать Windows для управления файлами, но для сборки в Linux. Это кросс-платформенный проект, поэтому он основывается как на Windows, так и на Linux из той же структуры каталогов.

Проблема в том, что системы сборки Linux и Windows врезаются друг в друга при использовании в одном каталоге; есть несколько сложных этапов сборки для загрузки библиотек и т.д., которые используют одни и те же имена каталогов. Windows-версия системы сборки загружает библиотеки, специфичные для Windows, а Linux-версия системы сборки загружает библиотеки, специфичные для Linux.

В идеальном мире система сборки будет модифицирована так, чтобы Windows и Linux могли сосуществовать внутри каталога, но на данный момент проблема решается с помощью рабочих деревьев. Папка "Linux" может генерировать артефакты сборки для Linux, а папка "Windows" может генерировать артефакты сборки Windows. Хотя это вряд ли идеальное решение, он делает приятную остановку, ожидая, когда будут исправлены ошибки системы сборки.

По общему признанию, worktree не был предназначен для этого; Я должен держать версию Windows и версию Linux в отдельных ветвях, хотя я бы предпочел, чтобы они были в одной ветке. Тем не менее, это делает работу, и это несколько нетрадиционный случай трудоустройства, спасающего день.

Ответ 8

В новом проекте для меня я создал функцию. Но некоторые спецификации не удались. Чтобы сравнить результаты с master, я создал репозиторий work-tree. Я сравнивал результаты шаг за шагом в коде запуска, пока не понял, что пошло не так.

Ответ 9

Я использую git worktree для разработки машинного обучения.

У меня есть основной функциональный код, а затем я хочу разделить ветки разных экспериментов (разные алгоритмы и разные гиперпараметры). git worktree позволяет мне интегрировать dvc вместе с различными версиями моего кода, специализирующимися на разных алгоритмах. После выполнения всех учебных заданий я оцениваю итоговые метрики и объединяюсь, чтобы освоить лучшую отрасль/модель.