Як закінчити злиття після вирішення конфліктів злиття?


282

Я прочитав розділ « Основне розгалуження та об’єднання» Книги Git Community.

Тому я дотримуюся його і створити одну гілку: experimental.

Потім я:

  1. перейти на експериментальну галузь (git checkout експериментальна)
  2. внести купу змін
  3. вчинити це (git commit -a)
  4. перейти на головну галузь (git checkout master)
  5. внесіть деякі зміни та покладіть на них зобов'язання
  6. повернутися до експериментального (git checkout експериментальний)
  7. зміни майстра злиття на експериментальний (git merge master)
  8. є деякі конфлікти, але після їх вирішення я зробив 'git add myfile'

  9. І тепер я застряг, я не можу повернутися до майстра

коли я роблю

 $ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

і я зробив:

$ git rebase --abort

Не працює нова база?

і я зробив:

$  git add res/layout/socialhub_list_item.xml
$ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

Що я можу зробити, щоб я міг повернутися до своєї гілки?


Після того, як я виправлю конфлікт, виконайте додавання, а потім спробую виконати фіксацію git commit gf2n.cpp -m "Hand merge gf2n.cpp due to conflicts", це призведе до fatal: cannot do a partial commit during a merge.. І звичайно, "Часткові домовленості" не можуть бути задокументовані або обговорені ніде на сторінках git man. Виконання git mergeпісля виправлення призводить до Please, commit your changes before you can merge.того, що зламаний інструмент для дупи ...
jww

2
git commit з явними шляхами задокументовано на сторінці в ОПИСІ "як" 3. перерахувавши файли як аргументи команди командування, і в цьому випадку фільтр буде ігнорувати зміни, зафіксовані в індексі, і замість цього записувати поточний вміст перелічених файлів (які вже повинні бути відомі Git); "а також під" - - Я просто впевнений, що повідомлення про злиття написав хтось, хто припускав, що ви прочитали, як працює команда фіксації, і міг би розпізнати значення слова "часткове" в цьому описі, якщо не тоді, принаймні знову і ретельніше. @jww
jthill

1
Отже, чому це тематичне дослідження заслуговує уважного читання для розуміння, тоді як впаковки цього не роблять? @jww
jthill

1
Що ж, використання git очевидно вимагає кращого розуміння читання, ніж ви готові придбати. Я, мабуть, навіть більше не впевнений, що це вина в git, ніж ви впевнені.
jthill

1
З Git 2.12 (I квартал 2017 року) ви скоро просто зробите це git merge --continue. Дивіться мою відповідь нижче
VonC

Відповіді:


267

Коли під час злиття виникає конфлікт, вам доведеться закінчити комісію злиття вручну. Здається, ви зробили перші два кроки, щоб відредагувати файли, що конфліктували, а потім запустіть git addїх, щоб позначити їх як вирішені. Нарешті, вам потрібно фактично здійснити злиття git commit. У цей момент ви зможете знову перемикати гілки.


Якщо ви використовуєте "git gui &" для здійснення фіксації - ви, можливо, не усвідомлюєте, що стан вашої гілки більше не "зливається". Слідкуйте за статусом "git status", щоб переконатися у правильності статусу вашої філії.
Тоні Ешворт

4
Спробуйте git commit -am "your commit message"виконати додавання та фіксування одночасно.
vaheeds

3
git commitсправді працює. І найкраще використовувати його, щоб отримати заповнене для вас повідомлення про фіксацію злиття за замовчуванням. Я уникаю "git commit -am", оскільки це
скасує

1
Спробуйте git push.
альпер

Я опинив цю ситуацію за нижчим сценарієм -> Я об'єднав X відділення з гілкою Y. Тоді я зрозумів, що я зробив щось не так у гілці Y, тому я виправив це, а потім "змінив" свої зміни у гілці Y. Через поправку git не створили нових комісій. Отже, коли я об'єднав X-гілку з оновленою гілкою Y, це дало конфлікт. До речі, дякую за цю відповідь.
Дог

157

Як закінчити злиття після вирішення конфліктів злиття?

З Git 2.12 (1 квартал 2017 року) ви матимете більш природну команду:

git merge --continue

Див. Комісію c7d227d (15 грудня 2016 р.) Від Джеффа Кінга ( peff) .
Див. Команду 042e290 , виконувати c261a87 , здійснити 367ff69 (14 грудня 2016 р.) Від Chris Packham ( cpackham) .
(Об’єднав Хуніо С Хамано - gitster- у комітеті 05f6e1b , 27 грудня 2016 р.)

