Как скопировать коммиты из одной ветки в другую? - PullRequest
630 голосов
/ 19 марта 2010

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

  • v2.1 : (версия 2) Я работаю уже несколько месяцев
  • wss : я создал вчера, чтобы добавить одну особенность к своему мастеру (в производстве)

Есть ли способ скопировать вчерашние коммиты из wss в v2.1?

Ответы [ 6 ]

805 голосов
/ 19 марта 2010

Использование

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

Если здесь что-то пойдет не так (есть большой потенциал), у вас возникли проблемы, так как это работает на кассе в реальном времени, так что либо делайте ручные выборки вишни, либо используйте ребаз, как предложено Джефроми.

505 голосов
/ 19 марта 2010

У вас действительно должен быть рабочий процесс, который позволяет вам делать все это путем слияния:

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

Примечание: причина того, что для этого требуется дополнительная работа, заключается в том, что он создает дублирующие коммиты в вашем хранилище. Это на самом деле не очень хорошая вещь - весь смысл простого ветвления и объединения состоит в том, чтобы иметь возможность делать все, делая коммиты в одном месте и объединяя их там, где они нужны. Двойные коммиты означают намерение никогда не объединять эти две ветви (если вы решите, что захотите позже, вы получите конфликты).

47 голосов
/ 05 сентября 2018

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.

16 голосов
/ 19 марта 2010

Вы можете создать патч из коммитов, которые вы хотите скопировать, и применить патч к целевой ветви.

9 голосов
/ 15 декабря 2011

Или, если Вы немного меньше на стороне евангелиста, Вы можете сделать немного безобразно, как я использую. В deploy_template есть коммиты, которые я хочу скопировать на мой мастер в виде ветки deploy

git branch deploy deploy_template
git checkout deploy
git rebase master

Это создаст развертывание новой ветви (я использую -f для перезаписи существующей ветви развертывания) на deploy_template, а затем переназначу эту новую ветку на master, оставив deploy_template нетронутым.

1 голос
/ 27 августа 2018

В простом случае простого копирования последнего коммита из ветки wss в v2.1 вы можете просто получить идентификатор коммита (git log --oneline | head -n 1) и выполнить:

git checkout v2.1
git merge <commit>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...