Я столкнулся с конфликтом слияний. Как я могу прервать слияние? - PullRequest
2228 голосов
/ 19 сентября 2008

Я использовал git pull и имел конфликт слияния:

unmerged:   _widget.html.erb

You are in the middle of a conflicted merge.

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

Ответы [ 11 ]

1979 голосов
/ 19 сентября 2008

Поскольку ваш pull был неудачным, HEAD (не HEAD^) является последним "действительным" коммитом в вашей ветви:

git reset --hard HEAD

Другая часть, которую вы хотите, - позволить их изменениям переопределить ваши изменения.

Более старые версии git позволяли вам использовать "их" стратегию слияния:

git pull --strategy=theirs remote_branch

Но с тех пор это было удалено, как объяснено в этом сообщении Джунио Хамано (сопровождающий Git). Как отмечено в ссылке , вместо этого вы должны сделать это:

git fetch origin
git reset --hard origin
1786 голосов
/ 29 марта 2010

Если ваша версия git> = 1.6.1, вы можете использовать git reset --merge.

Также, как упоминает @Michael Johnson, если ваша версия git> = 1.7.4, вы также можете использовать git merge --abort.

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

Со страницы руководства пользователя git merge

git merge --abort эквивалентно git reset --merge, когда присутствует MERGE_HEAD.

MERGE_HEAD присутствует, когда происходит слияние.

Также относительно непринятых изменений при запуске объединения:

Если у вас есть изменения, которые вы не хотите вносить до начала слияния, просто git stash их до слияния и git stash pop после завершения слияния или его отмены.

447 голосов
/ 13 ноября 2012
git merge --abort

Прервать текущий процесс разрешения конфликтов и попытаться восстановить состояние перед слиянием.

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

git merge --abort эквивалентно git reset --merge, когда MERGE_HEAD присутствует.

http://www.git -scm.com / документы / ГИТ-слияние

84 голосов
/ 19 сентября 2008

Я думаю, это git reset тебе нужно.

Остерегайтесь, что git revert означает что-то очень отличное, скажем, svn revert - в Subversion восстановление отменяет ваши (незафиксированные) изменения, возвращая файл в текущую версию из хранилища, тогда как git revert "отменяет" коммит.

git reset должен делать эквивалент svn revert, то есть отбрасывать ваши нежелательные изменения.

74 голосов
/ 20 сентября 2008

В этом конкретном случае вы не хотите прерывать слияние, просто разрешите конфликт определенным образом.

Нет особой необходимости сбрасывать и выполнять слияние с другой стратегией. Git правильно выделил конфликты, и требование принять изменения других сторон относится только к этому файлу.

Для неотправленного файла в конфликте git делает доступной общую базовую, локальную и удаленную версии файла в индексе. (Здесь они считываются для использования в инструменте 3-way diff git mergetool.) Вы можете использовать git show для их просмотра.

# common base:
git show :1:_widget.html.erb

# 'ours'
git show :2:_widget.html.erb

# 'theirs'
git show :3:_widget.html.erb

Простейшим способом разрешения конфликта с использованием удаленной версии является:

git show :3:_widget.html.erb >_widget.html.erb
git add _widget.html.erb

Или с git> = 1.6.1:

git checkout --theirs _widget.html.erb
67 голосов
/ 24 декабря 2018

Это так просто.

git merge --abort

Сам Git покажет вам решение, когда вы находитесь в такой ситуации, и запустите команду git status.

git status

Надеюсь, это поможет людям.

33 голосов
/ 02 апреля 2015

Поскольку комментарии предполагают, что git reset --merge является псевдонимом для git merge --abort, стоит отметить, что git merge --abort эквивалентен только git reset --merge, если присутствует MERGE_HEAD. Это можно прочитать в справке git для команды слияния.

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

После неудачного слияния, когда нет MERGE_HEAD, неудачное слияние может быть отменено с git reset --merge, но не обязательно с git merge --abort, , так что они не только старый и новый синтаксис для одной и той же вещи. .

Лично я нахожу git reset --merge гораздо более мощным для сценариев, подобных описанному, и неудачных слияний вообще.

23 голосов
/ 11 апреля 2018

И если вы столкнулись с конфликтом слияния и не имеете каких-либо обязательств, но ошибка слияния отображается после применения всех перечисленных ниже команд,

git reset --hard HEAD
git pull --strategy=theirs remote_branch
git fetch origin
git reset --hard origin

пожалуйста, удалите

.git \ index.lock

file [вырезать вставить в другое место в случае восстановления], а затем ввести любую из следующих команд в зависимости от того, какую версию вы хотите.

git reset --hard HEAD
git reset --hard origin

Надеюсь, это поможет !!!

17 голосов
/ 17 июля 2010

С Git 1.6.1.3 git checkout удалось оформить заказ с любой стороны слияния:

git checkout --theirs _widget.html.erb
15 голосов
/ 13 июля 2010

Альтернатива, которая сохраняет состояние рабочей копии:

git stash
git merge --abort
git stash pop

Я обычно советую против этого, потому что это фактически похоже на слияние в Subversion, поскольку оно отбрасывает отношения ветвления в следующем коммите.

...