Див. 2.12 примітки до випуску .

merge: Додати --continueваріант " " як синонім для " git commit"

Навчіть ' git merge' --continueваріант, який дозволяє 'продовжувати' злиття шляхом його завершення.
Традиційним способом завершення злиття після вирішення конфліктів є використання ' git commit'.
Тепер з такими командами, як " git rebase" і " git cherry-pick", що мають " --continue", додаючи таку опцію до " git merge", представлено послідовний інтерфейс користувача.


Я готувався розмістити коментар про те, як це нещодавно було додано в 2.12 в 1 кварталі 2017 року, але потім я перечитав перший рядок вашої відповіді. Недарма варіант не знайшов для мене у версії 2.10!
cjsimon

1
Я спробував git merge - продовжувати, і Git Bash не зміг розпізнати це як команду. Але те, що працювало, - це git commit -m "Повідомлення про зобов'язання"
Mimi

2
@Mimi Добре, але ви використовуєте Git 2.12 або більше?
VonC

@VonC ви маєте рацію, я використовую старішу версію Git!
Мімі

23

Якщо ви коли-небудь застрягнете під час злиття / відновлення, ви завжди можете

git reset --hard

щоб відновити свою роботу до стану останньої комісії. Це втратить ваші зміни з робочого дерева, тому якщо ви мали місцеві модифікації до злиття, вони після цього відпадуть - ось чому доцільно не починати злиття, коли у вас є локальні модифікації. :)


16
обов'язкове попередження: git reset --hardвикидає незапрошені зміни
Джеффрі Хейл

2
Чому б не просто git merge --abort, який не ризикує щось втратити?
Олександр Георгій

11

Просто git commitце.

За бажанням git abort:
я зіткнувся з конфліктом злиття. Як я можу скасувати злиття?

Щоб полегшити життя при злиттях, встановіть kdiff3 і налаштуйте його як mergetool. Інструкції: http://doodkin.com/2016/05/29/git-merge-easy-github-this-branch-has-conflicts-that-must-be-used-use-the-command-line/

Ця сторінка містить це відео: https://www.youtube.com/watch?v=Cc4xPp7Iuzo


11

Кожного разу, коли ви об'єднуєте дві гілки за допомогою команди git merge brancha branchb, є дві можливості:

  1. До однієї гілки (дозвольте сказати розгалуження) можна дістатися до іншої гілки (дозвольте сказати, гілка), дотримуючись її історії фіксованих записів.

    2. Але якщо дві гілки розійшлися в якійсь старшій точці, тоді git створює новий знімок і додає новий комітет, який вказує на нього. Тож у випадку, якщо між гілками, які ви зливаєтеся, немає конфлікту, git плавно створює нову команду.

git logПісля об’єднання двох гілок, що не суперечать один одному, запустіть, щоб переглянути комісію.

Тепер повернемося до цікавого випадку, коли між об’єднаннями гілок виникають конфлікти злиття. Цитую це зі сторінки https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging

Git автоматично не створив нову комісію злиття. Він призупинив процес, поки ви вирішите конфлікт. Якщо ви хочете побачити, які файли вимкнено в будь-який момент після конфлікту злиття, можете запуститиgit status


Тож у випадку виникнення конфліктів злиття вам потрібно вирішити конфлікт, а потім додати зміни, які ви внесли до області інсценізації git add filename, використовуючи команду, а потім здійснити зміни за допомогою команди, git commit яка була призупинена git через конфлікт. Сподіваюся, це пояснює ваше запит. Також перейдіть за посиланням вище, щоб отримати детальне розуміння. У разі будь-якого запиту, будь ласка, прокоментуйте нижче, я з радістю допоможу.


7

Наступними кроками після вирішення конфліктів вручну є:

  1. git add.
  2. статус git (це покаже вам, які команди необхідні для продовження автоматичної процедури злиття)
  3. [Команда мерзотник пропонує, наприклад git merge --continue, git cherry-pick --continue, git rebase --continue]

16
Немає git merge
Hola Soy Edu Feliz Navidad

@HolaSoyEduFelizNavidad Це неправильно. Зі git вихід нижче після конфлікту: - error: Failed to merge in the changes. Patch failed at 0001 ADD: _type to styleguide The copy of the patch that failed is found in: .git/rebase-apply/patch When you have resolved this problem, run "git rebase --continue". If you prefer to skip this patch, run "git rebase --skip" instead. To check out the original branch and stop rebasing, run "git rebase --abort".
Timidfriendly

