Подтвердить что ты не робот

Как я могу использовать git rebase без принудительного нажатия?

В попытке достичь git нирваны, я провожу день, изучая, как использовать rebase для ситуаций, в которых я сейчас сливаюсь.

При прохождении через то, что я считаю потоком git 101 (который я описываю ниже), я должен push --force, когда мои изменения вернутся в начало координат.

Я не единственный, я знаю, что это покрыто землей (см. 1, 2, 3, 4, 5), и я понимаю технические причины, по которым необходима сила. Моя проблема в том, что есть много (многих) записей в блогах, поющих хвала хэмила и того, как они изменили свою жизнь (см. 1, 2, 3, 4, чтобы перечислить несколько), но ни один из них не упоминает, что push --force является частью их потока. Тем не менее, почти каждый ответ на существующие вопросы stackoverflow говорит о таких вещах, как "да, если вы собираетесь переустанавливать, я должен использовать push --force".

Учитывая количество и религиозность защитников бокса, , я должен полагать, что использование "push -force" не является неотъемлемой частью потока переадресации и что, если кто-то часто вынуждает их толкать, что-то не так..

push --force является плохая вещь.

Итак, вот мой поток. Каким образом я могу достичь тех же результатов без силы?

Простой пример

Две ветки:

  • v1.0 - ветвь релиза, содержит только патчи
  • мастер - все для следующего основного выпуска.

У меня есть несколько патч-коммитов и несколько коммитов для следующей версии.

premerge

Я хотел бы включить патчи в мой мастер, чтобы они не были потеряны для следующего выпуска. Просветление я бы просто:

git checkout master
git merge v1.0

Но теперь я пытаюсь

git checkout master
git rebase v1.0

Итак, теперь я здесь:

enter image description here

Время для:

git push

Нет кубиков.

4b9b3361

Ответ 1

Rebasing - отличный инструмент, но он лучше всего работает, когда вы используете его для создания быстрых слияний для ветвей темы на master. Например, вы можете перегрузить ветку add-new-widget против master:

git checkout add-new-widget
git rebase -i master

перед тем, как выполнить ускоренное слияние ветки в мастер. Например:

git checkout master
git merge --ff-only add-new-widget

Преимущество этого в том, что в вашей истории не будет много сложных коммитов или конфликтов слияния, потому что все ваши изменения будут сбрасываться на кончик мастера до слияния. Второе преимущество заключается в том, что вы пересоздали, но вам не нужно использовать git push --force, потому что вы не собираете историю на главной ветке.

Это, конечно, не единственный вариант использования для rebase или единственный рабочий процесс, но это одно из наиболее разумных применений для него, которое я видел. YMMV.

Ответ 2

@CodeGnome прав. Вы не должны переустанавливать master на ветку v1.0, но ветвь v1.0 на master, что будет иметь значение.

git checkout -b integrate_patches v1.0
git rebase master
git checkout master
git merge integrate_patches

Создайте новую ветвь, указывающую на v1.0, переместите новую ветку поверх мастера и затем интегрируйте новую версию патчей V1.0 в главную ветку. Вы получите что-то вроде:

o [master] [integrate_patches] Another patch on v1.0
o A patch on v1.0
o Another change for the next major release
o Working on the next major release
|  o [v1.0] Another path on v1.0
|  o A patch on v1.0
| /
o Time for the release

Этот способ использования rebase рекомендуется официальной документации git.

Я думаю, что вы правы в отношении git push --force: вы должны использовать его, только если вы допустили ошибку и нажали то, чего не хотели.

Ответ 3

Вам нужно принудительно нажимать, если вы rebase, и вы уже опубликовали свои изменения, верно?

Я использую rebase целую кучу, но я либо публикую что-то частное, где принудительное нажатие не имеет значения (например: мой собственный клон на GitHub, как часть запроса на перенос), либо я переустанавливаю, прежде чем я нажимаю на первый раз.

Это основа рабочего процесса, в котором вы используете rebase, но не нажимайте много: не публикуйте вещи, пока они не будут готовы, не переустанавливайте после того, как вы нажмете.

Ответ 4

Я думаю, что есть хороший прецедент для этого шаблона rebase-then-force-push, который не является результатом ошибочного нажатия: работайте над ветвью функций самостоятельно из нескольких локаций (компьютеров). Я часто это делаю, так как иногда я работаю в офисе на своем рабочем столе, а иногда и дома/клиентом на своем ноутбуке. Мне нужно периодически переустанавливать, чтобы идти в ногу с основной веткой и/или делать слияния чище, но мне также нужно принудительно нажать, когда я оставляю одну машину, чтобы работать на другой (где я просто тяну). Работает как шарм, пока я единственный, кто работает на ветке.

Ответ 5

Здесь то, что я использую (при условии, что ваше имя ветки является foobar):

git checkout master              # switch to master
git rebase   foobar              # rebase with branch
git merge -s ours origin/master  # do a basic merge -- but this should be empty
git push origin master           # aaand this should work