Как скопировать коммиты из одной ветки в другую?
У меня есть две ветви от моего хозяина:
П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>.некоторые из способы перебазирования могут спасти вас:
если ваша история выглядит так:
- 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и cherry-pick их с правой кнопкой мыши на записи фиксации там вместо этого.
если вы хотите пойти более автоматическим (со всеми его опасностями) и предполагая, что все коммиты со вчерашнего дня произошли на wss, вы можете создать список коммитов с помощью
git logС (--prettyпредложено Jefromi)git log --reverse --since=yesterday --pretty=%Hтак что все вместе, предполагая, что вы используете
bashfor 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это создаст новую ветвь развертывания (я использую-f для перезаписи существующей ветви развертывания) на deploy_template, а затем перебазирует эту новую ветвь на master, оставляя deploy_template нетронутым.
для простого случая простого копирования последней фиксации из ветви wss в v2. 1 Вы можете просто захватить идентификатор фиксации (
git log --oneline | head -n 1) и делать:git checkout v2.1 git merge <commit>

Comments