Нажмите коммит в двух ветках с помощью Git

как мне отправить коммит в две ветки?

Я не могу использовать «git push», потому что тогда он нажимает на три ветки, и я просто хочу, чтобы коммит был в двух из них.

Я пробовал «git merge HEAD --commit id из ветки A--» в ветке B, но затем он берет все из ветки A и объединяется с веткой B. Мне просто нужен последний коммит, а не все остальное, объединенное с веткой B.

Кто-нибудь знает, что делать?


person Madoc    schedule 26.10.2010    source источник
comment
В следующий раз сделайте коммит в другой ветке, начиная с общего предка веток A и B. Таким образом, вы сможете объединить его в обе и не получить дубликаты коммитов в истории.   -  person Cascabel    schedule 26.10.2010


Ответы (2)


Короткий ответ

Вы можете применить уже существующую фиксацию к другой ветке, используя cherry-pick , а затем нажмите обе ветки с помощью git push origin branchA branchB.


Почему размещение коммита в двух ветках может быть полезным

Предположим, у вас есть репозиторий с такой структурой:

A--B--C--D  ← master ← HEAD
      \--E  ← v1-release

После некоторой разработки (коммиты A, B, C) проект был выпущен и создана ветка v1-release (чтобы v1 можно было поддерживать с исправлениями, а следующую версию можно было разработать в master). Коммит E использовался для указания информации о версии (добавлены примечания к выпуску и т. д.). Commit D представил новую функцию, которая запланирована на следующую версию и не должна появиться в v1-release.

Теперь, если обнаружена ошибка в v1-release, ее необходимо исправить в обеих ветках, чтобы пользователи могли продолжать использовать v1 и она не появлялась в следующей версии.

После исправления ошибки в master репозиторий должен выглядеть так:

A--B--C--D--F  ← master ← HEAD
      \--E     ← v1-release

Теперь коммит F с исправлением должен быть применен к ветке v1-release.

Как это сделать на самом деле

Коммиты не могут быть точно скопированы (поскольку коммит — это состояние, сохраненное в каталоге), но вы можете применить изменения, сделанные в коммите, к другому коммиту.

Команда cherry-pick делает именно это. Он применяет изменения, сделанные указанным коммитом, к текущей ветке, создавая новый коммит:

git checkout v1-release
git cherry-pick F

После этого репозиторий должен выглядеть так:

A--B--C--D--F  ← master
      \--E--G  ← v1-release ← HEAD

Коммит G вносит те же изменения, что и F.

Возможно, вам придется разрешать конфликты (точно так же, как после слияния).

Сообщение об ошибке

Предыдущий выбор вишен теперь был пуст...

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

В случае ошибок или конфликтов выбор вишни можно прервать с помощью git cherry-pick --abort.

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

git checkout master
git push origin master v1-release

Окончательная структура репозитория:

A--B--C--D--F  ← master ← HEAD
      \--E--G  ← v1-release
person max    schedule 26.10.2010
comment
Как насчет отправки локальной ветки в две удаленные ветки? Есть ли короткий способ сделать это? - person roign; 18.05.2015
comment
Пример для команды cherry-pick был бы полезен для иллюстрации использования в контексте и избавления от необходимости переваривать страницу документации. Некоторые из нас не могут RTFM так же легко, как другие .. :) - person geotheory; 08.09.2015

Попробуй это:

git push origin <commitId>:<brancnName_1>
git push origin <commitId>:<brancnName_2>

Это работает на моей стороне.

person dakangz    schedule 27.12.2016
comment
Это странно, я сделал это, и мой коммит исчез из всех журналов. Я вижу это только в git reflow - person Rolf; 16.10.2017