Переместить верхние коммиты одной ветви в другую - PullRequest
0 голосов
/ 08 июня 2018

Допустим, я хочу перейти от

                    branch1 <- HEAD
                    ↓
A -- B -- C -- D -- E
     ↑
     branch2

к

          branch1
          ↓
A -- B -- C
      \-- D' -- E'
                ↑
                branch2 <- HED

Это может произойти, когда я фиксирую в ветке, где я должен был зафиксировать в другой.Я еще не нажал ни одной ветви, поэтому я должен быть в порядке, перемещая эти коммиты D и E из branch1 в branch2.

Как мне переместить коммиты из одной ветви в другую?

Одна из возможностей состоит в том, чтобы выбрать вишню, а затем заставить двигаться branche1 назад, но это ужасно:

git checkout branch2
git cherry-pick D E
git branch -f branch1 C

Возможен перебаз.

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Прежде всего, убедитесь, что у вас нет незафиксированных изменений.Либо фиксируйте, либо храните их раньше всего.

Затем создайте временную ветвь или тег, указывающий на фиксацию E.Если что-то пойдет не так, вы можете использовать его (с проверкой и полным сбросом), чтобы восстановить положение branch1 и начать все сначала.После достижения желаемого результата вы можете удалить ветку или тег.

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

# Make branch `branch2` point to commit `E`
git checkout branch2
git rebase branch1
# Move `branch1` onto its desired destination (2 commits behind its current position)
git checkout branch1
git reset --hard HEAD~2
# Get back to branch2
git checkout branch2
# Rebase its most recent 2 commits (D and E) on top of B
git rebase --onto HEAD~3 HEAD~2

В качестве альтернативы вы можете перефразировать последнюю команду как git rebase --onto branch1~1 branch1.

Перемещает коммиты, которые достижимы из текущей ветви (branch2, которая указывает на коммит E), но недоступны из ветви branch1 поверх коммита branch1~1 (родительский элемент branch1).Таким образом, строка истории, которая начинается с branch1 (кроме branch1), перемещается как родной элемент branch1 (или везде, где говорится в аргументе --onto).

Прочитайте документация git rebase для получения дополнительной информации о том, как git rebase работает.

0 голосов
/ 08 июня 2018

Это как раз и есть цель rebase --onto: вы можете перебазировать ветку поверх любого коммита.Основной синтаксис:

git rebase --onto new_base old_base branch

В вашем случае вам нужно сначала переместиться branch2 на branch1:

git checkout branch2
git reset --hard branch1

Затем переместить branch2 на вершину B:

git rebase --onto B C branch2

После этого вы должны переместиться branch1 обратно на C:

git checkout branch1
git reset --hard C

Подробный пример:

Командная строкааргумент --onto может быть передан git rebase.В режиме git rebase --onto команда расширяется до:

git rebase --onto  

Команда --onto позволяет использовать более мощную форму или перебазирование, позволяющее передавать определенные ссылки в качестве подсказок для перебазировки.

Допустим, у нас есть пример репо с филиалами вроде:

o---o---o---o---o master
                 \
                  o---o---o---o---o featureA
                   \
                    o---o---o featureB

featureB основан на featureA, однако мы понимаем, что featureB не зависит ни от каких изменений в функции Aи может быть просто разветвленным master.

git rebase --onto master featureA featureB

featureA является <oldbase>.master становится <newbase>, а featureB является ссылкой на то, на что HEAD из <newbase> будет указывать.Затем получаются следующие результаты:

                  o---o---o featureB
                 /
o---o---o---o---o master
                 \
                  o---o---o---o---o featureA

(из Atlassian Git Tutorial , поиск по --onto)

0 голосов
/ 08 июня 2018

Вы можете использовать интерактивную перебазирование: git checkout branch1 git rebase branch2 -i HEAD~2

Источник: https://git -scm.com / book / en / v2 / Git-Tools-Rewriting-History

Затем коммиты будут в нужном вам порядке.Если вы хотите переместить ветви к своей цели, вы должны заставить их (git branch -f {branch-name} {postition})

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...