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

StackOverflow https://stackoverflow.com/questions/2474353

  •  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

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

enter image description here

Мы можем использовать 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top