ГИТ переместить один коммит из ветки мастер
какой самый простой способ достичь этого?
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>
фиксация будет применена к главной ветви, если нет конфликтов.