Когда вы используете git rebase вместо git merge? - PullRequest
1395 голосов
/ 30 апреля 2009

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

Нужно ли объединяться после успешной перезагрузки?

Ответы [ 15 ]

15 голосов
/ 21 декабря 2012

Pro git book - действительно хорошее объяснение на странице перебазирования .

По сути, объединение будет принимать 2 коммита и объединять их.

Ребаз будет идти к общему предку 2 и постепенно применять изменения друг к другу. Это делает «чище» и более линейной истории.

Но когда вы делаете ребазинг, вы отказываетесь от предыдущих коммитов и создаете новые. Таким образом, вы никогда не должны отказываться от публичного репо. Другие люди, работающие в репо, будут ненавидеть вас.

Только по этой причине я почти исключительно сливаюсь. В 99% случаев мои ветви не сильно отличаются друг от друга, поэтому при возникновении конфликтов это происходит только в одном или двух местах.

4 голосов
/ 24 сентября 2013

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

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

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

И да, после слияния необходимо выполнить слияние, поскольку команда rebase просто помещает вашу работу поверх ветки, о которой вы упоминали во время rebase, скажем, master, и делает первый коммит вашей ветки прямым потомком master-ветви. Это означает, что теперь мы можем выполнить ускоренное слияние для переноса изменений из этой ветви в основную ветвь.

3 голосов
/ 23 февраля 2016

Некоторые практические примеры, в некоторой степени связанные с крупномасштабной разработкой, где gerrit используется для обзора и интеграции доставки.

Я сливаюсь, когда поднимаю свою ветвь функций на свежий удаленный мастер. Это дает минимальную работу по подъему и легко отслеживать историю развития функции, например, в gitk.

git fetch
git checkout origin/my_feature
git merge origin/master
git commit
git push origin HEAD:refs/for/my_feature

Я объединяюсь, когда готовлю коммит доставки.

git fetch
git checkout origin/master
git merge --squash origin/my_feature
git commit
git push origin HEAD:refs/for/master

Я перезагружаюсь, когда моя фиксация доставки не проходит интеграцию по какой-либо причине, и мне нужно обновить ее до нового удаленного мастера.

git fetch
git fetch <gerrit link>
git checkout FETCH_HEAD
git rebase origin/master
git push origin HEAD:refs/for/master
1 голос
/ 07 февраля 2019

Много раз объяснялось, что такое ребаз и что такое слияние, но когда и что использовать?

Когда использовать rebase?

  • когда вы не нажали на ветку / над ней больше никто не работает
  • Вы хотите полную историю
  • вы хотите избежать всех автоматически сгенерированных сообщений о "слиянии ..."

Как git rebase меняет историю. Поэтому вы не должны использовать его, когда кто-то еще работает над той же веткой / если вы нажали ее. Но если у вас есть локальная ветвь, вы можете выполнить мастер слияния ребаз перед слиянием своей ветки с главной, чтобы сохранить более чистую историю. Делая это, после слияния с основной ветвью не будет видно, что вы использовали ветку в основной ветке - история «чище», поскольку у вас нет автоматически сгенерированной «слитой ..», но все еще есть полная история в вашей главной ветке без автоматической генерации коммитов "merged ..". Тем не менее, убедитесь, что вы используете git merge feature-branch --ff-only, чтобы избежать конфликтов при создании одного коммита при слиянии вашей функции с основной. Это интересно, если вы используете ветви функций для каждой задачи, над которой работаете, так как вы получаете историю ветви функций, но не коммит "объединено .."

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

Когда использовать слияние?

  • когда вы нажали на ветку / другие тоже работают над этим
  • вам не нужна полная история
  • достаточно просто объединить

Когда вам не нужно или вы хотите иметь всю историю ветви функций в вашей основной ветке или если другие работают в той же ветке / вы нажали ее. Если вы все еще хотите иметь историю, просто объедините мастер с ветвью объектов, прежде чем объединять ветвь объектов с мастером. Это приведет к ускоренному слиянию, при котором у вас будет история ветви объектов в вашем мастере (включая коммит слияния, который был в вашей ветви функций, потому что вы слили мастер в него).

0 голосов
/ 20 января 2018

Когда я использую git rebase? Почти никогда, потому что переписывает историю. git merge почти всегда является предпочтительным выбором, потому что он учитывает то, что на самом деле произошло в вашем проекте.

...