Пытаясь достичь git nirvana, я трачу день на изучение того, как использовать rebase для ситуаций, в которых я в настоящее время сливаюсь.
При прохождении того, что я считаю потоком git 101 (который я объясняю ниже), мне приходится это делать, push --force
когда я отправляю свои изменения обратно в источник.
Я не единственный - я знаю, что это закрытая территория (см. 1 , 2 , 3 , 4 , 5 ), и понимаю технические причины, по которым необходима сила. Моя проблема в том, что есть много (много) записей в блогах, восхваляющих rebase и то, как это изменило их жизнь (см. 1 , 2 , 3 , 4, чтобы перечислить несколько), но ни одна из них не упоминает, что push --force
является частью их поток. Однако почти каждый ответ на существующие вопросы о stackoverflow говорит что-то вроде «да, если вы собираетесь перебазировать, вы должны использовать push --force
».
Учитывая количество и религиозность сторонников перебазирования, я должен верить, что использование «push --force» не является неотъемлемой частью потока перебазирования, и что если кому-то часто приходится принудительно нажимать их, они делают что-то не так .
push --force
это плохо .
Итак, вот мой поток. Как я мог бы достичь тех же результатов без применения силы?
Простой пример
Две ветви:
- v1.0 - ветка релиза, содержит только патчи
- master - все для следующего крупного релиза.
У меня есть несколько коммитов патчей и несколько коммитов для следующего выпуска.
Я хотел бы включить патчи в свой мастер, чтобы они не потерялись для следующего выпуска. До просветления я бы просто:
git checkout master
git merge v1.0
Но теперь я пытаюсь
git checkout master
git rebase v1.0
Итак, теперь я здесь:
Время:
git push
Никаких кубиков.
источник
@CodeGnome прав. Вы не должны переустанавливать master на ветке v1.0, а на ветке v1.0 на master, это будет иметь большое значение.
Создайте новую ветку, которая указывает на v1.0, переместите эту новую ветку поверх master, а затем интегрируйте новую версию исправлений V1.0 в основную ветку. Вы получите что-то вроде:
Этот способ использования rebase рекомендован официальной документацией git .
Думаю, вы правы
git push --force
: вы должны использовать его только в том случае, если вы допустили ошибку и нажали то, чего не хотели.источник
master
и не возражает против объединения самой ветки функций, это можно сделать с помощью:git checkout my-branch; git rebase master; git checkout master; git merge my-branch
Вы должны принудительно нажимать, если вы перебазируете, и вы уже опубликовали свои изменения, верно?
Я использую перебазирование целой группы, но я либо публикую что-то частное, где принудительное нажатие не имеет значения (например, мой собственный клон на GitHub, как часть запроса на перенос), либо я перебазирую перед первым нажатием.
Это сердце рабочего процесса, в котором вы используете перебазирование, но не слишком сильно подталкиваете: не публикуйте вещи, пока они не будут готовы, не перебазируйте после того, как нажмете.
источник
rebase
недавно внесли изменения в свою ветку темы, но когда вы завершили изменения этой ветки, выmerge
вернетесь обратно в основную ветку разработки.Я думаю, что есть хороший вариант использования этого шаблона «перебазирование, затем принудительное нажатие», которое не является результатом ошибочного нажатия: работа над веткой функции самостоятельно из нескольких мест (компьютеров). Я делаю это часто, поскольку иногда работаю в офисе на своем компьютере, а иногда из дома / у клиента на своем ноутбуке. Мне нужно время от времени перебазировать, чтобы не отставать от основной ветки и / или сделать слияние более чистым, но мне также нужно принудительно нажимать, когда я оставляю одну машину, чтобы работать над другой (где я просто тяну). Работает как шарм, раз уж я один работаю на ветке.
источник
Вот что я использую (при условии, что имя вашей ветки - foobar ):
источник
git
неgit merge -s ours origin/<branch>
было то, что исправило это для насtl; dr объединить с общими ветками, переустановить с отдельными ветвями.
--force-with-lease
является более безопасной альтернативой силе и должен помочь вам достичь упомянутой мерзкой нирваны без разрушительного характера силы.Общее практическое правило, которое я видел в рабочих процессах различных команд, - это использовать
merge
для общих ветвей (то есть, мастер или разработка) и использоватьrebase
при работе над собственной веткой функций. Вот типичный жизненный цикл функциональной веткиПростая английская версия того, что мы здесь сделали:
force-with-lease
4-й шаг ДЕЙСТВИТЕЛЬНО важен и является одной из основных причин, по которой я начал отстаивать использование rebase.
force-with-lease
проверяет пульт, чтобы увидеть, были ли добавлены новые коммиты. Еслиgit push
доказано, что ваша разрушительная сила - это не толкнуть!Я надеюсь, что это дает кому-то больше уверенности в использовании rebase.
источник