ГИТ переместить один коммит из ветки мастер
какой самый простой способ достичь этого?
from:
--A--B
1--2--3
в:
--A--B--2
1--3
Я не могу придумать простой способ достичь этого (менее 5 шагов).
3 ответов
вы оставили ярлыки; давайте положим их обратно. Вот "до":
--A--B <-- master
\
1--2--3 <-- feature
а вот и "после". Я отмечу их галочкой (или" prime " или как вам угодно это называть), поскольку они будут копиями оригинальных коммитов с новыми и разными идентификаторами коммитов.
--A--B--2' <-- master
\
1'-3' <-- feature
это невозможно сделать за один шаг: требуется как минимум два.
Сначала мы должны переупорядочить 1--2--3
последовательности, так что 2
на первом месте. Простой способ вероятно, это интерактивная ребаза (в то время как на ветке feature
, используя команду git git rebase -i master
): просто изменить pick
заказать и перебазировать будет вишневый выбор 2, затем 1, затем 3 и переместить feature
метки:
--A--B <-- master
\
2'-1'-3' <-- feature
теперь нам нужно двигаться только master
метка для указания на фиксацию 2'
. Многие команды будут делать это, но самый простой-это git merge
проинструктировано сделать быстрое слияние (чтобы избежать ошибок):
git checkout master; git merge --ff-only feature~2
чтобы избежать проверки master
мы можем использовать git branch -f
а в VonC это (который появился, когда я редактировал этот), например:
git branch -f master feature~2
(в обоих случаях нам нужно назвать commit 2'
; С git branch
надо назвать ветку переходить, а с git merge
мы должны быть on ветка для перемещения).
просто для полноты, вот другой, но эквивалентный метод (с использованием четырех команд git). Сначала давайте заберемся на ветку master
:
git checkout master
теперь мы можем cherry-pick commit 2
, создав копию, 2'
:
git cherry-pick feature^ # or feature~1
которая производит этот график:
--A--B--2' <-- master
\
1--2--3 <-- feature
теперь мы можем перебазироваться feature
интерактивно на новый master
, отбрасывая commit 2
:
git checkout feature
git rebase -i master
изменить pick
строки для копирования 1 и 3 и опустить 2, как commit 2'
уже есть на master
.
главным образом:
--A--B (master)
\
1--2--3 (B)
git checkout B
git rebase -i master # reorder commits
--A--B (master)
\
2--1--3 (B)
git branch -f master 2
вы можете получить хэш фиксации от
git reflog
затем перейдите в master branch.
git checkout master
затем cherry выбирает релевантный commit
git cherry-pick <commit-hash>
фиксация будет применена к главной ветви, если нет конфликтов.