Повторное выполнение обратного слияния в Git

я столкнулся с небольшой проблемой здесь: у меня была проблемная ветка 28s в Git, что я слился в общем develop филиала. Оказывается, я сделал это слишком быстро, поэтому я использовал git-revert для отмены слияния. Теперь, однако, пришло время слияния 28s на develop, но команда git-merge видит исходное слияние и радостно объявляет, что все хорошо и ветви уже объединены. Что мне теперь делать? Создайте "Revert "Revert" 28s -> develop" "" commit? Не кажется хороший способ сделать это, но я не могу представить другую на данный момент.

как выглядит древовидная структура:

Git log output

6 ответов


вы должны "отменить возврат". Зависит от того, как вы это вернули, это может быть не так просто, как кажется. Посмотри официальный документ на эту тему.

---o---o---o---M---x---x---W---x---Y
              /
      ---A---B-------------------C---D

позволяет:

---o---o---o---M---x---x-------x-------*
              /                       /
      ---A---B-------------------C---D

но все ли это работает? Конечно. Вы можете отменить слияние, а из чисто технический угол, git сделал это очень естественно и не имел реального перипетии.
Он просто считал это изменением от "состояния перед слиянием" до "состояние после слияния", и это все.
Ничего сложного, ничего лишнего, ничего опасного. ГИТ сделает это, даже не задумываясь.

Итак, с технической точки зрения, нет ничего плохого в возврате слияния, но!--14-->С точки зрения рабочего процесса это то, что вы обычно должны пытаться избегайте.

если вообще возможно, например, если вы нашли проблему, которая была объединена в главное дерево,а не отменить слияние, попробовать действительно трудно:

  • раздвоить ее на ветке ты слился и просто исправить,
  • или попробуйте отменить индивидуальную фиксацию, которая вызвала ее.

Да, это сложнее, и нет, это не всегда будет работать (иногда ответ: "упс, я действительно не должен был объединять его, потому что это не было готов еще, и мне действительно нужно отменить все слияния"). Тогда вы действительно следует отменить слияние, но когда вы хотите повторно выполнить слияние, вы теперь нужно сделать это, вернув revert.


предположим, у вас есть такая история

---o---o---o---M---W---x-------x-------*
              /                      
      ---A---B

где A, B неудачные коммиты и W-возврат M

поэтому, прежде чем я начну исправлять найденные проблемы, я делаю cherry-pick W commit to my branch

git cherry-pick -x W

затем я возвращаю W commit на мою ветку

git revert W 

после того, как я могу продолжить исправление.

окончательная история может выглядеть так:

---o---o---o---M---W---x-------x-------*
              /                       /     
      ---A---B---W---W`----------C---D

когда я отправляю PR, он ясно показывает, что PR отменяется и добавляет некоторые новые коммиты.


чтобы отменить возврат без завинчивания рабочего процесса слишком много:

  • создайте локальную копию корзины develop
  • отменить фиксацию возврата на локальной копии develop
  • объединить эту копию на ветку, и ветку на свой git-сервер.

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


вместо git-revert вы могли бы использовать эту команду в devel филиала к выбросить (отменить) неправильный коммит слияния (вместо того, чтобы просто возвращать его).

git checkout devel
git reset --hard COMMIT_BEFORE_WRONG_MERGE

это также скорректирует содержимое рабочего каталога соответствующим образом. будьте осторожны:

  • Сохранить изменения в ветви разработки (так как неправильное слияние), потому что они слишком будет стерт git-reset. Все коммиты после тот, который вы указываете как the

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

вместо этого я проверил фиксацию, которую я хотел, чтобы ветка вернулась, например git checkout 123466t7632723. Затем преобразуется в ветвь git checkout my-new-branch. Затем я удалил ветку я не хочу. Конечно, это будет работать только в том случае, если вы сможете выбросить ветку, которую вы испортили.


чтобы вернуть revert:

git revert <commit-hash-of-previous-revert>