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

У меня есть две ветки от моего хозяина:

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

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

Ответ 1

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

- 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

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

Ответ 2

Используйте

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

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

Ответ 3

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 или - -e dit: с помощью этой опции git cherry-pick позволит вам отредактировать сообщение о коммите перед его фиксацией.

-n или - -n o-commit: Обычно команда автоматически создает последовательность коммитов. Этот флаг применяет изменения, необходимые для выбора каждого именованного коммита, в ваше рабочее дерево и индекс без каких-либо коммитов. Кроме того, когда используется эта опция, ваш индекс не должен соответствовать фиксации HEAD. Выбор вишни выполняется против начального состояния вашего индекса.

Вот интересная статья, касающаяся cherry-pick.

Ответ 5

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

git branch deploy deploy_template
git checkout deploy
git rebase master

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

Ответ 6

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

git checkout v2.1
git merge <commit>