Пренаписване на история с Git Rebase

Руски (пуски) превод от Сергей Жук (можете да видите и оригиналната статия на английски)

Основният работен поток на Git изглежда така: правите задача в отделен клон, след което го обединявате в основния клон, когато приключите. Това прави git merge основен инструмент за обединяване на клонове. Това обаче не е единственият инструмент, който Git предлага.

история
Обединяване на клонове чрез сливане.

Алтернатива на горния сценарий може да бъде обединяването на клонове с помощта на git rebase. Вместо обединяване на клонове в специален фиксиране, смяна премества целия клон с изданието в края на главния клон, както е показано по-долу.

пренаписване
Обединяване на клонове с git rebase

Това служи на същата цел като git merge, свързване на ангажименти от различни клонове. Но има две причини, поради които можем да изберем да сменим вместо сливане:

  • Резултати от изместване в линейна история на проекта.
  • Това ни дава възможност да изчистим историята на местните ангажименти.

В тази статия ще разгледаме тези два често използвани случая за git rebase. За съжаление предимствата на git rebase ни водят до компромис. Ако се използва неправилно, това може да бъде една от най-опасните операции, които можете да извършите в хранилището на Git. По този начин трябва внимателно да прецените опасностите при преместване на клонове.

Необходимите условия

1. Shift, за да получите линейна история

Първият случай на употреба, който ще разгледаме, включва различна история на проекта. Помислете за хранилище, където master е продължил, докато работите по проблем в друг клон.

пренаписване

За да натиснете разклонението на характеристиките към главния клон, трябва да изпълните следните команди:

Това ще премести разклонението на характеристиките от текущата му позиция в края на главния клон. .

rebase

Има две възможни опции кога може да ви потрябва. Първо, вашата задача засяга нови ангажименти от капитана и сега те ще бъдат достъпни за нея. На второ място, ако задачата е затворена, тогава тя може бързо да бъде обединена в главния клон. И в двата случая смяна ще доведе до линейна история, докато git merge ще доведе до незадължителни коммити за сливане.

Например, помислете какво се случва, ако използвате сливане вместо shift.

Това ще създаде допълнителен ангажимент за сливане в разклонението на характеристиките. Освен това ще се случва всеки път, когато искате да включите ангажименти, по-високи от вашия клон. В крайна сметка историята на проекта ви ще бъде затрупана с безсмислени ангажименти за обединяване.

история
Обединяване на ангажименти по-горе.

Същото може да се види и при сливане в другата посока. Без да се използва смяна, обединяването на клон на характеристика в главния клон също изисква ангажиране за сливане. Въпреки че това изглежда като смислен ангажимент (представлява отделна, завършена задача), крайният резултат е история, пълна с вилици:

история
Обединяване на завършена задача с помощта на сливане

Ако направите смяна преди сливането, Git може да изтласка главния клон до края на функцията. Можете да видите линейната история на напредъка на проекта, като използвате командата git log - комитите от разклонението на характеристиките са спретнато групирани върху комитите от master. Това не е задължително случаят, когато клонове се обединяват с коммита на сливане.

история
Shift преди сливане

Разрешаване на конфликти

Когато стартирате git rebase, Git взема всеки ангажимент от клона и ги пребазира един по един на ново място. Ако някой от тези фиксира промени същите редове като ангажиментите нагоре по веригата, това ще доведе до конфликти.

rebase