Как я могу перенести ряд изменений в другую ветку только с одним коммитом? - PullRequest
0 голосов
/ 20 октября 2019

У меня есть ветки, как показано ниже:

             L--M   <-- master
            /
...--A--B--C
            \
             D--E--F--G--H-I--J--K   <-- dev(HEAD)

Что я хочу сделать, это скопировать EFGHIJ для мастеринга с одним коммитом, как показано ниже:

             L--M--N   <-- master
            /
...--A--B--C
            \
             D--E--F--G--H-I--J--K   <-- dev(HEAD)

The N в случае изменения EFGHIJ.

Я могу использовать команду rebase --onto, чтобы перебазировать изменения в master

git rebase --onto master E~1 J

Если я использую git push, то существует EFGHIJ изменения в мастере. Возможно, мне нужно использовать команду git rebase -i , чтобы изменить их на единицу, но вопрос в том, что я не вижу историю изменений предыдущих изменений, примененных git rebase --onto!

Как я могу зафиксировать их только одним коммитом?

Ответы [ 2 ]

2 голосов
/ 20 октября 2019

После git rebase --onto master E~1 J Выполнить

git reset --soft M
git commit -m 'changes from E F G H I and J'

Готово!

1 голос
/ 20 октября 2019

Это возможно с помощью одной команды (rebase -i), но требует ручного вмешательства: вам нужно отредактировать список задач для ребаз:

git rebase -i --onto M E^ J
# then in vim: :2,$s/^pick/fixup/
# save and close vim, voilà

Если вам требуется определенный / другой коммитсообщение, измените pick в первой строке на reword и введите свое сообщение соответственно.


Откуда исходит требование для одной команды? Позвольте мне подумать немного больше, это может быть возможно с комбинацией diff + apply (но опять же, у вас есть канал, и это на самом деле две команды)

EDIT: diff + apply работает, но вы тогданужна другая команда (commit), поэтому я думаю, что переход с rebase - самый простой и безопасный вариант. Ради полноты:

git checkout M
git diff E^ J | git apply
git commit -m 'Combination of commits E^..J'
...