Как копировать коммиты из одной ветви в другую?

У меня есть две ветви от моего мастера:

  • П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

пример рабочего процесса :

enter image description here

можно использовать 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>