Как я могу сжать диапазон git коммитов вместе с учетом начального и конечного SHA

У меня есть ветка с около 20 коммитов.

Первый SHA на ветке bc3c488...
Последний SHA на ветке 2c2be6...

Как я могу объединить все коммиты вместе?

Я хочу сделать это без использования интерактивной перебазировки, поскольку существует так много коммитов.

Мне нужно это для GitHub Pull Request, где меня просят объединить мои коммиты.

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

3 ответа

Если кулак SHA является HEAD, вы также можете использовать этот подход:

git reset --soft $OLD_SHA; git add -A; git commit --amend --no-edit

будьте осторожны, эта команда изменит историю репо.

Если вы хотите сдавить коммиты, которые находятся в середине вашей истории:

|---* --- 0 --- 1 ---- 2 --- 3 --- * --- * --- * --- HEAD

как в этом случае совершает 1, 2 и 3

Я очень рекомендую использовать rebase -i

Интерактивный ребазинг может помочь здесь.

Допустим, ваша ветка основана на основной ветке вашего апстрима. (и скажем, ваш восходящий поток определяется удаленным "восходящим")

Сделай это:

git rebase -i upstream/master

"upstream / master" может быть заменен любым SHA, если вам нужно быть более точным.

    git rebase -i bc3c488

Вы будете помещены в редактор, определенный вашей переменной среды $EDITOR. Измените "pick" на "squash" (или "s" для краткости) для каждой строки, кроме самой верхней. Это сводит все эти коммиты в один.

Как и в случае любого слияния или перебазирования по другой линии работы, существует вероятность конфликта кода. Если это происходит, выполните "git status", чтобы увидеть, какие файлы конфликтуют, отредактируйте эти файлы (конфликт будет ограничен символами <<< и >>>) и выполните "git rebase --continue"

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

Затем вам будет предоставлена ​​возможность редактировать сообщение коммита для вашего нового сдавленного коммита.

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

Это довольно хороший учебник по интерактивному перебазированию: https://www.atlassian.com/git/tutorials/rewriting-history/git-rebase-i

Первый SHA на ветке - это bc3c488...
Последний SHA на ветке - 2c2be6...

# non dangerous implementation that creates a new branch.
git checkout 2c2be6
git rebase -i bc3c488~
git checkout -b your_new_squashed_branch
# then squash the commits by replacing the pick with s

Тильда (~) в конце коммита означает предыдущий коммит;
Обеспечение коммита bc3c488 отображается в интерактивном ребазе.

# dangerous implementation that rewrites history
git checkout -b new_branch_with_rewritten_history
git reset --hard 2c2be6
git rebase -i bc3c488~
# then squash the commits by replacing the pick with s

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

git rebase -i bc3c488...

затем измените коммиты, которые вы хотите раздавить, чтобы сказать сквош вместо выбора

оформить заказ https://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one/

Другие вопросы по тегам