Git ребаз с паузой после каждого коммита - PullRequest
2 голосов
/ 24 февраля 2020

Допустим, у нас есть две версии библиотеки X: v1 и v2

Я сопровождаю другую библиотеку Y, которая использует библиотеку X. Я использовал v1 библиотеки, и она там в master.

Затем в библиотеке X появилась новая версия v2, которая потребовала, чтобы я изменил способ использования библиотеки (только изменения пакета, библиотека X изменила свое имя). Версия v1 устарела.

Однако, поскольку моя библиотека в настоящее время используется корпоративными пользователями, которые не хотят обновляться до более новой версии моей библиотеки, которая использует v2. Также я должен предоставить исправления к старой версии по контракту.

У меня было две ветви:

  • master (использует v1)
  • new_master (использует v2)

Способ, которым я сделал это изменение, заключается в разработке на master и перебазировании new_master на master. Тогда у меня может быть один коммит, который содержит изменения, которые заменяют все пакеты v1 на пакеты v2 (единственными изменениями являются строки импорта).

master       x----x----x----x----x----n
new_master   x----x----x----x----x----f

(после перезагрузки)

master       x----x----x----x----x----n
new_master   x----x----x----x----x----n----f

Сейчас Я добавил новую функцию в свою библиотеку, которой требуется версия 2 библиотеки X. Так что она будет существовать только в new_master. После добавления новой функции дерево стало таким:

master       x----x----x----x----x----x----n
new_master   x----x----x----x----x----x----f----n

Я могу сделать то же самое здесь, но не забудьте зафиксировать коммит n в главном дереве. Я не хочу добавлять еще одно исправление после n от new_master.

Что я получу, если сделаю обычную повторную базу:

master       x----x----x----x----x----x----n
new_master   x----x----x----x----x----x----n----f----n----f

Second f - это новый фиксированный фикс, потому что после второго n commit ветвь new_master не скомпилируется.

Что мне нужно получить:

master       x----x----x----x----x----x----n
new_master   x----x----x----x----x----x----n----F----n

Где фиксация F - это новая фиксация фиксации.

Что я сейчас делаю для достижения этой цели?

  • Я решаю эту проблему , создав новую ветку с именем new_master2 из new_master, затем удалив новую функцию там.
  • Затем я перебрасываю new_master2 на мастера.
  • Фиксация для новой функции потерян, так что я выбираю его из new_master.
  • Наконец я удаляю ветку new_master и переименовываю new_master2 в new_master.
  • Я заканчиваю sh это прилагая силу к пульту sh.

Что я пытаюсь сделать?

Найти другой способ сделать то же самое, без создание временной ветки new_master2. * 10 73 *

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

После нескольких часов поиска я наткнулся на этот ответ от @ZelluX. Теперь выполните следующие шаги:

$ git checkout new_master
$ git rebase -i master
# Editor opens, find my previous fix commit, and change the command to 'edit'
# If there are conflicts, fix them and continue rebasing
# Git will stop after making my old fix commit. Ensure everything compiles there.
# If you made any changes, then add them and ammend the commit
$ git add .
$ git commit --amend
# Once done, continue rebasing
$ git rebase --continue

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

1 голос
/ 24 февраля 2020

Как я понимаю, это так. У вас есть две ветви: master (использует v1) и new_master (использует v2). Теперь вы добавили новый коммит в ветку new_master.

master        x----x----x----x----x----x1----n

new_master    x----x----x----x----x----x1----f----n

Теперь вы можете достичь результата ниже:

master       x----x----x----x----x----x1----n

new_master   x----x----x----x----x----x1----n----f----n

Вы можете выполнить ребазирование следующим образом:

git checkout new_master
git rebase master
--if there are conflicts solve the conflicts
--git add files_conflicts_you_solved
--git rebase --continue

Что будет делать приведенная выше команда: * Переместите головку, чтобы указать на ветку new_master * Найдите коммит, который является точкой расхождения для двух ветвей. В этом случае коммит x1. И сделайте копию всего коммита на вершине x1 (в данном случае это всего n коммитов) и вставьте на вершине x1 коммит в ветке new_master.

Другое решение без использования rebase будет выглядеть следующим образом: * Создать ветку из имени мастера dev * Cherry выбрать все коммиты из new_master в вашей ветке dev

Ниже приведены команды:

git checkout  master
git  branch dev
git checkout dev
git cherry-pick f^..n 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...