Крайното ръководство за Git Merge и Git Rebase

Добре дошли в нашата крайна насочи към git mergeи git rebaseкоманди. Този урок ще ви научи на всичко, което трябва да знаете за комбинирането на множество клонове с Git.

Git Merge

В git mergeкоманда ще се слеят всички промени, които бяха направени в кодовата база на отделен клон на текущото си клон като нов ангажират.

Синтаксисът на командата е както следва:

git merge BRANCH-NAME

Например, ако в момента работите в клон с име devи искате да обедините всички нови промени, направени в клон с име new-features, бихте издали следната команда:

git merge new-features

Забележка: Ако има някакви неангажирани промени в текущия ви клон, Git няма да ви позволи да обедините, докато всички промени в текущия ви клон не бъдат ангажирани. За да се справите с тези промени, можете:

Създайте нов клон и ангажирайте промените

git checkout -b new-branch-name git add . git commit -m ""

Скрийте ги

git stash # add them to the stash git merge new-features # do your merge git stash pop # get the changes back into your working tree

Изоставете всички промени

git reset --hard # removes all pending changes

Git Rebase

Пребазирането на клон в Git е начин за преместване на целия клон в друга точка в дървото. Най-простият пример е преместване на клон по-нагоре в дървото. Да кажем, че имаме клон, който се отклонява от главния клон в точка А:

 /o-----o---o--o-----o--------- branch --o-o--A--o---o---o---o----o--o-o-o--- master

Когато пребазирате, можете да го преместите по следния начин:

 /o-----o---o--o-----o------ branch --o-o--A--o---o---o---o----o--o-o-o master

За да пребазирате, уверете се, че имате всички ангажименти, които искате, в пребазирането във вашия главен клон. Проверете клона, който искате да пребазирате и въведете git rebase master(където master е клонът, на който искате да пребазирате).

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

 /---o-o branch /---o-o-o-o---o--o------ feature ----o--o-o-A----o---o--o-o-o--o--o- master

След git rebase master branchили git rebase masterкогато сте проверили клона, ще получите:

 /---o-o-o-o---o--o------ feature ----o--o-o-A----o---o--o-o-o--o--o- master \---o-o branch

Git rebase интерактивен в конзолата

За да използвате git rebaseв конзолата със списък на ангажименти, можете да изберете, редактирате или пуснете в базата данни:

  • Въведете, git rebase -i HEAD~5като последният номер е произволен брой ангажименти от най-новите назад, които искате да прегледате.
  • Във vim натиснете esc, след което iда започнете да редактирате теста.
  • От лявата страна можете да презапишете pickс една от командите по-долу. Ако искате да смачкате ангажимент в предишен и да отхвърлите съобщението за фиксиране, въведете fна мястото на pickфиксацията.
  • Запазете и излезте от вашия текстов редактор.
  • Когато пребазирането е спряно, направете необходимите корекции, след което използвайте, git rebase --continueдокато пребазирането е успешно.
  • Ако се пребазира успешно, трябва да принудите да натиснете промените си, за git push -fда добавите пребазираната версия към отдалеченото хранилище.
  • Ако има конфликт на сливане, има редица начини да се поправи това, включително следване на предложенията в това ръководство. Един от начините е да отворите файловете в текстов редактор и да изтриете частите от кода, които не искате. След това използвайте, git add последвано от git rebase --continue. Можете да пропуснете конфликтния коммит, като въведете git rebase --skip, спрете пребазирането, като изпълните git rebase --abortв конзолата си
pick 452b159  pick 7fd4192  pick c1af3e5  pick 5f5e8d3  pick 5186a9f  # Rebase 0617e63..5186a9f onto 0617e63 (30 commands) # # Commands: # p, pick = use commit # r, reword = use commit, but stop to edit the commit message. # e, edit = use commit, but stop to amend or add commit. # s, squash = use commit, meld into previous commit and stop to edit the commit message. # f, fixup = like "squash", but discard this commit's log message thus doesn't stop. # x, exec = run command (the rest of the line) using shell # d, drop = remove commit # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out

Обединяване на конфликти

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

CONFLICT (content): Merge conflict in resumé.txt Automatic merge failed; fix conflicts and then commit the result.

Ако погледнете resumé.txtфайла във вашия редактор на код, можете да видите къде е възникнал конфликтът:

<<<<<<>>>>>> updated_address

Git добави няколко допълнителни реда към файла:

  • <<<<<<< HEAD
  • =======
  • >>>>>>> updated_address

Мислете за   =======разделителната линия на конфликта. Всичко между <<<<<<< HEADи =======е съдържанието на текущия клон, към който сочи HEAD ref. От друга страна, всичко между   =======и >>>>>>> updated_addressе съдържанието в клона, който се обединява updated_address,.

Git Merge срещу Git Rebase

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

Винаги, когато git mergeсе изпълнява, се създава допълнителен коммитинг за сливане. Винаги, когато работите в локалното хранилище, наличието на твърде много коммити може да направи историята на фиксирането да изглежда объркваща. Един от начините да се избегне коммирането на сливане е да се използва git rebaseвместо това.

git rebase is a very powerful feature. That being said, it is risky as well if it is not used in the right way. git rebase alters the commit history, so use it with care. If rebasing is done in the remote repository, then it can create a lot of issues when other developers try to pull the latest code changes from the remote repository. Remember to only run git rebase in a local repository.

That's all you need to know to merge and rebase with the best of 'em.