Удаление коммитов слияния в Git

здесь у меня есть наш журнал фиксации из моего РЕПО. Вы можете увидеть " Merge branch...в..."commits, и после этого commit ветвь была объединена.

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

enter image description here

1 ответов


если вы хотите применить изменения коммитов без включения коммита слияния (который, как отметил Роланд Смит, обычно считается плохой практикой), вы можете использовать git rebase со следующим рабочим процессом:

  1. проверка ветви, в которой вы хотите, чтобы изменения были включены (скажем, master):git checkout master
  2. сбросить master до фиксации перед слиянием, которое вы хотите отменить:git reset --hard <hash of prior commit>. Убедитесь, что в ветке, над которой вы работали, нет незафиксированных изменений или эта команда уничтожит их.
  3. проверка ветви, содержащей обновления, которые вы хотите "объединить", чтобы освоить без фактического слияния (назовем это dev):git checkout dev.
  4. Rebase dev на master. Это поставит HEAD commit dev, чтобы быть выше по течению до последнего фиксации, на которую указывает мастер:git rebase master (см. документы для получения дополнительной информации).
  5. исправьте все конфликты слияния, которые возникают во время ребаза (они будут иметь произошло в обычном слиянии тоже).
  6. в перебазируется отделения теперь должны все его совершает после последнего коммита в мастер. Чтобы перенести это на master, проверьте master (git checkout master) и объединить новую ветку git merge dev. Это приведет к внесению изменений в master без добавления фиксации слияния.
  7. как только вы уверены, что обновленный master ветка выглядит нормально, вам также придется обновить ветку на любых удаленных репозиториях. Потому что ты разрушаешь предыдущую историю, когда ты давишь. ветвь, которую вам придется использовать --force (или -f флаг) для удаленного репо, чтобы принять изменения, т. е.: git push origin master --force.

вот и все. После этого, совершает на dev которые были разветвлены от master теперь должны быть выше по течению до фиксации предварительного слияния выше.

Примечание: запуск rebase будет постоянно обновлять историю фиксации для измененных ветвей. Для безопасности, я рекомендую принять 1 из 2 методов:

  1. в Предложение @Dacav, следите за хэшами фиксации для каждой ветви, прежде чем что-либо обновлять. Если вещи идут грушевидной формы, то просто run git reset --hard <original_commit_hash> чтобы вернуть ветку на исходную фиксацию.
  2. создайте резервные копии обоих ветвей, прежде чем перебазироваться, которые указывают на оригинальный коммит:

    git checkout - b master_bk git checkout-b dev_bk