Git объединить одну ветвь во всех других ветвях

Я знаю, что этот вопрос уже задавался здесь: qaru.site/info/17815/..., но я хотел бы видеть настоящий код, который делает это.

У меня есть ветвь мастера и множество ветвей для функций. Я бы хотел, чтобы все изменения, внесенные в master, отражались во всех ветвях признаков.

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

Ответ 1

Проблема в том, что мне нужно посмотреть, не будут ли опубликованы ветки, которые я хочу объединить.

Если они не опубликованы, вы должны их переустановить.
Но проверить, действительно ли перебаза действительно возможна, крошечный бит сложный:


Во-первых, после извлечения вы легко можете проверить если у вас еще есть локальные коммиты:

 git log origin/master..master

        o--o--o (origin/master)
       /
x--x--x--y--y   (master)

В этом случае вполне нормально переустанавливать, за исключением того, что master уже был перенесен в другую ветку из вашего репо.
Но вы также можете легко проверить это:

git branch -r --contains master

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

Но если удаленная ветвь сама была переустановлена ​​(и принудительно нажата), тогда вам нужно быть осторожным, как описано в разделе "Как вы относитесь к публичному репозиторию, который уже был переустановлен?":

        o--o--o (OLD origin/master)
       /
x--x--X--y--y   (master)
    \
     o'--o'--o' (origin/master, as seen after a 'git fetch')

Вслепую master в верхней части origin/master будет воспроизводиться commit X, который был опущен, когда origin/master был переустановлен. Нехорошо.

Сегодня (январь 2014 года) единственный способ справиться с этим делом - это:

  • создайте ветвь маркера tmp на origin/master,
  • git fetch,
  • проверьте, что git branch --contain tmp перечисляет origin/master (который был извлечен и, возможно, с другой историей, если он был переустановлен и принудительно нажат).

Завтра (git 1.9, Q1 2014) вам не нужно будет отмечать удаленную ветвь перед извлечением:

fork_point=$(git merge-base --fork-point origin/upstreamBranch yourBranch)
# return X
git rebase --onto origin/upstreamBranch $fork_point yourBranch

Повторить:

После a git fetch (после маркировки origin/master перед выборкой)

  • если git log origin/master..master возвращает фиксации из master, которые не являются частью origin/master (это означает, что локальные коммиты не были нажаты на origin/master)
  • И если git branch -r --contains master пуст (значение master не было нажато нигде, на любой удаленной ветки отслеживания вы можете увидеть через git fetch)

Тогда:

  • if origin/master включает ветвь маркера 'tmp' (значение origin/master не было переустановлено), вы можете git rebase origin/master master.
  • else: вы можете git rebase --onto origin/master $(git merge-base tmp master) master
    (вам нужно tmp здесь, чтобы переустановить только вашу ветку. Git 1.9 потребует ненужной ветки tmp)

В любых других случаях: merge origin/master до master.