Git: как выполнить обратное слияние коммита?

124

С SVN легко выполнить обратное слияние коммита, но как это сделать с Git?

словцо
источник
Я не думаю, что это то, что подразумевается под вопросом. Обратное слияние в SVN также отменяет изменения от фиксации к локальным изменениям, так что вы можете редактировать их и снова фиксировать.
Соня

Ответы:

105

Чтобы создать новую фиксацию, которая «отменяет» изменения прошлой фиксации, используйте:

$ git revert <commit>

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

Бен Джеймс
источник
31
Вероятно, вам нужно будет указать -m <parent number>параметр, git revertчтобы указать, какое изменение нужно отменить. Если вы хотите отменить слияние неопубликованной истории, используйте git reset --hard HEAD^1.
Якуб Наребски
3
Якуб: это правда, если вы откатываете фиксацию слияния, но в терминологии Subversion «обратное слияние» на самом деле просто название для отмены любого вида фиксации.
Бен Джеймс,
4
Обратите внимание, что использование -mозначает, что будущее слияние из неслитой ветки не будет включать изменения, сделанные до этого слияния! См. Schacon.github.com/git/howto/revert-a-faulty-merge.txt, чтобы узнать о правильных способах повторного слияния неслитой ветки.
Мартейн Питерс
125

Чтобы вернуть слияния коммит, вы должны использовать: git revert -m <parent number>. Так, например, чтобы отменить последнюю самую последнюю фиксацию слияния с использованием родителя с номером 1, вы должны использовать:

git revert -m 1 HEAD

Чтобы отменить фиксацию слияния перед последней фиксацией, вы должны сделать:

git revert -m 1 HEAD^

Используйте, git show <merge commit SHA1>чтобы увидеть родителей, нумерация - это порядок, в котором они появляются, напримерMerge: e4c54b3 4725ad2

Документация по слиянию git: http://schacon.github.com/git/git-merge.html

обсуждение слияния git (запутанное, но очень подробное): http://schacon.github.com/git/howto/revert-a-faulty-merge.txt

Маркус Эрикссон
источник
36
Как можно получить «число», связанное с родителем? Есть ли у веток внутренний числовой идентификатор?
daniyalzade 05
7
Используйте, git show <merge commit SHA1>чтобы увидеть родителей, нумерация - это порядок, в котором они появляются, напримерMerge: e4c54b3 4725ad2
supermethod
8
Пример: git revert -m 1 SHA1Эта команда сработала для меня, чтобы отменить фиксацию слияния, которая была несколькими коммитами слияния до начала и имела много коммитов ниже.
c.apolzon
3
Какие родители? E4c54b3 или 4725ad2?
Дельфин
1
Это все еще не дает достаточно информации о том, как результаты git show соотносятся с родительскими числами. "Порядок их появления" основан на 1? 0 на основе? В частности, в этом примере каков SHA1 родительского элемента 1? e4c54b3 или 4725ad2?
cowlinator 05
4

Если я вас правильно понимаю, вы говорите о

svn merge -rn:n-1

чтобы отказаться от более ранней фиксации, и в этом случае вы, вероятно, ищете

git revert
Rudedog
источник
0
git reset --hard HEAD^ 

Используйте указанную выше команду, чтобы отменить изменения слияния.

Капил Чакраварти
источник
3
Это отбрасывает фиксацию слияния, которая не выполняет то, что просит исходный плакат. OP пытается выполнить обратный патч, чтобы отменить предыдущие изменения, а не полностью стереть историю предыдущих изменений.
-1

Если вы не хотите совершать фиксацию или хотите выполнить фиксацию позже (для вас все равно будет подготовлено сообщение фиксации, которое вы также можете отредактировать):

git revert -n <commit>
rkrisztian
источник