Отменить слияние git squash и снова слить git

У меня есть 2 функции удаленных ветвей и мастер. Слияние сквоша было выполнено на ветке функций от мастера. Более поздние коммиты произошли как в основной, так и в функциональной ветке. Теперь я попытался сделать еще одно обычное слияние из мастера в функцию. Это оказывается проблематичным, поскольку новое слияние не совсем согласуется с уже произошедшим слиянием сквоша. Небольшой поиск показал, что проблема заключается в слиянии сквоша.

Итак, теперь я пытаюсь сделать следующее:

  1. Отменить все коммиты в функциональной ветке до слияния сквоша (я получил разрешение от команды отменить изменения, так как их было немного. Я могу сделать их позже). Для возврата я использовал

$ git вернуться --no-commit sha1

$ git вернуться --no-commit sha2

...

$ git commit -m "возврат ветки до фиксации сквоша"

$ git push origin HEAD:refs/for/branch/feature

Теперь моя функциональная ветка показывает дополнительную фиксацию для возврата, когда я делаю git log.

  1. Теперь я хочу попробовать следующее, чтобы объединить основную функцию с возвращенной:

    $ git merge --no-ff origin/master -m "слияние с мастером"

    Проверка Gerrit была включена в моем удаленном репо

Мой вопрос -

  1. попадет ли это во все последние изменения от мастера к функции, включая основные изменения, которые вошли в старое слияние сквоша?

  2. Создаст ли это слияние один обзор gerrit?

  3. Любые простые решения, если мой подход не сработает?

Будем признательны за любую помощь здесь. Спасибо.


person JHead    schedule 27.04.2016    source источник
comment
Почему бы не разрушить ветку функций с помощью мастера - я предлагаю избегать коммитов слияния - зачем вам нужны коммиты слияния в ветке функций?   -  person laplasz    schedule 27.04.2016


Ответы (2)


Ответы на ваш вопрос:

  1. Я не знаю, но ставлю пенни на фунт (или цент на доллар, если хотите), вы попадете в неприятную передрягу с git revert

  2. Не знаю, но сомневаюсь - см. ниже

  3. Да (и, следовательно, я надеюсь, что это не совсем бесполезный ответ).

Не git revert. git revert добавляет еще один коммит, который делает противоположное названному коммиту, делая ваш беспорядок больше, а не меньше. git revert — это ужасный инструмент для устранения недавних ошибок слияния. Это гораздо лучший инструмент для отмены исторических единичных коммитов. То, что вы действительно хотите сделать, это притвориться, что плохого слияния никогда не было.

Вместо:

  • git reset --hard [commitBeforeYouMadeTheMess]
  • git merge ... (или что вы делали раньше)

В целях безопасности вы можете поставить перед лотом git branch backup-my-mess или сделать это в другой ветке git checkout -b see-if-I-can-clean-up-my-mess.

Обратите внимание, что если вы уже нажали свой беспорядок (о боже), вам может потребоваться принудительное нажатие, чтобы исправить это.

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

Это конкретно не касается точки gerrit (потому что я не gerrit человек), но вам нужно сначала правильно понять бит git.

person abligh    schedule 27.04.2016
comment
Спасибо за указание на проблему git revert. Я использовал git reset --hard - person JHead; 27.04.2016
comment
@JHead Не нужно благодарностей. Просто проголосуйте/примите ответ, если он полезен. - person abligh; 27.04.2016
comment
Я проголосовал за ответ, но мне все еще нужно выяснить, как получить один обзор gerrit для обычного слияния после сброса. Также просто чтобы вы знали, что я использовал git reset без жесткого, чтобы я мог сгенерировать фиксацию и обзор для сброса. Как вы думаете, у него будут проблемы? - person JHead; 27.04.2016
comment
@JHead: Если вы git reset, он будет делать то же самое, что и git reset --hard, если у вас нет незафиксированных изменений (он оставляет измененные файлы незафиксированными). Вероятно, у вас нет незафиксированных изменений, так что это не имеет значения, но --hard безопаснее, если они есть. Это вернет вас точно в ту ситуацию, в которой вы были до того, как сделали «неправильное» слияние. Если gerrit похож на другие системы, то выполнение «правильного» слияния даст вам столько же/много обзоров, сколько gerrit сделал бы, если бы вы изначально сделали правильное слияние. Я бы предположил, что это один, при условии, что объединенная ветвь была проверена. - person abligh; 27.04.2016

Можно ли также отменить фиксацию через Gerrit. вы можете найти кнопку на странице набора патчей коммита. Это очень легко и удобно. И я предлагаю не объединять мастер в ветку функций, а не перебазировать ее.

person laplasz    schedule 28.04.2016