Это будет звучать нелогично, но выслушайте меня:
Поощряйте их, чтобы начать экспериментировать с git
Одной из интересных особенностей git является то, что удивительно легко сделать любую локальную операцию полностью безопасной. Когда я впервые начал использовать git, я обнаружил, что архивирую весь каталог в качестве резервной копии на случай, если я что-то напортачу. Позже я обнаружил, что это огромный клочок, который практически никогда не нужен для защиты вашей работы, но он имеет преимущество в том, что он очень безопасный и очень простой, даже если вы не знаете, что, черт возьми, делаете и как получится команда, которую вы хотите попробовать. Единственное, чего вы должны избегать, когда делаете это push
. Если вы ничего не толкаете, это 100% безопасный способ попробовать все, что вы хотите.
Боязнь пробовать что-то - одно из самых больших препятствий для изучения мерзавца. Это дает вам так много контроля над всем, что это немного утомительно. Реальность такова, что вы можете придерживаться нескольких очень безопасных операций для большей части вашего ежедневного использования, но выяснение, какие команды это те, требует некоторого изучения.
Предоставляя им чувство безопасности , они будут гораздо охотнее пытаться понять, как все делать самостоятельно. И у них будет гораздо больше возможностей найти личный рабочий процесс на своей локальной машине, который работает на них. И если не все делают то же самое на местном уровне , это нормально, если они придерживаются стандартов, которые они продвигают . Если для того, чтобы они чувствовали себя таким образом, нужно сжать весь репо, это нормально; они могут найти лучшие способы делать что-то по ходу дела и когда они что-то пробуют. Что-нибудь, чтобы заставить себя начать пробовать вещи и видеть, что они делают.
Это не значит, что обучение бесполезно. Напротив, обучение может помочь познакомить вас с особенностями и закономерностями. Но это не замена того, чтобы сидеть и делать что- то в своей повседневной работе. Ни git, ни SVN не являются вещами, которые вы можете просто пойти в класс, и тогда вы все знаете. Вы должны использовать их для решения своих проблем, чтобы ознакомиться с ними и какие функции хорошо подходят для каких проблем.
Хватит отговаривать их изучать все тонкости мерзости
Я упоминал, что ничего не толкаю, что на самом деле идет вразрез с одной из вещей, которой вы их учили: всегда «совершать и толкать». Я считаю, что вы должны перестать говорить им делать это и сказать им, чтобы начать делать обратное. Git имеет в основном 5 «мест», где ваши изменения могут быть:
- На диске незафиксировано
- Поставлено, но не совершено
- В локальном коммите
- В местном тайнике
- Удаленные репозитории (Только коммиты и теги когда-либо помещаются в разные репозитории)
Вместо того, чтобы поощрять их тянуть и толкать все за один шаг, поощряйте их использовать эти 5 разных мест. Поощряйте их:
Это побудит их проверить свою работу, прежде чем она станет общедоступной, что означает, что они поймают свои ошибки раньше. Они увидят коммит и подумают: «Подождите, это не то, что я хотел», и в отличие от SVN, они могут вернуться и попробовать еще раз, прежде чем нажать.
Как только они привыкнут к пониманию того, где находятся их изменения, они могут начать решать, когда пропустить шаги и объединить определенные операции (когда тянуть, потому что ты уже знаешь, что хочешь получить + объединить или когда щелкнуть по этой опции Commit & Push) ,
На самом деле это одно из огромных преимуществ git по сравнению с SVN, и git разработан с учетом этой модели использования. SVN, напротив, предполагает центральное хранилище, поэтому неудивительно, если инструменты для git не так оптимизированы для того же рабочего процесса. В SVN, если ваш коммит неверен, единственным реальным выходом является новый коммит, чтобы исправить ошибку.
Это, естественно, приведет к следующей стратегии:
Поощряйте их использовать местные филиалы
Локальные филиалы облегчают работу с общими файлами. Я могу сделать все изменения, которые я хочу, в моей собственной ветке, и это никогда никого не затронет, так как я их не настаиваю. Затем, когда придет время, я могу использовать все те же стратегии слияния и перебазирования, только проще:
- Я могу перебазировать свою локальную ветку, что делает слияние ее с основным тривиальным.
- Я мог бы использовать простое слияние (создать новый коммит) в master, чтобы внести в него изменения моей локальной ветки.
- Я могу объединить всю локальную ветку в один коммит на мастере, если я думаю, что моя ветвь слишком беспорядочная для спасения.
Использование локальных ветвей также является хорошим началом для определения систематической стратегии ветвления. Это помогает вашим пользователям лучше понять их собственные потребности в ветвлении, поэтому вы можете выбрать стратегию на основе потребностей и текущего уровня понимания / навыков команды, а не просто отказаться от Gitflow, потому что все об этом слышали.
Резюме
Короче говоря, git не является SVN и не может рассматриваться как это. Тебе следует:
- Устраните страх, поощряя безопасные эксперименты.
- Помогите им понять, как git отличается, чтобы они могли видеть, как это меняет их обычный рабочий процесс.
- Помогите им понять доступные функции, чтобы помочь им легче решать свои проблемы.
Все это поможет вам постепенно перейти к лучшему использованию git, пока вы не достигнете того уровня, когда сможете приступить к внедрению набора стандартов.
Особенности
В ближайшей перспективе следующие идеи могут помочь.
Rebase
Вы упомянули ребаз и что вы не совсем понимаете это в своем вопросе. Итак, вот мой совет: попробуйте то, что я только что описал. Внесите некоторые изменения локально, в то время как кто-то еще подтолкнет некоторые изменения. Передайте ваши изменения локально . Заархивируйте свой каталог репозитория в качестве резервной копии. Получить изменения другого человека. Теперь попробуйте запустить команду rebase и посмотрите, что происходит с вашими коммитами! Вы можете читать бесконечные посты в блоге или проходить тренинги о rebase и о том, как вы должны или не должны его использовать, но ничто из этого не является заменой для просмотра его в действии. Так что попробуйте .
merge.ff=only
Это будет вопрос личного вкуса, но я порекомендую его хотя бы временно, так как вы упомянули, что у вас уже есть проблемы с обработкой конфликтов. Я рекомендую установить merge.ff
наonly
:
git config --global merge.ff only
«ff» означает «ускоренная перемотка вперед». Ускоренное слияние - это когда git не нужно объединять изменения из разных коммитов. Он просто перемещает указатель ветви к новому коммиту по прямой линии на графике.
На практике это препятствует тому, чтобы git автоматически пытался создать коммиты слияния. Поэтому, если я фиксирую что-то локально, а затем извлекаю чьи-то изменения, вместо того, чтобы пытаться создать коммит слияния (и, возможно, вынудить пользователя иметь дело с конфликтами), слияние просто не удастся. По сути, git будет выполнять только a fetch
. Когда у вас нет локальных коммитов, слияние происходит нормально.
Это дает пользователям возможность просматривать различные коммиты, прежде чем пытаться объединить их, и вынуждает их принимать решение о том, как лучше всего их комбинировать. Я могу перебазировать, продолжить слияние (используя, git merge --no-ff
чтобы обойти конфигурацию), или я могу просто отложить объединение моих изменений сейчас и обработать его позже. Я думаю, что этот небольшой скачок скорости поможет вашей команде избежать принятия неправильных решений о слияниях. Вы можете позволить своей команде отключить его, как только они справятся со слияниями.