ГИТ переместить один коммит из ветки мастер

какой самый простой способ достичь этого?

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>

фиксация будет применена к главной ветви, если нет конфликтов.