Как мне завершить слияние после разрешения конфликтов слияния? - PullRequest
240 голосов
/ 19 марта 2010

Я прочитал раздел Основное ветвление и слияние Книги сообщества Git.

Итак, я следую и создаю одну ветку: experimental.

Тогда я:

  1. переключиться на экспериментальную ветку (git checkout экспериментальный)
  2. внести кучу изменений
  3. передайте это (git commit -a)
  4. переключиться на главную ветку (мастер git checkout)
  5. внести некоторые изменения и зафиксировать там
  6. переключиться обратно на экспериментальный (git checkout экспериментальный)
  7. изменение мастера слияния на экспериментальное (мастер слияния git)
  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.

Что я могу сделать, чтобы вернуться в свою основную ветку?

Ответы [ 10 ]

228 голосов
/ 19 марта 2010

Если во время слияния возникает конфликт, вы должны завершить слияние вручную. Похоже, вы сделали первые два шага, чтобы отредактировать конфликтующие файлы, а затем запустить git add для них, чтобы пометить их как разрешенные. Наконец, вам необходимо зафиксировать слияние с git commit. В этот момент вы сможете снова переключать филиалы.

108 голосов
/ 28 декабря 2016

Как мне завершить слияние после разрешения конфликтов слияния?

С Git 2.12 (Q1 2017) вы получите более естественную команду:

git merge --continue

См. коммит c7d227d (15 декабря 2016 г.) Джефф Кинг (peff) .
См. коммит 042e290 , коммит c261a87 , коммит 367ff69 (14 декабря 2016) Крис Пэкхем (cpackham) .
(Объединено Junio ​​C Hamano - gitster - в коммит 05f6e1b , 27 декабря 2016 г.)

См. 2.12 примечания к выпуску .

merge: добавить опцию '--continue' в качестве синонима для 'git commit'

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

22 голосов
/ 20 марта 2010

Если вы застряли во время слияния / перебазировки, вы всегда можете

git reset --hard

для восстановления вашей работы до состояния последнего коммита. Это приведет к потере ваших изменений в рабочем дереве, поэтому если у вас были локальные модификации до слияния, они будут удалены после этого, поэтому желательно не начинать слияние, когда у вас есть локальные модификации. :)

10 голосов
/ 23 сентября 2016

Просто git commit это.

Опционально git abort это:
Я столкнулся с конфликтом слияний. Как я могу прервать слияние?

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

Эта страница содержит это видео: https://www.youtube.com/watch?v=Cc4xPp7Iuzo

9 голосов
/ 23 сентября 2016

Всякий раз, когда вы объединяете две ветви с помощью команды git merge brancha branchb, есть две возможности:

  1. Одна ветвь (скажем, ветвь) может быть достигнута другой ветвью (скажем, ветвь b), следуя ее истории коммитов. В этом случае git просто перемотает вперед голову, чтобы указать на недавнюю ветвь (в этом корпус ветвь б).

    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, потому что Я надеюсь, что это объясняет ваш запрос. Также зайдите по ссылке выше для подробного понимания. В случае любого запроса, пожалуйста, прокомментируйте ниже, я буду рад помочь.

6 голосов
/ 19 февраля 2016

Следующие шаги после разрешения конфликтов вручную: -

  1. git add.
  2. состояние git (это покажет вам, какие команды необходимы для продолжения процедуры автоматического объединения)
  3. [команда git предлагает, например git merge --continue, git cherry-pick --continue, git rebase --continue]
2 голосов
/ 19 июня 2018

После добавления всех файлов следующим шагом будет " git commit ".

«git status» подскажет, что делать: файлы, которые еще нужно добавить, перечислены внизу, а после того, как все они будут сделаны, он предложит коммит вверху, где он объясняет статус слияния текущей ветви.

1 голос
/ 22 мая 2018

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

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

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

Когда вы исправляете конфликтующие файлы и готовы к слиянию, все, что вам нужно сделать, это запустить git add и git commit для генерации коммита слияния. После принятия git push изменений в ветке.

Справочная статья: Git merge .

1 голос
/ 25 сентября 2016

Первое, что я хочу пояснить, это то, что имена ветвей - это просто псевдоним для определенного коммита.git - это то, что git работает, когда вы тянете, нажимаете merge и так далее.Каждый коммит имеет уникальный идентификатор.

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

В ситуации, когда между двумя ветвями вы находитесь в конфликтах кодапри попытке слияния (обычно две ветви, история коммитов которых имеет общий коммит в прошлом), ускоренная перемотка вперед не сработает.git все еще может автоматически объединять файлы, если одна и та же строка не была изменена обеими ветками в конфликтующем файле.в этом случае git объединит конфликтующие файлы для вас и автоматически зафиксирует их.Вы можете просмотреть, как это сделал git, выполнив $ git diff --cached.Или вы можете передать флаг --no-commit в команду merge, которая оставит измененные файлы в вашем индексе, которые вам нужно будет добавить и зафиксировать.Но вы можете $ git diff этих файлов, чтобы посмотреть, что изменится слияние.

Третий сценарий - когда возникают конфликты, которые git не может разрешить автоматически.В этом случае вам нужно будет объединить их вручную.На мой взгляд, это проще всего сделать с помощью слияния, например, слияния с араксисом или p4merge (бесплатно).В любом случае, вы должны сделать каждый файл один за другим.Если слияние кажется застрявшим, используйте $ git merge --continue, чтобы подтолкнуть его вперед.Git должен сказать вам, если это не может продолжаться, и если так, то почему бы и нет.Если вы чувствуете, что в какой-то момент вы приостановили слияние, вы можете выполнить $ git merge --abort, и любое слияние будет отменено, и вы сможете начать все сначала.Когда вы закончите, каждый объединенный файл будет измененным файлом, который необходимо добавить и зафиксировать.Вы можете проверить, где находятся файлы со статусом $ git.Если вы еще не зафиксировали объединенные файлы.Вы должны сделать это, чтобы завершить слияние.Вы должны завершить слияние или прервать слияние, прежде чем сможете переключать ветви.

0 голосов
/ 24 апреля 2019

Это может быть поздно. Это происходит, потому что ваш git HEAD не обновляется. эта рекомендация решит, что git reset HEAD.

...