it-swarm.com.ru

Я столкнулся с конфликтом слияний. Как я могу прервать слияние?

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

unmerged:   _widget.html.erb

You are in the middle of a conflicted merge.

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

2237
Gwyn Morfey

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

git reset --hard HEAD

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

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

git pull --strategy=theirs remote_branch

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

git fetch Origin
git reset --hard Origin
1985
Pat Notz

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

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

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

Со страницы git merge man page

git merge --abort эквивалентен git reset --merge при наличии MERGE_HEAD.

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

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

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

1791
Carl
git merge --abort

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

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

git merge --abort эквивалентен git reset --merge при наличии MERGE_HEAD.

http://www.git-scm.com/docs/git-merge

447
ignis

Я думаю, что это git reset вам нужно.

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

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

85
David Precious

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

Также нет особой необходимости сбрасывать и выполнять слияние с другой стратегией. 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
74
CB Bailey

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

git merge --abort

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

git status

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

72
Jagruttam Panchal

Поскольку комментарии предполагают, что 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 гораздо более мощным для сценариев, подобных описанному, и вообще неудачных слияний.

33
Martin G

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

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

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

. Мерзавец\index.lock

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

git reset --hard HEAD
git reset --hard Origin

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

23
Nirav Mehta

Начиная с Git 1.6.1.3 git checkout можно было оформить заказ с любой стороны слияния:

git checkout --theirs _widget.html.erb
17
Alain O'Dea

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

git stash
git merge --abort
git stash pop

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

15
Alain O'Dea

Я обнаружил, что следующее работает для меня (вернуть один файл в состояние перед объединением):

git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*
1
Malcolm Boekhoff