Я разветвил ветку из репозитория в GitHub и совершил что-то конкретное для меня. Теперь я обнаружил, что оригинальный репозиторий имеет хорошую функцию, которая была в HEAD
.
Я хочу объединить его только без предыдущих коммитов. Что мне делать? Я знаю, как объединить все коммиты:
git branch -b a-good-feature
git pull repository master
git checkout master
git merge a-good-feature
git commit -a
git push
Ответы:
'
git cherry-pick
' должен быть ваш ответ здесь.Не забудьте прочитать ответ bdonlan о последствиях выбора вишни в этом посте:
«Вытащить все коммиты из ветви, переместить указанные коммиты в другую» , где:
будет выглядеть так:
источник
Вы можете использовать git cherry-pick, чтобы применить отдельный коммит к вашей текущей ветке.
Пример:
git cherry-pick d42c389f
источник
git cherry-pick d42c
илиgit cherry-pick d42c3
будет работать. Git умный ;)d42c389f
. Может быть, OP не заботился о создании слияния как такового, но разница иногда имеет значение.Давайте попробуем взять пример и понять:
У меня есть ветвь, скажем master , указывающая на X <commit-id>, и у меня есть новая ветвь, указывающая на Y <sha1>.
Где Y <commit-id> = <master> ветка коммитов - несколько коммитов
Теперь скажите, что для ветви Y я должен закрыть пробелы в коммитах между веткой master и новой веткой. Ниже приведена процедура, которой мы можем следовать:
Шаг 1:
где local это название филиала. Любое имя может быть дано.
Шаг 2:
Объедините коммиты из главной ветви в новую ветвь, а также создайте коммит с сообщением журнала с однострочными описаниями из не более <n> фактических коммитов, которые объединяются.
Для получения дополнительной информации и параметров о слиянии Git, пожалуйста, обратитесь к:
Также, если вам нужно объединить конкретный коммит, вы можете использовать:
источник
Y
в своем 3-м предложении? «У меня есть новая ветвь, указывающая на Y» против «Теперь скажем для ветки Y», звучит так, как будто Y когда-то был коммитом, а затем стал веткойВ моем случае использования у нас была аналогичная потребность в CI CD. Мы использовали git flow с ветками Develop и Master. Разработчики могут объединять изменения непосредственно для разработки или с помощью запроса извлечения из функциональной ветви. Однако для мастеринга мы автоматически объединяем только стабильные коммиты из ветки разработки через Jenkins.
В этом случае выбор вишни - не лучший вариант. Однако мы создаем локальную ветвь из commit-id, затем объединяем эту локальную ветвь с master и выполняем mvn clean verify (мы используем maven). В случае успеха выпустите артефакт рабочей версии на нексус, используя плагин релиза maven с опцией localCheckout = true и pushChanges = false. Наконец, когда все будет успешно, нажмите изменения и отметьте источник.
Пример кода:
Предполагая, что вы на мастере, если все сделано вручную. Однако на jenkins, когда вы оформляете репо, вы будете в ветке по умолчанию (master, если настроен).
Это даст вам полный контроль с бесстрашным адом слияния или конфликта.
Не стесняйтесь советовать в случае, если есть какой-либо лучший вариант.
источник
Ведущие ответы описывают, как применить изменения от конкретного коммита к текущей ветви. Если это то, что вы подразумеваете под «как объединить», тогда просто используйте cherry-pick, как они предлагают.
Но если вы действительно хотите слияние , то есть вы хотите новый коммит с двумя родителями - существующий коммит в текущей ветке и коммит, из которого вы хотите применить изменения - тогда вишневый выбор этого не сделает.
Наличие истинной истории слияния может быть желательным, например, если ваш процесс сборки использует преимущество git-предков для автоматической установки строк версий на основе последнего тега (using
git describe
).Вместо cherry-pick вы можете сделать фактический
git merge --no-commit
, а затем вручную настроить индекс, чтобы удалить любые изменения, которые вам не нужны.Предположим, вы находитесь на ветке
A
и хотите объединить коммит в конце веткиB
:Теперь вы настроены на создание коммита с двумя родителями, с текущим коммитом коммитов
A
иB
. Однако к вам может быть применено больше изменений, чем вы хотите, в том числе от предыдущих коммитов в ветке B. Вам нужно отменить эти нежелательные изменения, а затем зафиксировать.(Там может быть простой способ установить состояние рабочего каталога и индекса обратно, как это было до слияния, так что у вас есть чистый лист, на котором можно выбрать коммит, который вы хотели в первую очередь. Но Я не знаю, как добиться этого с чистого листа.
git checkout HEAD
Иgit reset HEAD
оба уберут состояние слияния, нанося поражение цели этого метода.)Так что вручную отмените нежелательные изменения. Например, вы могли бы
за каждый нежелательный коммит
012ea56
.Когда вы закончите настройку, создайте свой коммит:
Теперь у вас есть только то изменение, которое вы хотели, и дерево предков показывает, что вы технически слились с B.
источник