Остаточний посібник з 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 interactive у консолі

Щоб використовувати 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. З іншого боку, все між   =======і >>>>>>> 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.