С учетом этого, могут ли быть какие-то проблемы с наличием только одной главной ветки в разных средах, чтобы нам не приходилось иметь дело с объединением кода между разными ветвями? Я не видел много примеров моделей только с одним мастером, поэтому не уверен, что получится.
Вы мало что знаете об этом, потому что он отбрасывает одну из сильных сторон Git, дешевые ветки и простые слияния. Вы по-прежнему будете объединяться, потому что push
и pull
должны будут объединить ваш локальный мастер с удаленным мастером, но когда все будут толкать и тянуть к master
, когда им захочется, все работы смешаются вместе, и master
превратится в беспорядок.
Но ты на правильном пути. Вместо того, чтобы избегать ветвей, вы хотите избегать длительных ветвей. Нет develop
или qa
ветвей. Наличие master
в качестве единственной долго работающей ветки — хороший рабочий процесс.
Хитрость заключается в том, чтобы никогда не выполнять фиксацию напрямую в master. Вместо этого вы всегда хотите работать с короткоживущими "ветвями функций", которые объединяются в master
. Ветвь функций, судя по названию, предназначена для одной четко определенной функции (или ошибки). Вся работа и контроль качества для этой функции происходят в ветке функций. После завершения он объединяется в master
. master
можно запустить прямо в производство или пометить конкретные выпуски.
Это держит master
всегда в хорошей форме, чтобы от нее можно было избавиться и избавиться от нее. Он четко отделяет незавершенную работу от master
, избегая ошибочного помещения неработающего кода в master
. Это замедляет частоту изменений master
, упрощая координацию для всех. И это позволяет вам работать над многими функциями одновременно, четко разделяя их.
Хитрость в том, чтобы сохранить простоту и избежать сложных слияний, заключается в том, чтобы всегда поддерживать вашу ветку на последней версии master
, используя rebase
.
Основной рабочий процесс выглядит так...
- Обновите свой
master
: git checkout master; git pull --rebase
- Создайте и проверьте ветку функции для вашей функции:
git checkout -b issue/#123
- Редактируйте, работайте и фиксируйте свою функциональную ветку.
- Periodically keep up to date with
master
.
- Bring your
master
up to date.
- Перепишите свою работу поверх
master
: git checkout issue/#123; git rebase master
- When your work is finished, tested, gone through QA, etc...
- Bring your
master
up to date.
- Перепишите свою работу поверх
master
.
- Проверьте свою ветку в прошлый раз. Это будет точно такой же код, как и после слияния, потому что сливать нечего.
- Объедините его в
master
. Это слияние ничего не меняет, вы уже в курсе, но это важно для истории: git checkout master; git merge --no-ff issue/#123
- Удалите свою ветку функций:
git branch -d issue/#123
- Перейти к 1
Обратите внимание, что обновления выполняются с помощью rebase
. Это позволяет избежать кучи «бухгалтерских» слияний, запутывающих историю. Вместо этого с rebase
вы делаете вид, что ваша ветка была написана на последней master
все это время. Я рекомендую вам установить это в вашем .gitconfig
[pull]
rebase = preserve
Тогда git pull
всегда выполняется как перебазирование, но сохраняет ветки. Это абсолютно безопасно.
Окончательное реальное слияние выполняется с помощью --no-ff
(без быстрой перемотки вперед), чтобы гарантировать, что слияние выполнено, поэтому ветвь сохраняется в истории. Коммит слияния также является местом, где можно написать, о чем была ветка, и предоставить ссылку на проблему, которую она решила.
В результате получается история, которая выглядит так:
J - K - L [issue/#123]
/
A ---------- E ---------- I [master]
\ / \ /
B - C - D F - G - H
Это две завершенные функции B - C - D
и F - G - H
и одна открытая ветвь функции J - K - L
. Ветви все еще существуют для археологических целей, «пузыри функций», поэтому будущие разработчики знают, что B-C-D были выполнены как единое целое, и могут ссылаться на фиксацию слияния E для получения дополнительной информации. И, несмотря на всю разветвленность, история линейна; git log
сообщит о коммитах в правильном порядке.
Это требует больше работы, чем просто фиксация master
, но в результате получается чистая, простая история, высококачественный master
, на котором можно основывать свою работу, а разработчики избегают столкновений друг с другом. Контроль версий — это такой же инструмент, как ваш редактор или оболочка, и для его эффективного использования требуется немного усилий.
person
Schwern
schedule
06.07.2018