Простое объяснение Git Rebase

1
2307
views

Перевод статьи «Git Rebase Explained Simply».

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

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

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

Использование команды git rebase перестанет быть чем-то сложным или пугающим, как только вы поймете, как она работает и чем полезна.

Итак, представьте, что у вас есть две ветки.

Первая выглядит так:

3def6294 One more change that I made
579db95b Another change I made
f261ebba Some change that I made
df796f7e Cache data on /mod (#5315) [deploy]
13363dd3 Rails 5.2 features: enable cache …
73188cd8 Sidekiq: add test helpers (#5326)
ba424854 Enable cache logging in development if requested (#5330)
51df3255 Change MentionJob to MentionWorker …

Вторая — так:

242c6eb5 Change from after_create to …
c64bfdb6 Handle missing commentable …
cb98b3b5 pages bust cache job sidekiq refactor (#5338) [deploy]
df042d6b Refactors ActiveJob …
783d43b7 Change create first reaction job to worker (#5327) [deploy]
c1638cfd Create UpdateAnalyticsWorker to replace UpdateAnalyticsJob (#5331)
040b36bc Fix event propagation for click on tag rules in editor (#5280) [deploy]
ba230eca Allow language-xxx class detection on pre tags in ReverseMarkdown (#5299)
13363dd3 Rails 5.2 features: enable cache …
73188cd8 Sidekiq: add test helpers (#5326)
ba424854 Enable cache logging in development if requested (#5330)
51df3255 Change MentionJob to MentionWorker …

Если присмотреться, можно заметить, что вплоть до 13363dd3 основа веток (base) одинакова, а дальше они расходятся.

Первая ветка, которую мы будем считать нашей рабочей веткой, содержит три коммита, которых нет во второй ветке.

Вторая ветка (в нашем примере — master) содержит восемь коммитов, не имеющихся в нашей рабочей ветке.

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

Допустим, вы занимаетесь разработкой какой-нибудь отдельной фичи и делаете это в отдельной ветке. Если эта ваша ветка просуществует хотя бы несколько дней, скорее всего за это время ветка master успеет измениться (т. е., еще до того, как вы вольете свою ветку обратно в master).

В таком случае очень пригодилась бы возможность сначала привести свою ветку в соответствие с master, а уж затем добавить свои изменения на верхушку git history.

Если мы «уравняем» нашу рабочую ветку с веткой master в ее теперешнем состоянии, а затем поместим три своих коммита сверху, мы получим следующую историю:

3def6294 One more change that I made
579db95b Another change I made
f261ebba Some change that I made
242c6eb5 Change from after_create to …
c64bfdb6 Handle missing commentable …
cb98b3b5 pages bust cache job sidekiq refactor (#5338) [deploy]
df042d6b Refactors ActiveJob …
783d43b7 Change create first reaction job to worker (#5327) [deploy]
c1638cfd Create UpdateAnalyticsWorker to replace UpdateAnalyticsJob (#5331)
040b36bc Fix event propagation for click on tag rules in editor (#5280) [deploy]
ba230eca Allow language-xxx class detection on pre tags in ReverseMarkdown (#5299)
13363dd3 Rails 5.2 features: enable cache …
73188cd8 Sidekiq: add test helpers (#5326)
ba424854 Enable cache logging in development if requested (#5330)
51df3255 Change MentionJob to MentionWorker …

Таким образом пул-реквест в master будет куда чище, кроме того, это поможет избежать конфликтов слияния.

К счастью, все это возможно благодаря перебазированию ветки!

Давайте обратим внимание на само название команды: Rebase. Что оно означает?

Применяя эту команду, мы заменяем основу (базу) нашей рабочей ветки на на ветку master. Т.е., мы «перебазируем» («re-base») рабочую ветку, меняем ее основу.

Использование git rebase

Использование git rebase

Давайте теперь познакомимся поближе с самой командой.

Используя команду rebase, я практически всегда пользуюсь флагом -i («интерактивно»), потому что таким образом легче переформулировать сообщения коммитов, склеить коммиты или изменить порядок их следования. Эти функции команды git rebase выходят за рамки моей статьи, так что я просто призываю вас попробовать использовать флаг -i.

Предположим, у нас есть working-branch (рабочая ветка), проверенная на нашей локальной машине. В таком случае rebase выглядит просто:

git rebase master

Вы увидите в консоли некий output:

First, rewinding head to replay your work on top of it…
Applying: Some change that I made
Applying: Another change I made
Applying: One more change that I made

Как мы видим, git заново «проигрывает» нашу работу, как своего рода музыкальную запись, сверху ветки master.

Если вывести лог истории git, вы увидите, что наши изменения записаны поверх ветки master.

3def6294 One more change that I made
579db95b Another change I made
f261ebba Some change that I made
242c6eb5 Change from after_create to …
c64bfdb6 Handle missing commentable …
cb98b3b5 pages bust cache job sidekiq refactor (#5338) [deploy]
df042d6b Refactors ActiveJob …
783d43b7 Change create first reaction job to worker (#5327) [deploy]
c1638cfd Create UpdateAnalyticsWorker to replace UpdateAnalyticsJob (#5331)
040b36bc Fix event propagation for click on tag rules in editor (#5280) [deploy]
ba230eca Allow language-xxx class detection on pre tags in ReverseMarkdown (#5299)
13363dd3 Rails 5.2 features: enable cache …
73188cd8 Sidekiq: add test helpers (#5326)
 …

То есть, мы «перебазировали» нашу ветку, заменив ее основу на ветку master.

Если использование rebase все еще пугает вас, попробуйте делать копию своей рабочей ветки, прежде чем запускать команду rebase — просто на всякий случай!

1 КОММЕНТАРИЙ

  1. Хорошо бы в статье еще рассказать про случаи, когда не рекомендуется использовать git rebase

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here