5
Є база даних - продовжувати, а не зливати
Hola Soy Edu Feliz Navidad

git merge --continue, це те, що я намагаюся зробити, дає результат error: unknown option 'continue'. Я певен, що ваша відповідь неправильна, оскільки git-mergeсторінка людини не перераховує її. Яку версію Git ви використовуєте? Я використовую git version 1.8.5.2 (Apple Git-48). Я також спробував з MacPorts git version 2.9.3.
jww

1
З git 2.10 для простого злиття команда звичайна стараgit commit
Кріс Чарабарук

2

Конфлікт злиття виникає, коли дві гілки, які ви намагаєтеся об'єднати, змінили ту саму частину одного файлу. Ви можете створити список конфліктів із git status.

Коли зустрічається конфліктна лінія, Git буде редагувати вміст файлів, на які впливає, візуальними індикаторами, які позначають обидві сторони конфліктуючого вмісту.

<<<<<<< HEAD
conflicted text from HEAD
=======
conflicted text from merging_branch
>>>>>>> merging_branch

Коли ви виправляєте конфліктні файли і ви готові до злиття, все, що вам потрібно зробити, це запустити git addта git commitстворити комісію злиття. Після здійснення зобов’язання git pushзміни до філії.

Довідкова стаття: Git merge .


2

Після того, як всі файли будуть додані, наступним кроком є ​​" git commit ".

"git status" підкаже, що робити: файли, які ще потрібно додати, перелічені внизу, і як тільки вони будуть виконані, він запропонує здійснити фіксацію вгорі, де він пояснює стан злиття поточної гілки.


1

Перше, що я хочу зрозуміти, - це те, що назви гілок є лише псевдонімом певного комітету. фіксація - це те, що git спрацьовує, коли ви тягнете, натискаєте на злиття тощо. Кожна комісія має унікальний ідентифікатор.

Коли ви робите $ git злиття, то, що насправді відбувається, це git намагається перемотати вашу поточну гілку до фіксації, на яку посилається гілка (іншими словами, обидва назви гілок вказують на одну і ту ж фіксацію.) Цей сценарій є найпростішим для git для вирішення, оскільки немає нових зобов'язань. Подумайте, як майстер стрибне на ліліпад, на якому ваша гілка охолоджується. Можна встановити прапор --no-ff, і в цьому випадку git створить новий комітет незалежно від того, чи були кодові конфлікти.

У ситуації, коли між двома гілками, які ви намагаєтеся об'єднати, є кодові конфлікти (як правило, дві гілки, чия історія фіксування має спільну передачу у минулому), швидкий перемотка вперед не працює. git, можливо, все ще зможе автоматично об'єднати файли, доки обидві гілки в конфліктному файлі не були змінені однією і тією ж лінією. у такому випадку git об'єднає конфліктуючі для вас файли та автоматично їх заповнить. Ви можете попередньо переглянути, як це робилося, виконавши $ git diff - cached. Або ви можете передати прапор --no-commit у команду злиття, яка залишить модифіковані файли у вашому індексі, які вам потрібно буде додати та ввести. Але ви можете $ git diff цих файлів переглянути, що злиття зміниться.

Третій сценарій - це коли конфлікти git не можуть автоматично вирішити. У цьому випадку вам потрібно буде вручну об'єднати їх. На мою думку, це найпростіше зробити з злиттям, як, наприклад, араксис злиття або p4merge (безкоштовно). У будь-якому випадку, ви повинні робити кожен файл по одному. Якщо злиття колись здається застрялим, використовуйте $ git merge - продовжуйте, щоб перемістити його. Git повинен сказати, якщо він не може продовжуватись, а якщо так, чому ні. Якщо ви відчуваєте, що в якийсь момент ви втратили злиття, ви можете зробити $ git merge --abort, і будь-яке злиття скасується, і ви можете почати спочатку. Коли ви закінчите, кожен файл, який ви об’єднали, буде модифікованим файлом, який потрібно додати та ввести. Ви можете перевірити, де знаходяться файли зі статусом $ git. Якщо ви ще не зробили об'єднані файли. Вам потрібно зробити це для завершення злиття.


0

Може пізно. Це сталося, тому що ваша GIT HEAD не оновлюється. ця похвала вирішила б це git reset HEAD.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.