Как извлечь и удалить объединенную ветку в Git?

У меня есть 7 веток, которые влияют на одни и те же файлы, все они были объединены в главную ветку через вторичную ветку. Одна из ветвей не была предназначена для объединения, потому что она была нестабильной - могу ли я отменить изменения, сделанные этой единственной веткой?

Предполагая, что мой репозиторий выглядит следующим образом:

master  A - B - - - - E - - G - - - J - K
b1          |          `- F - - - I´  
b2          |                    / 
b3          |` - C - - - - - H -´
b4           ` - - D - - - -´

Сейчас D в мастере. Я хочу удалить его (но оставить в ветке b4).

4 ответа

Вы должны быть в состоянии просто вернуть H.

git revert H

Тем не менее, вы не сможете исправить это и восстановить его позже, когда исправлено. D будет переделан только после возврата этого первого возврата.

В зависимости от вашего рабочего процесса, может быть проще снова выполнить слияния, не включая b4.

Я обращаюсь к подобным вещам в своем посте здесь (или в гугле "ветка за функцию"): http://dymitruk.com/blog/2012/02/05/branch-per-feature/

Избавление от плохих веток лежит в основе этого рабочего процесса. Я надеюсь, что это поможет вам.

Прочитайте это.

По сути, вы хотите отменить слияние с чем-то вроде

git revert -m 1 H

создать коммит Lзатем, когда этот коммит снова станет действительным

git checkout master &&
    git revert L &&
    git checkout b3 &&
    git merge b4

и снова включите его.

В моем примере я сделал возврат на master, но я бы предложил сделать начальный git revert H на ветви самого низкого уровня, что изменение не имеет смысла - если это просто для того, чтобы не стать частью мастера, сделайте это на этом уровне, но если вы не хотите, чтобы это влияло на b3 (или любую другую ветку) затем выполните этот возврат - и последующий возврат - возврат - на b3.

Предполагая, что толчок не был сделан:

        git checkout master -b old-ref

На всякий случай, если нам это нужно... Тогда:

    git checkout <old correct sha1> -b TEMP
    git branch -D master
    git checkout master

Должен получить происхождение / мастер

    git rebase -i TEMP

Теперь вы можете выполнить слияние с "правильно" (или нет). Если был сделан пуш, и вы не можете его контролировать (то есть восстанавливаете его "с нуля"), вам придется отменить неудачный коммит.

В случае, если все находится только в вашем локальном репо (нигде не перемещается), я просто переустанавливаю ветви в состояние до слияний и выполняю слияния снова.

Если она нажата (то есть вы не хотите сбрасывать): верните свой коммит слияния (H) на b3 (это создаст новый коммит - скажем, Q) и снова слите b3 в master (так что вы сливаете этот коммит, который отменяет изменения, принес b4). Если позже вы захотите объединить b4 с мастером, вам необходимо: объединить b3 с b4 (это приведет к переходу Q в b4), вернуть Q на b4 (чтобы вы вернули возврат) - теперь с b4 можно работать снова и объединить в мастер в какой-то момент позже

Если это просто один D коммит, который вы не хотите иметь в master, вы можете сделать следующее:

  • оформить заказ b4
  • вернуть D (это создаст новый коммит - скажем, U)
  • объединить b4 с мастером (или просто выбрать U-коммит, который удаляет нежелательные изменения).

Позже вы можете вернуть U коммит на b4 (то есть вернуть изменения, сделанные в D) и снова слить b4 в master.

Другие вопросы по тегам