Ласкаво просимо до нашого остаточного посібника з команд 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.