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


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

unmerged:   _widget.html.erb

You are in the middle of a conflicted merge.

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


1858


источник


Ответы:


Поскольку ваши pullне удалось HEAD(не HEAD^) является последней «действительной» фиксацией в вашем филиале:

git reset --hard HEAD

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

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

git pull --strategy=theirs remote_branch

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

git fetch origin
git reset --hard origin

1679



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

Кроме того, как упоминает @ Майкл Джонсон, если ваша версия 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после завершения слияния или прерывания его.


1549



git merge --abort

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

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

git merge --abortэквивалентно git reset --mergeкогда MERGE_HEADнастоящее.

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


369



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

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

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

72



я думаю что это git resetтебе нужно.

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

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


70



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

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


29



Since Git 1.6.1.3 git checkout has been able to checkout from either side of a merge:

git checkout --theirs _widget.html.erb

16



An alternative, which preserves the state of the working copy is:

git stash
git merge --abort
git stash pop

I generally advise against this, because it is effectively like merging in Subversion as it throws away the branch relationships in the following commit.


13



And if you end up with merge conflict and doesn't have any things to commit but still merge error is being displayed after applying all the below mentioned commands,

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

please remove

.git\index.lock

file [cut paste to some other location in case of recovery] and then enter any of below command depending on which version you want.

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

Hope that helps!!!


6



I found the following worked for me (revert a single file to pre-merge state):

git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*

1