Как копировать коммиты из одной ветви в другую?
У меня есть две ветви от моего мастера:
- П2.1: (версия 2) я работаю в течение нескольких месяцев
- wss: что я создал вчера, чтобы добавить одну конкретную функцию к моему мастеру (в производстве)
есть ли способ скопировать вчерашние коммиты из wss в v2.1?
6 ответов
у вас действительно должен быть рабочий процесс, который позволяет вам делать все это путем слияния:
- x - x - x (v2) - x - x - x (v2.1)
\
x - x - x (wss)
так что все, что вам нужно сделать, это git checkout v2.1
и git merge wss
. Если по какой-то причине вы действительно не можете этого сделать, и вы не можете использовать git rebase чтобы переместить ветвь wss в нужное место, команда захватить одну фиксацию откуда-то и применить ее в другом месте git cherry-pick. Просто проверьте ветку, которую вы хотите применить, и запустите git cherry-pick <SHA of commit to cherry-pick>
.
некоторые из способы rebase может спасти вас:
если ваша история выглядит так:
- x - x - x (v2) - x - x - x (v2.1)
\
x - x - x (v2-only) - x - x - x (wss)
можно использовать git rebase --onto v2 v2-only wss
для перемещения wss непосредственно на v2:
- x - x - x (v2) - x - x - x (v2.1)
|\
| x - x - x (v2-only)
\
x - x - x (wss)
затем вы можете объединить! Если вы действительно, действительно, действительно не могу добраться до точки, где вы можете объединить, вы все еще можете использовать rebase эффективно сделать несколько вишневых кирки сразу:
# wss-starting-point is the SHA1/branch immediately before the first commit to rebase
git branch wss-to-rebase wss
git rebase --onto v2.1 wss-starting-point wss-to-rebase
git checkout v2.1
git merge wss-to-rebase
Примечание: причина того, что для этого требуется дополнительная работа, заключается в том, что он создает дублировать фиксации в вашем репозитории. Это не очень хорошо - весь смысл легкого ветвления и слияния заключается в том, чтобы иметь возможность делать все, делая фиксацию(фиксации) в одном месте и объединяя их там, где они нужны. Повторяющиеся коммиты означают намерение никогда не объединять эти две ветви (если вы решите, что хотите позже, вы получите конфликты).
использовать
git cherry-pick <commit>
применить <commit>
на текущая филиала.
Я сам, вероятно, перепроверил бы коммиты, которые я выбираю в gitk
и вишневый выбрать их с правой кнопкой мыши на записи фиксации там вместо этого.
если вы хотите пойти более автоматическим (со всеми его опасностями) и предполагая, что все коммиты со вчерашнего дня произошли на wss, вы можете создать список коммитов, используя git log
С (--pretty
предложено Jefromi)
git log --reverse --since=yesterday --pretty=%H
так что все вместе, предполагая, что вы используете bash
for commit in $(git log --reverse --since=yesterday --pretty=%H);
do
git cherry-pick $commit
done
если что-то пойдет не так здесь (есть много потенциала), вы находитесь в беде, так как это работает на живой проверки, так что либо сделать ручные вишневые кирки или использовать rebase, как предложил Jefromi.
вы можете создать патч из коммитов, которые вы хотите скопировать и применить патч к ветви назначения.
git cherry-pick
: применить изменения, внесенные некоторыми существующими фиксациями
Предположим, у нас есть филиал A С (X, Y, Z) фиксациями. Нам нужно добавить эти коммиты в ветку B. Мы собираемся использовать cherry-pick
операции.
при использовании cherry-pick
, мы должны добавить коммиты на ветке Bв том же хронологическом порядке, что нарушает появляются в филиал A.
cherry-pick поддерживает ряд коммитов, но если у вас есть коммиты слияния в этом диапазоне, это становится очень сложным
git checkout B
git cherry-pick SHA-COMMIT-X
git cherry-pick SHA-COMMIT-Y
git cherry-pick SHA-COMMIT-Z
пример рабочего процесса :
можно использовать cherry-pick
С опции
- e или -- edit : С помощью этой опции git cherry-pick позволит вам редактировать сообщение фиксации до фиксации.
- n или --no-commit: обычно команда автоматически создает последовательность коммитов. Этот флаг применяет изменения, необходимые для выбора каждого именованного фиксации к вашему рабочему дереву и индексу, без фиксации. Кроме того, при использовании этой опции ваш индекс не должен совпадать с фиксацией HEAD. Выбор вишни выполняется против начального состояния вашего индекса.
здесь интересно статьи о cherry-pick
.
или если вы немного меньше на стороне евангелиста, вы можете сделать немного уродливый способ, который я использую. В deploy_template есть коммиты, которые я хочу скопировать на мой мастер как ветвь deploy
git branch deploy deploy_template
git checkout deploy
git rebase master
это создаст новую ветвь deploy (я использую-f для перезаписи существующей ветви deploy) на deploy_template, а затем перебазирует эту новую ветвь на master, оставив deploy_template нетронутой.
для простого случая простого копирования последней фиксации из ветви wss в v2.1, Вы можете просто захватить идентификатор фиксации (git log --oneline | head -n 1
) и делать:
git checkout v2.1
git merge <commit>