Featured image of post Зачем делать git stash при каждом переключении веток? Что такое Git Worktree? В чем разница между Git Worktree и Git Branch? Как использовать Git Worktree для создания высокоэффективного многопоточного процесса разработки

Зачем делать git stash при каждом переключении веток? Что такое Git Worktree? В чем разница между Git Worktree и Git Branch? Как использовать Git Worktree для создания высокоэффективного многопоточного процесса разработки

Разрабатываете новую функцию и столкнулись со срочным багом? Хватит прятать код с помощью git stash! Обзор ключевых концепций Git Worktree, отличий от Git Branch, практической структуры каталогов и лучших практик работы с AI Agent.

Бывали ли вы в такой ситуации? Вы в самом разгаре разработки сложной новой функции, код готов наполовину, и вдруг приходит срочный баг, требующий немедленного исправления.

Чтобы переключить ветку (branch), вам приходится неохотно выполнять git stash, чтобы спрятать недописанный код. Исправив баг и вернувшись, вы осторожно делаете git stash pop, иногда сталкиваясь с кошмаром конфликтов кода (conflict).

На самом деле в Git давно есть мощный инструмент для решения этой проблемы — Git Worktree.

Попрощайтесь с хаотичным переключением веток и Stash и откройте для себя многопоточную разработку с Worktree

Эта статья поможет вам разобраться в его ключевых принципах и практическом применении.

В чем разница между Git Worktree и Git Branch?

Чтобы понять Git Worktree, давайте сначала выясним его отличие от Git Branch.

Мы можем сравнить контроль версий с чтением бумажной книги:

  • Commit — это издание / версия книги
  • Branch — это закладка, вложенная на определенной странице
  • Worktree — это рабочий стол, на котором вы раскладываете книгу

При традиционном подходе у нас есть только один рабочий стол. Каждый раз, когда нужно сменить закладку, приходится убирать все редактируемые бумаги со стола или прятать их в ящик (что и делает git stash).

В то же время Git Worktree позволяет вам иметь несколько независимых рабочих столов одновременно.

Критерий сравнения Git Branch Git Worktree
Концепция Workspace Использует один физический рабочий каталог Имеет несколько независимых физических рабочих каталогов
Затраты на переключение Требуются commit, stash или сохранение изменений Без stash; достаточно просто перейти в другой каталог
Изоляция и безопасность Незакоммиченные файлы могут вызвать конфликты Каталоги полностью изолированы, изменения не мешают друг другу
История изменений Использует общую историю Commit и веток Git Использует общую историю Commit и веток Git

Текущая ветка, Staging Area и незакоммиченные изменения в каждом Worktree полностью независимы, но они используют общую историю Commit и записи веток.

Branch — это закладка версии, а Worktree — это физический рабочий стол

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

Как начать использовать Git Worktree?

При внедрении Git Worktree в реальные проекты грамотное планирование каталогов делает разработку значительно более гладкой.

Рекомендуется сохранять исходный каталог проекта, клонированный через git clone, как чистый штаб main, а новые каталоги Worktree размещать за пределами основного проекта (например, ../my-app-worktrees), чтобы избежать ошибок рекурсивного сканирования инструментами разработки.

Типичный порядок команд выглядит следующим образом:

Этап Команда
1. Создать новый Worktree и одновременно новую ветку git worktree add ../my-app-worktrees/feature-login -b feature-login
2. Просмотреть список всех текущих Worktree git worktree list

Git Worktree отлично подходит для управления задачами разработки AI Agent.

Вы можете выделить AI Agent отдельный каталог Worktree, чтобы он свободно вносил изменения и тестировал их, пока разработчик-человек выполняет ревью кода (Review) и тестирование в другом Worktree.

Выделите AI Agent отдельный Worktree, чтобы разработка ИИ и проверка человеком выполнялись параллельно

Оба работают в своих физических каталогах, что безопасно и наглядно.

Как безопасно слить изменения и выполнить очистку после завершения разработки?

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

Запомните важную концепцию: Сам каталог Worktree сливать не нужно, сливать нужно именно Branch.

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

Для очистки следуйте стандартной двухшаговой процедуре:

Шаг Команда
1. Удалить физический каталог Worktree git worktree remove ../my-app-worktrees/feature-login
2. Удалить завершенную ветку функции git branch -d feature-login

Сначала удалите каталог Worktree, затем удалите Branch

Обязательно используйте команду git worktree remove для очистки, вместо ручного удаления папки через проводник.

Каковы распространенные подводные камни при использовании Git Worktree?

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

Подводный камень 1: Потеря незакоммиченных изменений

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

Подводный камень 2: Конфликт занятости ветки

Защитный механизм Git не позволяет выполнять Checkout одной и той же ветки одновременно в двух разных Worktree. Если вы попытаетесь переключиться на уже занятую ветку во втором Worktree, Git заблокирует действие и выдаст ошибку.

Принудительное удаление Worktree приведет к потере несохраненных через Commit изменений

Освоив эти особенности и принципы, вы легко избежите ошибок.

Заключение

Благодаря Git Worktree мы можем навсегда попрощаться с хаотичным переключением веток и процессом git stash, достигнув настоящей многопоточной разработки.

В следующий раз, когда вам понадобится срочно исправить баг, вести разработку нескольких функций одновременно или поручить задачи по написанию кода AI Agent, попробуйте открыть новый рабочий стол!

Reference

All rights reserved,未經允許不得隨意轉載
Создано при помощи Hugo
Тема Stack, дизайн Jimmy