Как скопировать коммиты из одной ветки в другую?
-
21-09-2019 - |
Вопрос
У меня есть две ветви от моего хозяина:
- версия 2.1:(версия 2) Я работал над ней в течение нескольких месяцев
- ВСИВО:который я создал вчера, чтобы добавить одну конкретную функцию в мой мастер (в процессе производства)
Есть ли способ скопировать вчерашние коммиты из wss в версию v2.1?
Решение
У вас действительно должен быть рабочий процесс, который позволяет вам делать все это путем слияния:
- x - x - x (v2) - x - x - x (v2.1)
\
x - x - x (wss)
Так что все, что вам нужно сделать, это git checkout v2.1
и git merge wss
.Если по какой-то причине вы действительно не можете этого сделать, и вы не можете использовать перебазирование git чтобы переместить вашу ветку wss в нужное место, команда для захвата одного коммита откуда-либо и применения его в другом месте такова git вишневый сбор.Просто проверьте ветку, к которой вы хотите ее применить, и запустите 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
и вместо этого выберите их, щелкнув правой кнопкой мыши по записи фиксации там.
Если вы хотите перейти на более автоматический режим (со всеми его опасностями) и предположить, что все коммиты со вчерашнего дня произошли в wss, вы могли бы сгенерировать список коммитов, используя git log
с (--pretty
предложенный Джефроми)
git log --reverse --since=yesterday --pretty=%H
итак, все вместе, предполагая, что вы используете bash
for commit in $(git log --reverse --since=yesterday --pretty=%H);
do
git cherry-pick $commit
done
Если здесь что-то пойдет не так (есть большой потенциал), у вас возникнут проблемы, поскольку это работает при живом оформлении заказа, так что либо выбирайте варианты вручную, либо используйте перебазирование, как предлагает Джефроми.
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 или --редактировать :С помощью этой опции git cherry-pick позволит вам отредактировать сообщение о фиксации перед фиксацией.
-n или --no-фиксировать :Обычно команда автоматически создает последовательность коммитов.Этот флаг применяет изменения, необходимые для выделения каждого именованного коммита в вашем рабочем дереве и индексе, без выполнения какой-либо фиксации.Кроме того, когда используется этот параметр, ваш индекс не обязательно должен совпадать с фиксацией HEAD.Выбор вишни производится в зависимости от начального состояния вашего индекса.
Здесь интересный Статья относительно cherry-pick
.
Ты мог бы создайте патч из коммитов, которые вы хотите скопировать, и нанесите пластырь в целевую ветку.
Или, если вы немного меньше на стороне евангелиста, вы можете поступить немного уродливым способом, который я использую.В deploy_template есть коммиты, которые я хочу скопировать на свой мастер при развертывании ветки
git branch deploy deploy_template
git checkout deploy
git rebase master
Это создаст новую ветвь deploy (я использую -f для перезаписи существующей ветви deploy) на deploy_template, затем переназначит эту новую ветвь на master, оставив deploy_template нетронутым.
В простом случае простого копирования последнего коммита из branch wss в версию v2.1 вы можете просто получить идентификатор коммита (git log --oneline | head -n 1
) и делать:
git checkout v2.1
git merge <commit>