Недавно я смотрел, как я и моя команда используем Git и как работают наши рабочие процессы. В настоящее время мы используем рабочий процесс ветки функций, который, кажется, работает хорошо.
Я также видел, как некоторые люди в нашей команде использовали рабочий процесс, основанный на git stash . Рабочий процесс выглядит примерно так:
- Работа на основной ветке (вроде
master
) - Делайте коммиты по ходу дела
- Если вам нужно получить изменения или переключить ветки, перенесите ваши незафиксированные изменения в тайник
- Как только ваше обновление будет сделано, вытолкните изменения из тайника.
Я должен упомянуть, что этот рабочий процесс используется вместо рабочего процесса ветви функций. Вместо того, чтобы брать ветку и работать над ней, разработчики здесь работают только над одной веткой и выталкивают / выталкивают из стека, как они считают нужным.
Я на самом деле не думаю, что это отличный рабочий процесс, и ветвление было бы более уместным, чем использование git stash таким образом. Я вижу ценность git stash как экстренную операцию, но не для использования ее в повседневной, регулярной работе.
Будет ли использование git stash регулярно считаться анти-паттерном? Если да, то какие конкретные проблемы могут возникнуть? Если нет, каковы преимущества?
If you need to get changes or switch branches, push your uncommitted changes onto the stash
- это именно то, что тайник для.Ответы:
Из Git SCM Book :
Учитывая это описание, я бы сказал, что это Anti Pattern. Чрезмерно упрощенным объяснением Git Stash будет то, что это «вырезать и вставить» управления исходным кодом. Вы берете кучу измененных файлов, «прячете» их в ручке для хранения вне обычного рабочего процесса ветвления в Git, а затем позднее применяете эти изменения к другой ветви.
Возвращаясь немного дальше, приверженность мастерству - это анти паттерн здесь. Используйте ветки. Вот для чего они были созданы.
Это действительно сводится к этому:
Вы можете вбить винт в стену, и он удержит изображение, но вы должны использовать отвертку. Не используйте молоток, когда отвертка сидит рядом с вами.
О совершении "сломанного" кода
Хотя следующее мнение, я пришел к этому мнению из опыта.
Фиксируйте рано, и совершайте часто. Зафиксируйте столько битого кода, сколько захотите. Просматривайте свою локальную историю коммитов как «точки сохранения», пока вы что-то взламываете. Как только вы выполнили логическую часть работы, сделайте коммит. Конечно , это может нарушить все, но это не имеет значения до тех пор , пока вы не толкать эти коммиты. Перед тем как нажать, перебазировать и раздавить ваши коммиты.
Для OP эта ветка сообщений ядра Linux может представлять интерес, потому что это звучит так, как будто некоторые члены команды OP используют Git аналогичным образом.
@RibaldEddie сказал в комментарии ниже:
(рискуя навлечь на себя гнев многих людей)
Линус сказал:
Я думаю, что @RibaldEddie пытается сказать, что вы можете использовать его
git stash
в рабочем потоке ветви функций - и это правда.git stash
Проблема не в том, что это проблема. Это комбинация совершения, чтобы освоить и использоватьgit stash
. Это анти паттерн.Разъяснение
git rebase
Из комментария @ RibaldEddie:
(Акцент мой)
Изменение истории коммитов не так уж и плохо, если это локальная история коммитов . Если вы перебазируете коммиты, которые вы уже выдвинули, вы, по сути, осиротите любого, кто использует вашу ветку Это плохо.
Теперь, скажем, вы сделали несколько коммитов в течение дня. Некоторые коммиты были хорошими. Некоторые ... не очень хорошие. Команда
git rebase
в сочетании с уничтожением ваших коммитов - это хороший способ очистить вашу локальную историю коммитов. Приятно объединить один коммит с публичными ветками, потому что он сохраняет историю коммитов общих веток вашей команды в чистоте. После перебазирования вы захотите снова протестировать, но если тесты пройдут, вы можете нажать один чистый коммит вместо нескольких грязных.Есть еще один интересный поток ядра Linux по чистой истории коммитов .
Опять от Линуса:
(акцент мой)
Вывод
В конце концов, у ОП есть разработчики, которые делают это:
Здесь есть две проблемы:
git stash
иgit pull
на мастере , когда они должны использовать полнометражную ветвь.Нет ничего плохого в использовании
git stash
- особенно перед извлечением - но использованиеgit stash
таким способом является антишаблоном, когда в Git есть лучшие рабочие процессы.Их использование
git stash
красной сельди. Это не проблема. Обязательство освоить это проблема.источник
Лично я использую только
stash
для коротких, неожиданных перерывов, например, когда кто-то задает вопрос, требующий перехода на другую ветку. Я делаю это, потому что я забыл о тайниках раньше, тогда они не будут применяться чисто. Регулярные коммиты в ветвях объектов гораздо сложнее забыть и легче объединить, поэтому теперь я склонен просто делать прерванный коммит, а затем делатьgit reset HEAD~1
или делать ребаз, если я не хочу сохранять его позже.Однако отличительной особенностью распределенного контроля версий является то, что люди могут использовать предпочтительный рабочий процесс в своих собственных репозиториях, если общие репозитории соответствуют стандартам. Я хотел бы убедиться, что люди не просто используют
stash
рабочий процесс, потому что у них нет достаточного обучения или осведомленности об альтернативах, но если они по-прежнему выбирают рабочий процесс, который вы считаете неоптимальным, я бы оставил это так.источник
Я думаю, что часть вашего вопроса, которая является анти-паттерном, - это использование одного общего мастера ветки . Однако, если вы добавите разрабатываемую ветвь в дополнение к основной ветке, а затем будете использовать стэши для работы со своими собственными переключателями контекста в разрабатываемой ветке, это не будет анти-паттерном, и это очень близко отражает часть рабочего процесса. описывают такие организации, как Etsy и Facebook.
Это сказанное, ответ @Greg Burghardt выше, слишком благоприятен для так называемого рабочего потока git-потока или функциональной ветви. Раньше я выступал за подобную стратегию, но, поняв, что она добавляет ненужную сложность и создает ложное чувство безопасности, я больше не делаю. Это также пережиток времен нецентрализованных систем контроля версий, таких как Subversion.
Во-первых, поскольку Git является децентрализованной системой управления версиями в отличие от subversion, локальный репозиторий разработчика по сути является гигантской ветвью кода. То, что отдельный разработчик делает локально, не влияет и не должно влиять на других членов команды, если только не сломанный или ошибочный код не будет передан в какие-либо общие ветви общего хранилища.
Команда rebase, однако, может повредить историю ветвления, когда в одном из воспроизведенных коммитов возникает конфликт слияния. От http://ryantablada.com/post/the-dangers-of-rebasing-a-branch
Кроме того, модель множественного ветвления предполагает, что никакие две ветви не могут содержать взаимозависимые изменения кода. Когда это неизбежно происходит, разработчик теперь вынужден манипулировать еще большим количеством веток, чтобы работать эффективно.
Фундаментальный анти-паттерн, который я вижу, связан не с ветками и тайниками, а скорее с типами проблем, о которых некоторые очень умные люди уже давно говорят: уверены ли вы в своем коде, используя модульные тесты и хорошая архитектура? Можете ли вы вносить постепенные изменения в свой код так, чтобы ваши разработчики могли легко рассуждать об изменениях и понимать, что изменится? Ваши разработчики хотя бы раз пробовали новый код, чтобы посмотреть, действительно ли он работает? (Да, я видел это раньше).
Если ответ на эти вопросы - «нет», то не имеет значения, сколько у вас веток - разработчики скажут, что код готов, работает и пригоден для производства, когда его на самом деле нет, и никакое количество ветвей не будет помочь вам, когда этот код идет в производство в любом случае.
источник
git stash
это инструмент. Это само по себе не является ни паттерном, ни анти-паттерном. Это инструмент, очень похожий на молоток. Использование молотка для вбивания гвоздей - это шаблон, а использование молотка для ввинчивания винтов - это не шаблон. Аналогичным образом, существуют рабочие процессы и среды, в которыхgit stash
используется правильный инструмент, а также рабочие процессы и среды, в которых он используется неправильно.Рабочий процесс «каждый принимает и продвигает к основному каналу» - это тот процесс, который работает вполне разумно, когда нет никаких рискованных изменений. Его часто используют в средах svn, где есть один авторитетный центральный сервер с кодом.
Git, однако, связывает покончить с одним центральным сервером. Имея все разработчики делают
commit
,pull
(или ,rebase
если вы в этом),push
все время может сделать большой беспорядок.Самые большие проблемы возникают с тем, что у вас что-то не работает, и вам нужно поработать над приоритетной ошибкой. Это означает, что вам нужно немного отложить эту работу, взять последнюю, работать над ней, не выполняя предыдущую работу, вызвать проблемы со сборкой, которую вы пытаетесь сделать.
Для этого
git stash
будет правильным инструментом для использования.Однако в основе этого рабочего процесса лежит большая проблема. Это то, что все роли ветвей контроля версий находятся в одной ветке. Mainline, разработка, обслуживание, накопление и упаковка - все на Master. Это проблема (См. Расширенные стратегии ветвления SCM для получения дополнительной информации об этом подходе к ветвям)
И да, вы кричали, что это не очень хороший рабочий процесс, и с ним есть проблемы. Однако проблема не в инструменте
git stash
. Проблема заключается в отсутствии четкого ветвления для ролей или несовместимых политик .git stash
тем не менее, это то, что я использовал, когда у меня была ситуация, когда я немного выстроился, попал в липкое состояние, в котором я не был уверен, правильно ли это было ... поэтому я спрятал свои изменения а затем исследовал другой подход к решению проблемы. Если это сработало - отлично, откажитесь от вещей в тайнике и продолжайте. Если другое исследование стало более липким, тогда вернитесь к предыдущему изменению и повторно примените тайник для работы над этим. Альтернативой может быть фиксация, извлечение, ветвление, а затем либо продолжить эту новую ветку, либо вернуться и сбросить ее. Вопрос в том, стоит ли это включать в историю, когда я просто хочу кое-что исследовать?git stash
не анти паттерн. Использованиеgit stash
в качестве альтернативы ветвлению, когда все подчиняются Мастеру, является анти-паттерном, но не из-заgit stash
.Если вы еще этого не сделали, просто подождите, пока у вас не возникнут проблемы со сборками , когда кто-то должен будет внести значительные архитектурные изменения во множество файлов (и конфликты слияния) или какой-то непроверенный код незавершенного выполнения, который просачивается в производство для этого. анти-шаблон, чтобы догнать вас.
источник