Git revert of merge commit вызывает проблемы, когда слияние фактически выполнено. - PullRequest
12 голосов
/ 14 сентября 2011

Мы случайно слили ветку XYZ в DEV и перенесли ее в исходное хранилище. Это было сделано с --no-ff для создания отдельного коммита слияния. Как только я понял неправильное слияние, я сделал git revert, чтобы создать возвращаемый коммит, и вытолкнул его. Все было хорошо, и было много радости ...

Пока мы не попытались объединить XYZ с dev. Первоначальная путаница была вызвана тем, что многие файлы, которые были добавлены в XYZ, не были найдены в объединенной ветке dev. Затем я понял, что в ветке DEV есть коммит возврата, который удалял все файлы, которые были добавлены в XYZ, а затем в DEV из-за слияния.

Вот упрощенная цепочка событий:

$ git checkout dev
$ git branch xyz
$ git checkout xyz
$ git add files/foo.xyz
$ git commit -m "blargh"

здесь происходит случайное слияние:

$ git checkout dev
$ git merged xyz
$ git push origin dev

и вот я пытаюсь спасти день:

$ git revert <SHA>
$ git push

вернуть коммит на место, все довольны

... more work happens ...

тогда, наконец, пришло время объединить xyz навсегда:

$ git checkout xyz
$ ls files/foo.xyz
files/foo.xyz
$ git checkout dev
$ git merge xyz
$ ls files/foo.xyz
File not found

Итак, мои вопросы:

a) Какой хороший способ откатить коммиты, особенно если они были перенесены в другие репо? Git Revert казалось правильным, но после проблем со слиянием я уже не уверен ...

b) Предполагая, что git revert является правильным способом сделать это, как справиться с описанным выше сценарием слияния?

PS: Я прошу прощения, если на этот вопрос уже был дан ответ, однако я не знал, что искать. Если есть ответ, пожалуйста, направьте меня к нему. Спасибо.

1 Ответ

14 голосов
/ 14 сентября 2011

а) Какой хороший способ откатить коммиты, особенно если они были перенесены в другие репо? Git Revert казалось правильным, но после проблем со слиянием я уже не уверен ...

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

б) Предполагая, что git revert является правильным способом сделать это, как справиться с описанным выше сценарием слияния?

Это на самом деле классическая проблема в git. Хороший (но неочевидный!) Способ решения этой проблемы предлагается (и хорошо объясняется) в этой публикации в блоге Pro Git - короче говоря, идея состоит в том, чтобы отменить коммит возврата перед объединением снова в ветке.

Обновление: есть также еще одно обсуждение той же проблемы от Linux Torvalds, которое также может быть полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...