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



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



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



Git log output

970   6  

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 сделал это очень естественно и не имел реального перипетии.
Он просто считал это изменением от "состояния до слияния" до "состояние после слияния", и это все.
Ничего сложного, ничего странного, ничего особо опасного. ГИТ сделает это, даже не думая об этом.

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

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

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

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

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

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

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

поэтому, прежде чем я начну исправлять найденные проблемы, я делаю вишневый выбор W commit для моей ветви

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 отменяет возврат и добавляет некоторые новые коммиты.

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

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

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

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

git checkout devel
git reset --hard COMMIT_BEFORE_WRONG_MERGE

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

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

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

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

чтобы отменить восстановления:

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

Comments

    Ничего не найдено.