Наша команда по документации из десяти человек недавно переехала из SVN в Git. В SVN все работали над мастером - моделью, которую я всегда ненавидел, но я не смог добиться этого изменения. В рамках перехода к Git мы согласились исправить это, но пока не можем этого сделать (ожидаем изменений в сборке, которые позволят строить из произвольных веток). Тем временем все работают над мастером. Да, я знаю, что это ужасно, поверь мне.
Сейчас мы видим гораздо больше ошибок, чем когда мы использовали SVN, некоторые из которых вызваны двухступенчатой моделью Git (локальной и удаленной). Иногда люди совершают, но не в состоянии подтолкнуть, или они тянут и получают конфликты с их ожидающими локальными изменениями. Вчера кто-то засорял недавние изменения - как-то - ошибочным слиянием, которое, я думаю, было слиянием, которое Git делает, когда вы тянете и получаете выдающиеся изменения. (Он не смог сказать мне точно, что он сделал, и, поскольку он использует графический интерфейс, я не могу просто проверить его историю оболочки.)
Как самый опытный пользователь Git (читай: я использовал его раньше, хотя и не для чего-то сверхсложного), я человек, устанавливающий политику, обучающий инструментам и устраняющий проблемы. Какие изменения я могу внести в то, как мы используем инструменты, чтобы сделать общий активный активный узел менее подверженным ошибкам, пока мы не сможем перейти к разработке на ветвях?
Команда использует Tortoise Git на Windows. Мы используем Tortoise Git, потому что раньше использовали Tortoise SVN. ( Я лично использую командную строку в Cygwin для некоторых операций, но команда ясно дала понять, что им нужен графический интерфейс, и мы собираемся использовать этот.) Ответы должны работать с этим инструментом, а не предлагать замены.
У Tortoise Git «Commit & Push» доступен как одна операция, и я сказал им всегда делать это. Однако это не атомарно - может случиться так, что коммит (который в конце концов является локальным) работает просто отлично, но push не работает (скажем, из-за конфликта или сетевой проблемы). Когда это происходит, они получают неоднозначную ошибку; Я сказал им, чтобы они проверяли журнал коммитов BitBucket, если у них есть какие-либо сомнения относительно недавнего коммита, и, если они этого не видят, нажимать. (И разрешить конфликт, если в этом проблема, или попросить помощи, если они не знают, что делать.)
У команды уже есть хорошая привычка «тянуть рано и часто». Тем не менее, кажется, что тяга может вызвать конфликты, что я считаю новым? Если не новый, то гораздо чаще, чем в SVN. Я слышал, что могу изменить то, как Git тянет (перебазировать вместо слияния), но у меня нет хорошего понимания компромиссов (или как это сделать в нашей среде).
Сервер BitBucket (не Github). У меня есть полный административный контроль над нашим хранилищем, но на сервере нет ни одного более общего. Ничто из этого не изменчиво.
Исходные файлы являются XML. Есть также графические файлы, которые все знают, что вы не можете объединить, но мы также почти никогда не сталкиваемся там. Конфликты слияния происходят от файлов XML, а не от графики.
Какие изменения я могу внести в наше использование Git, чтобы сделать мастер совместного использования более удобным для команды, пока мы не сможем перейти к использованию ветвей функций с проверенными проверенными проверочными запросами?
Ответы:
До сих пор SourceTree был лучшей IDE для изучения концепций, потому что он показывает все соответствующие диалоги и параметры, которые есть у вас на каждом этапе, параметры по умолчанию, как правило, хороши, не возиться с ребазой и т. Д. Просто следуйте обычному потоку:
Если все следуют этому рецепту, они должны быть в порядке.
Каждый раз, когда кто-то вносит более масштабное или центральное изменение, информируйте других пользователей о локальном фиксировании и извлечении из мастера, чтобы впоследствии у них не возникало слишком много конфликтов, и первый человек все еще рядом, чтобы разрешить конфликты вместе с ними.
Потратьте много времени на то, чтобы все поняли процесс, в противном случае они могут обойтись некоторое время, а затем почувствовать себя комфортно, фактически крутя основную ветку, например, «использовать мой файл вместо удаленного», чтобы разрешить конфликт, просто пинает все изменения, сделанные другими людьми.
Git - это сложная для изучения система, особенно если вы выросли на Svn, наберитесь терпения и дайте им время, чтобы выучить ее должным образом. С новыми пользователями вы можете иногда тратить день на то, чтобы навести порядок, что нормально. ;)
источник
Есть три основные вещи, которые нужно помнить, когда вы работаете из одной ветки с кем-то еще:
--force
если вы действительно не знаете, что делаете.commit
илиstash
ваша работа в процессе перед каждымpull
.pull
прямо передpush
.Кроме того, я укажу, что при распределенном контроле версий не имеет значения, использует ли ваше «официальное» репо ветки или нет. Это не имеет никакого отношения к тому, что отдельные пользователи делают в своих локальных репозиториях. Я использовал git для получения локальных филиалов, когда моя компания использовала совершенно другую центральную VCS. Если они создают локальные ветки для своих функций и делают ошибки слияния со своими локальными
master
, это намного легче исправить, не вдаваясь в reflog или какую-то другую магию.источник
pull
прежде чемpush
это большой совет, но я бы один шаг дальше и предположить , что вы считаете , можете ли Вы ,pull --rebase
когда вы делаете.--force
если вы действительно не знаете, что делаете». Я бы пошел дальше. Запретить переписывание истории в «основном» хранилище от всех, кроме самых доверенных лиц. Сможете ли вы сделать это хотя бы частично, зависит от вашего хостинга, но у BitBucket есть такая возможность.Разве можно потратить день на изучение гита?
Профессионалы, использующие компьютер, действительно должны учиться новому инструменту, и, хотя возможно допустить много ошибок в любой VCS, они должны использовать инструмент так, как он предназначен для использования.
Лучший способ представить это - заставить каждого работать над собственной веткой, когда они вносят изменения (как можно короче), и выполнять ребазинг, а затем объединяться с мастером, когда они это сделают. Это не слишком далеко от нынешнего способа работы и представляет простой рабочий процесс, к которому они могут привыкнуть, пока не почувствуют себя достаточно уверенно для выполнения более сложных операций.
Я не использую окна, но если Tortoise в основном скрывает git от них и делает вид, что это SVN, то, возможно, Tortoise - не тот инструмент.
источник
Иногда то, что вы делаете, должно измениться.
Самая большая проблема в том , что все это работает на хозяина. Это не типично для разработки кода и может быть неправильной моделью в вашем случае. Если вы можете изменить это, попросив / потребовав внести изменения в отдельных ветвях, вы будете в гораздо лучшей форме. С помощью веток вы можете получить следующее:
master
были разрешены напрямую .Если вы не можете использовать ветвление, вы можете написать
merge-and-push
скрипт, который бы автоматизировал некоторые болевые точки. Может быть, он проверит, что пользователь не отстает от мастера, сделает выборку и извлечение, а затем попытается объединить ( возможно, с--no-commit --no-ff
) и так далее.источник
master
,Подчеркните, что вы можете повторить слияния
Это может быть очевидно для вас, но бывшие пользователи SVN могут не знать, что они могут попытаться выполнить объединение несколько раз. Это может сократить количество флагов помощи, которые вы получаете.
В SVN при отработке у
trunk
вас будут изменения, не совершенные сидя. Тогда вы бы сделалиsvn update
. В этот момент ваши изменения будут смешиваться с изменениями других людей навсегда. Не было никакого способа отменить это (afaik), поэтому у вас не было выбора, кроме как просто проверить все вручную и надеяться, что репо было в хорошем состоянии. Когда на самом деле вам будет гораздо удобнее просто переделать слияние.У людей был бы такой же менталитет, даже когда мы перешли на Git. Приводит к множеству непреднамеренных ошибок.
К счастью, с git есть обратный путь, особенно потому, что вы можете делать локальные коммиты. (Позже я опишу, как это выражается в командной строке)
Хотя, как это сделать, будет зависеть от инструментов. Я считаю, что повторное нажатие не во многих графических интерфейсах отображается как отдельная кнопка, но, вероятно, возможно. Мне нравится, что вы используете Cygwin. Мои коллеги используют sourcetree. Поскольку вы используете BitBucket, имеет смысл использовать его в качестве графического интерфейса, поскольку он управляется одной и той же компанией: Atlassian. Я подозреваю, что есть более тесная интеграция.
Относительно тянет
Я думаю, что вы правы, что слияние в
pull
том, что портит людей. Наpull
самом деле, Agit fetch
извлекает изменения с сервера, а затемgit merge origin/<branchname>
*, который объединяет удаленные изменения с вашей локальной веткой. ( https://git-scm.com/docs/git-pull )В результате все стандартные команды слияния работают с pull. Если у этого слияния есть конфликты, вы можете прервать его
git merge --abort
. Который должен вернуть вас до вашего слияния. Затем вы можете попробовать еще раз сgit pull
илиgit merge origin/<branchname>
.Если вы можете каким-то образом научиться делать вышеперечисленное, используя графический инструмент вашего коллеги, я думаю, что это решит большинство ваших проблем. Извините, я не могу быть более конкретным.
* Я понимаю, что происхождение здесь не всегда так.
Используйте
git reflog
для диагностики проблемМне, как и вам, приходится диагностировать проблемы, возникающие в основном из-за неправильного использования инструментов графического интерфейса. Я считаю, что
git reflog
иногда это может быть полезно, поскольку это довольно последовательный след действий в хранилище. Хотя иногда это трудно читать.Альтернатива
Поскольку ваша ситуация временная , вы можете просто вернуться в SVN, пока не начнете процесс развертывания. Я не решался бы сделать это, так как многие места говорили бы: «Мы попробовали git один раз, но это просто не сработало ...» и никогда бы не подняли его обратно.
Некоторые другие общие проблемы переходного периода
git log --decorate
самый простой способ рассмотреть различия. Но если на хозяине (например) дела становятся слишком волосатыми, вы можетеgit reset --hard origin/master
источник
git log --oneline --decorate --graph
идеальным. Настолько, что я определил псевдоним оболочки для этой точной комбинации.Один из возможных механизмов, который был принят многими командами с открытым исходным кодом, - это использование модели разветвления - https://www.atlassian.com/git/tutorials/comparing-workflows (не забудьте четко сформулировать, обсуждая рабочий процесс разветвления git ) .
В этом каждый разработчик или суб-команда имеет свою собственную вилку из хранилища, они проверяют из BitBucket обеспечивает механизм для этого , установив «вверх» происхождения в дополнение к удаленным по умолчанию - они должны помнить , чтобы «принести вверх по течению "и" объединить удаленный / upstream / master "на регулярной основе.
Это, возможно, решит ваши проблемы с механизмом сборки, так как инструменты сборки, возможно, будут направлены к мастеру в другом проекте, то есть в форке.
После этого вы могли бы отстранить большинство людей от возможности непосредственно перейти к основному проекту и создать небольшую группу людей с проверкой и утверждением ролей. См. Https://www.atlassian.com/git/tutorials/making-a-pull-request.
Место, где можно прочитать о том, чтобы убедиться, что почти все желаемые проверки выполняются перед нажатием, находится в разделе git book о хуках - https://git-scm.com/book/gr/v2/Customizing-Git-Git-Hooks - вы можете использовать ловушки pre-commit и pre-push, чтобы выполнять такие вещи, как запуск некоторых тестов на предложенном коммите, чтобы убедиться, что работа корректна и т. д. - единственная проблема с ловушками на стороне клиента состоит в том, что разработчики могут отключить их или не включить их.
В TortoiseGit доступны как извлечение / слияние, так и перехватчики.
источник
Это будет звучать нелогично, но выслушайте меня:
Поощряйте их, чтобы начать экспериментировать с git
Одной из интересных особенностей git является то, что удивительно легко сделать любую локальную операцию полностью безопасной. Когда я впервые начал использовать git, я обнаружил, что архивирую весь каталог в качестве резервной копии на случай, если я что-то напортачу. Позже я обнаружил, что это огромный клочок, который практически никогда не нужен для защиты вашей работы, но он имеет преимущество в том, что он очень безопасный и очень простой, даже если вы не знаете, что, черт возьми, делаете и как получится команда, которую вы хотите попробовать. Единственное, чего вы должны избегать, когда делаете это
push
. Если вы ничего не толкаете, это 100% безопасный способ попробовать все, что вы хотите.Боязнь пробовать что-то - одно из самых больших препятствий для изучения мерзавца. Это дает вам так много контроля над всем, что это немного утомительно. Реальность такова, что вы можете придерживаться нескольких очень безопасных операций для большей части вашего ежедневного использования, но выяснение, какие команды это те, требует некоторого изучения.
Предоставляя им чувство безопасности , они будут гораздо охотнее пытаться понять, как все делать самостоятельно. И у них будет гораздо больше возможностей найти личный рабочий процесс на своей локальной машине, который работает на них. И если не все делают то же самое на местном уровне , это нормально, если они придерживаются стандартов, которые они продвигают . Если для того, чтобы они чувствовали себя таким образом, нужно сжать весь репо, это нормально; они могут найти лучшие способы делать что-то по ходу дела и когда они что-то пробуют. Что-нибудь, чтобы заставить себя начать пробовать вещи и видеть, что они делают.
Это не значит, что обучение бесполезно. Напротив, обучение может помочь познакомить вас с особенностями и закономерностями. Но это не замена того, чтобы сидеть и делать что- то в своей повседневной работе. Ни git, ни SVN не являются вещами, которые вы можете просто пойти в класс, и тогда вы все знаете. Вы должны использовать их для решения своих проблем, чтобы ознакомиться с ними и какие функции хорошо подходят для каких проблем.
Хватит отговаривать их изучать все тонкости мерзости
Я упоминал, что ничего не толкаю, что на самом деле идет вразрез с одной из вещей, которой вы их учили: всегда «совершать и толкать». Я считаю, что вы должны перестать говорить им делать это и сказать им, чтобы начать делать обратное. Git имеет в основном 5 «мест», где ваши изменения могут быть:
Вместо того, чтобы поощрять их тянуть и толкать все за один шаг, поощряйте их использовать эти 5 разных мест. Поощряйте их:
Примите решение, как обрабатывать извлеченные изменения. Варианты:
Спрятать их изменения, объединить, а затем распаковать и разрешить любые конфликты.
Есть и другие вещи, но я не буду вдаваться в подробности. Обратите внимание, что тяга - это буквально просто выборка и слияние. Это не похоже на них; это является их. (Передача
--rebase
изменений вытащить из fetch + merge для fetch + rebase.)Это побудит их проверить свою работу, прежде чем она станет общедоступной, что означает, что они поймают свои ошибки раньше. Они увидят коммит и подумают: «Подождите, это не то, что я хотел», и в отличие от SVN, они могут вернуться и попробовать еще раз, прежде чем нажать.
Как только они привыкнут к пониманию того, где находятся их изменения, они могут начать решать, когда пропустить шаги и объединить определенные операции (когда тянуть, потому что ты уже знаешь, что хочешь получить + объединить или когда щелкнуть по этой опции Commit & Push) ,
На самом деле это одно из огромных преимуществ git по сравнению с SVN, и git разработан с учетом этой модели использования. SVN, напротив, предполагает центральное хранилище, поэтому неудивительно, если инструменты для git не так оптимизированы для того же рабочего процесса. В SVN, если ваш коммит неверен, единственным реальным выходом является новый коммит, чтобы исправить ошибку.
Это, естественно, приведет к следующей стратегии:
Поощряйте их использовать местные филиалы
Локальные филиалы облегчают работу с общими файлами. Я могу сделать все изменения, которые я хочу, в моей собственной ветке, и это никогда никого не затронет, так как я их не настаиваю. Затем, когда придет время, я могу использовать все те же стратегии слияния и перебазирования, только проще:
Использование локальных ветвей также является хорошим началом для определения систематической стратегии ветвления. Это помогает вашим пользователям лучше понять их собственные потребности в ветвлении, поэтому вы можете выбрать стратегию на основе потребностей и текущего уровня понимания / навыков команды, а не просто отказаться от Gitflow, потому что все об этом слышали.
Резюме
Короче говоря, git не является SVN и не может рассматриваться как это. Тебе следует:
Все это поможет вам постепенно перейти к лучшему использованию git, пока вы не достигнете того уровня, когда сможете приступить к внедрению набора стандартов.
Особенности
В ближайшей перспективе следующие идеи могут помочь.
Rebase
Вы упомянули ребаз и что вы не совсем понимаете это в своем вопросе. Итак, вот мой совет: попробуйте то, что я только что описал. Внесите некоторые изменения локально, в то время как кто-то еще подтолкнет некоторые изменения. Передайте ваши изменения локально . Заархивируйте свой каталог репозитория в качестве резервной копии. Получить изменения другого человека. Теперь попробуйте запустить команду rebase и посмотрите, что происходит с вашими коммитами! Вы можете читать бесконечные посты в блоге или проходить тренинги о rebase и о том, как вы должны или не должны его использовать, но ничто из этого не является заменой для просмотра его в действии. Так что попробуйте .
merge.ff=only
Это будет вопрос личного вкуса, но я порекомендую его хотя бы временно, так как вы упомянули, что у вас уже есть проблемы с обработкой конфликтов. Я рекомендую установить
merge.ff
наonly
:«ff» означает «ускоренная перемотка вперед». Ускоренное слияние - это когда git не нужно объединять изменения из разных коммитов. Он просто перемещает указатель ветви к новому коммиту по прямой линии на графике.
На практике это препятствует тому, чтобы git автоматически пытался создать коммиты слияния. Поэтому, если я фиксирую что-то локально, а затем извлекаю чьи-то изменения, вместо того, чтобы пытаться создать коммит слияния (и, возможно, вынудить пользователя иметь дело с конфликтами), слияние просто не удастся. По сути, git будет выполнять только a
fetch
. Когда у вас нет локальных коммитов, слияние происходит нормально.Это дает пользователям возможность просматривать различные коммиты, прежде чем пытаться объединить их, и вынуждает их принимать решение о том, как лучше всего их комбинировать. Я могу перебазировать, продолжить слияние (используя,
git merge --no-ff
чтобы обойти конфигурацию), или я могу просто отложить объединение моих изменений сейчас и обработать его позже. Я думаю, что этот небольшой скачок скорости поможет вашей команде избежать принятия неправильных решений о слияниях. Вы можете позволить своей команде отключить его, как только они справятся со слияниями.источник
Я прошел точно такой же опыт SVN -> git в моей компании, и из моего опыта единственное средство - это время. Пусть люди привыкнут к инструментам, пусть они делают ошибки, покажите им, как их исправить. Ваша скорость на некоторое время пострадает, и люди потеряют работу, и все будут немного раздражительными, но такова природа изменения чего-то столь же фундаментального, как ваша VCS.
Тем не менее, я согласен со всеми, кто считает, что TortoiseGit является помехой, а не помощью, так рано в переходный период. TortoiseGit ... не лучший графический интерфейс в лучшие времена, и, скрывая, как git на самом деле работает во имя простоты, он также не дает вашим коллегам понять основные концепции git, такие как двухфазный коммит.
Мы приняли (довольно радикальное) решение заставить разработчиков использовать командную строку (git bash или posh-git ) в течение недели, и это дало чудеса для понимания того, как на самом деле работает git и чем он отличается от SVN. Это может звучать радикально, но я бы посоветовал вам попробовать это просто потому, что это создает понимание модели git - и, как только они это уладят, ваши коллеги могут начать использовать любые фасады GUI поверх git, которые им нравятся.
Последнее замечание: некоторые из ваших коллег будут почти сразу же замечать, как работает git, а некоторые - никогда. Последняя группа, вам просто нужно научить мистическим заклинаниям заставить их код перемещаться с локального компьютера на сервер, чтобы каждый мог его увидеть.
источник
Ну, недавно я адаптировал следующий рабочий процесс, чтобы никогда не проверять основную ветку:
1) Каждый использует свою собственную ветку, которая изначально является копией основной ветки.
Давайте назовем основную ветку «master», а мою собственную ветку «my_master».
Я только что сделал свою ветку от мастера, так что это точно так же. Я начинаю работать над новой функцией в своей собственной ветке, и когда это делается, я делаю следующее.
В данный момент на моей ветке, только что закончил кодирование
Вернуться в главную ветку
Потяните, если это не актуально
Вернуться в мою ветку
Слить последний мастер в мою ветку
Исправить конфликты и слияния
Протестируй все снова
Когда все объединено и исправлено в моей собственной ветке, нажмите его
Вернуться в главную ветку
Слить с моей веткой
Невозможно иметь конфликты, поскольку они разрешаются в вашей собственной ветке с предыдущим слиянием.
Пуш мастер
Если все последуют этому, основная ветвь будет чистой.
источник
Таким образом, у нас есть команда, которая перешла с TFS на git и сохранила старое мышление. Общие правила работы более или менее одинаковы.
Да, это означает, что все работают над мастером. Это не так уж плохо; и команда, привыкшая к TFS или SVN, сочтет это наиболее естественным.
Общие процедуры, чтобы сделать это максимально безболезненным:
git stash && git pull --rebase && git stash pop
каждое утродля толкания сделайте следующий цикл:
git add git commit git pull --rebase fix any merges compile git push loop until you don't get the can't fast forward error message.
источник
git
: вы, как правило, учитесь объединяться и объединяться с первого дня. Это неотъемлемая часть использованияgit
. Избегайте этого, и вы злоупотребляете инструментом точно так же, как злоупотребляете автомобилем при скорости не более 15 км / ч.Если все работают над мастером, вы ничего не можете сделать. Вещи неизбежно испортятся.
Вы должны использовать мастер для готовых продуктов, которые отправляются клиенту. Вы должны использовать разработку для постоянного развития, и вы не должны позволять никому подталкивать к разработке. Стандарт заключается в том, что каждый разветвляется из dev, вносит свои изменения, переносит их из локальной в свою ветвь на сервере и выдает push-запрос. Затем кто-то просматривает изменения и объединяет их с разработкой.
Чтобы избежать конфликтов, каждый объединяет разработку в свою собственную ветвь, прежде чем нажимать, и разрешает конфликты на этом этапе (так что это влияет только на одного разработчика локально). Если слияние с разработкой вызовет конфликты, то оно не будет объединено - разработчик снова объединит разработку с их веткой и снова отправит на сервер, а затем он снова будет проверен.
Вы можете использовать sourcetree, например, чтобы сделать эту работу без какой-либо боли.
источник