Intereting Posts
Как отладить учетные данные Subclipse / SvnKit? Есть ли способ поэтапно создавать сообщения фиксации в git? Характеристики ветвления Team Foundation Server по сравнению с другими GitHub Repo работает, но Heroku все тот же Запрос запроса слияния, закрытие, затем возврат – теперь нельзя снова вытащить ветвь Добавление существующего локального репозитория git – Zend studio Git: Как отследить файл из удаленного репозитория, но сохранить его во всех локальных хранилищах разработчиков? Переход Xcode между git и svn в проекте, который имеет как Как заставить git игнорировать двоичные файлы при применении фильтров smudge / clean? Как управлять версиями плагина rails и тестового приложения вместе Существуют ли разные понятия концепции «слежения» в git? Субмодули, не кликаемые в github Git: svn log –stop-on-copy эквивалент Команды для получения вывода журнала SVN в формате Copy, Pastable Format Найдите определенную пару строк кода из большого git repo

Отмена слияния в Git, чтобы никакие коммиты из другой ветви не существовали

У меня два филиала: development и bug_fixes , и я случайно объединил ветку разработки в bug_fixes две-три недели назад и с тех пор работал над bug_fixes , и я ввел изменения в bug_fixes .

Теперь мне нужно объединить ветку разработки . Я хочу, чтобы чистая ветка bug_fixes не имела ветви разработки формы commits . По googling, я придумал следующие сценарии:

1) Отмените фиксацию, которая объединила ветвь развития в ветке bug_fixes , но частично выполнила задание. Коммит из ветки разработки все еще можно увидеть в ветке bug_fixes , что не требуется.

2) Восстановите и удалите коммит, который сделал слияние, но он по-прежнему имеет ту же проблему, что и в пункте 1. bug_fixes ветвь по-прежнему содержит фиксации из ветви разработки .

Есть ли способ удалить объединенную фиксацию, и все те коммиты, которые появились в ветке разработки ветвей bug_fixes , также будут удалены? Или это невозможно?

Если вы знаете, какие коммиты поступают из ветви разработки (в дополнение к фиксации слияния), вы можете выполнить git rebase -i (интерактивная rebase) из последней хорошей фиксации исправлений ошибок:

  b--b--(B)--M--d--b--d--b--b (bugfix) / d--d--d (devel) git checkout bugfix git rebase -i (B) # drop M, d, and d b--b--(B)--b'--b'--b' (bugfix) d--d--d (devel) 

Более сложной альтернативой будет git filter-branch , но, надеюсь, интерактивная перебаза достаточно.

В случае OP полная команда:

 git rebase -p -i (b) 

-p позволяет сохранить фиксацию слияния.

Я бы попробовал следующий подход:

Прежде всего, сделайте список коммитов в обоих ветвях:

 git checkout development git log --oneline > log-devel.txt git checkout bug_fixing git log --oneline > log-bugfixing.txt 

Во-вторых, определите в каждой ветви идентификатор последнего фиксации перед выполнением слияния. Давайте devel-0 эти коммиты devel-0 и bugfixing-0 Затем отнесите ветви к состоянию, который они были до случайного слияния:

 git checkout development git reset --hard <devel-0-hash> git checkout bug_fixing git reset --hard <bugfixin-0-hash> 

На данный момент у вас есть две чистые, но устаревшие ветки гитов. Теперь вы должны взять из log-devel.txt и log-bugfixing.txt все коммиты, которые не включены в текущие ветви, и добавить их в соответствующую ветку. Чтобы добавить фиксацию с id abc0123 в вашу ветку, вы можете использовать вишневый выбор :

 git checkout development git cherry-pick `abc0123` 

Учтите, что коммиты лучше добавлять в чистые ветви в том же порядке, в каком они были добавлены в ветвь исправления ошибок, чтобы свести к минимуму количество возникающих конфликтов.

вам нужно знать ваше последнее сообщение о фиксации для bug_fixes перед слиянием , если вы знаете, что sha hash тогда лучше.

теперь сначала вам нужно найти шаш-хэш с помощью команды

$ git reflog

выход – это что-то вроде

1fb5738 HEAD @ {10}: commit …

4d47df6 HEAD @ {11}: commit …

5f32c4b HEAD @ {12}: слияние …

428f91d HEAD @ {13}: проверка …

5f32c4b HEAD @ {14}: проверка …

первая часть – ша-хэш. В этом случае состояние перед слиянием имеет значение хеша 428f91d

поэтому теперь, в ветке bug_fixes, мы переустановим это значение хэш-функции

git reset –hard 428f91d

теперь он отменен

Позвольте мне описать сценарий с примером ниже

Фиксация исправления ошибок: Редакция 10

Объединенный филиал Dev: редакция 11

Несколько изменений после слияния: Редакция 12 – Редакция 15

Теперь нужно выполнить 2 шага (простой метод без встроенных команд git)

  1. Вернитесь к редакции 10

    Клонировать Последний код в папку под названием "latest"

    Clone Revision 10 в папку под названием «rev10»

    Удалите все содержимое (кроме папки .git) из последней папки

    Скопируйте все содержимое (кроме папки .git) из каталога rev10 в последнюю папку

    Проверка последнего содержимого папки

Теперь ветвь исправления ошибок будет иметь содержимое, равное редакции 10, без изменений в ветке разработчика

  1. Необязательно – Объединение Редакции 12 – Редакция 15 в ветку bug_fix

    Когда мы вернемся к старой ревизии, последние изменения в ветке bugfix также исчезли. Эти изменения необходимо вручную объединить один раз обратно в ветку исправления ошибок