Сквош и мастер слияния в одну ветвь

Есть ли способ сквоировать и объединить мастер в одну ветку? Эффективно принимать все ожидающие коммиты и помещать их в 1 фиксацию?

Моя первоначальная идея - это script, которая принимает my-branch и выполняет git checkout master && git pull && git checkout my-branch-squashed, а затем git merge --squash my-branch (справляется с любыми конфликтами слиянием), а затем, наконец, удаляет my-branch и переименовывает my-branch-squash в my-branch

Это кажется очень крутым и, возможно, плохим, поэтому я пытаюсь понять, есть ли другой способ. Цель, которую я пытаюсь решить, заключается в том, что когда я помещаю ветки на github, и они "раздавлены и объединены" в master, ветвь, существующая на локальной машине, не соответствует ветке, которая была объединена с master, поэтому при использовании git branch --merged ${1-master} | grep -v " ${1-master}$" | xargs -r git branch -d; он неправильно удаляет ветки, которые уже были объединены в master. То, что я хочу, - это способ автоматического удаления старых ветвей, которые были объединены в master

Ответы

Ответ 1

Вы можете сделать это с помощью git rebase и исправить коммиты, которые вы хотите объединить:

$ git rebase -i HEAD~5

pick c2e2c87 commit 1
f 689d474 commit 2
f aa9d9b4 commit 3
f 888a009 commit 4
f d396e75 commit 5

# Rebase 2f7f53e..d396e75 onto 2f7f53e (5 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

Вы можете использовать git rebase -i --root для переустановки с первого фиксации.

Ответ 2

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

Затем, процедура для раздачи его на master

git checkout master
git merge --squash feature

(замените master на integration или что-то еще).

Я бы использовал rebase -i для точного управления, но для этого простого случая мы можем использовать знание git вашей истории, чтобы автоматически определить последнего общего предка.

Ответ 3

Устранение проблем, связанных с рабочим процессом слияния-сквоша, которые уже были подробно обсуждены во многих местах, в свете рабочих процессов, часто выходящих из-под вашего контроля.

Существует метод, который вы можете использовать, и хотя он не эффективен на 100%, он имеет довольно хороший послужной список в моем опыте и всегда не в безопасности.

Без предков, на которые нужно положиться, вам нужно определить, совпадают ли два моментальных снимка. Вы можете использовать хэш деревьев коммитов с помощью этой команды:

git show --format="%T" <committish>

Чтобы проверить, можно ли удалить ветвь, сначала слейте мастер в свою ветку. Если в этом слиянии есть конфликт или возник конфликт в исходном сквоше, вы не сможете использовать этот метод (это эффективная часть менее 100%).

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

Это можно свести к команде для одиночного использования, которая может быть легко сглажена, например:

if [ $(git show --format="%T" origin/master) = $(git show --format="%T" HEAD) ]; then echo Merged; else echo Unmerged; fi

Или встроен в оболочку script, которая будет проходить через все ваши локальные ветки, объединять их, тестировать и удалять те, которые были объединены.

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

Ответ 4

Вы можете мягко reset для последнего фиксации, который вы хотите там, и повторно зафиксировать.

введите описание изображения здесь

введите описание изображения здесь