Git - Рекурсивное объединение мастера со всеми ветвями функций без проверки каждой ветви функций - PullRequest
0 голосов
/ 07 июня 2019

если у меня рабочее пространство выглядит так:

oliver-koo-C02WC0EJHTDG:foo oliver.koo$ git log --all --decorate --oneline --graph
* f528ce3 (HEAD -> master) someone else made a change
| * 447855b (feature1.2) feature 1.2
| | * f3e4d2f (feature-1.1) create feature 1.1
| |/  
| * b04c5c6 (feature-1) create feature 1 core
|/  
* 06a8ddb (origin/master, origin/HEAD) Update stuff

и родительская ветвь каждой ветки трека, например:

oliver-koo-C02WC0EJHTDG:foo oliver.koo$ git branch -vv
  feature-1   b04c5c6 [master: ahead 1, behind 1] create feature 1 core
  feature-1.1 f3e4d2f [feature-1: ahead 1] create feature 1.1
  feature1.2  447855b [feature-1: ahead 1] feature 1.2
* master      f528ce3 [origin/master: ahead 1] someone else made a change

существует ли способ (или даже возможен) рекурсивное объединение мастера со всеми дочерними ветвями без проверки каждой дочерней ветви и выполнения git merge master?


Примечание:

  1. Этот ответ предложить использовать git fetch . master:feature-x не будет работать, так как это слияние без ускоренной перемотки
oliver-koo-C02WC0EJHTDG:foo oliver.koo$ git fetch . master:feature-x
From .
 ! [rejected]        master          -> feature-x  (non-fast-forward)
  1. Я знаю, достичь аналогичного результата с ребазом без проверки (git rebase master feature-x). но я хочу использовать слияние.

  2. Я думал об альтернативе, используя git cherry-pick A^..B, но опять же можно ли применить выбранные вишни коммиты к ветви, не проверяя ее?

1 Ответ

1 голос
/ 07 июня 2019

Если вы имеете в виду «без проверки всех файлов в каждой ветке», то да.Merge необходимо изучить потенциальные конфликты и, возможно, придется оставить их для изучения / исправления, поэтому для этого нужно рабочее дерево, но вам не нужно проверять все файлы, вы можете просто настроить индекс иHEAD и оставьте рабочее дерево пустым.

Это означает, что вы можете сделать слияние очень дешево в клоне tmpfs.

rm -rf ${scratchmerge=`mktemp -d`}
git clone -nsb branch1 $scratchmerge  # minimal clone, <1MB even for the linux repo
cd $_
git reset -q
git merge master
fix any conflicts and commit if needed
git push
cd -

Опция -n позволяет клону не выполнятьизвлечение, то есть рабочее дерево остается пустым (и индекс не читается), опция -s заставляет клона совместно использовать объектный источник db, который является именно тем, что вы хотите для такой работы, как эта, и -b опция устанавливает HEAD, проверенная ветка.В общем, этот клон использует всего несколько десятков килобайт (для ссылок клона плюс эшафот репо).

git reset -q загружает индекс из фиксации HEAD, вы можете эквивалентно git read-tree HEADздесь и для сценария, который был бы более педантично правильным, это эквивалент команды ядра.

И оттуда это нормально: объединить, исправить конфликты, нажать.

...