Поиск…
замечания
Что подавляет?
Скриптинг - это процесс принятия нескольких коммитов и объединения их в единую транзакцию, включающую все изменения от начальных коммитов.
Скручивающие и удаленные ветви
Обратите особое внимание, когда раздавливание фиксируется на ветке, которая отслеживает удаленную ветку; если вы раздавите коммит, который уже был перенесен в удаленную ветвь, две ветви будут разнесены, и вам придется использовать git push -f
чтобы принудительно изменить эти изменения на удаленной ветке. Имейте в виду, что это может вызвать проблемы для других, отслеживающих эту удаленную ветвь , поэтому следует проявлять осторожность, когда раздача принудительного нажатия коммитируется в общедоступные или общие репозитории.
Если проект размещен на GitHub, вы можете включить «принудительную защиту» на некоторых ветвях, например, master
, добавив его в Settings
- Branches
- Protected Branches
.
Сквош Последние фиксации без ресайзинга
Если вы хотите, чтобы предыдущие x
записывались в один, вы можете использовать следующие команды:
git reset --soft HEAD~x
git commit
Замените x
числом предыдущих коммитов, которые вы хотите включить в сжатый коммит.
Имейте в виду, что это создаст новый коммит, по сути забывая информацию о предыдущих x
коммитах, включая их автора, сообщение и дату. Вероятно, вы захотите сначала скопировать-вставить существующее сообщение фиксации.
Скрининг завершается во время перезагрузки
Записи могут быть раздавлены во время git rebase
. Рекомендуется, чтобы вы поняли, что нужно переустановить, прежде чем пытаться выполнить сквош.
Определите, какую фиксацию вы хотите переустановить, и обратите внимание на хеш-код фиксации.
Запустить
git rebase -i [commit hash]
.Кроме того, вы можете набрать
HEAD~4
вместо хэша commit, чтобы просмотреть последнюю фиксацию и еще 4 фиксации до последней.В редакторе, который открывается при запуске этой команды, определите, какие коммиты вы хотите сквозировать. Замените
pick
в начале этих строкsquash
чтобы сквоить их в предыдущую фиксацию.Выбрав, какие коммиты вы хотите раздавить, вам будет предложено написать сообщение фиксации.
Logging Commits, чтобы определить, где переустанавливать
> git log --oneline
612f2f7 This commit should not be squashed
d84b05d This commit should be squashed
ac60234 Yet another commit
36d15de Rebase from here
17692d1 Did some more stuff
e647334 Another Commit
2e30df6 Initial commit
> git rebase -i 36d15de
На данный момент появляется ваш редактор по выбору, где вы можете описать, что вы хотите делать с фиксациями. Git предоставляет помощь в комментариях. Если вы оставите это как есть, ничего не произойдет, потому что каждая фиксация будет сохранена, и их порядок будет таким же, как и до переустановки. В этом примере мы применяем следующие команды:
pick ac60234 Yet another commit
squash d84b05d This commit should be squashed
pick 612f2f7 This commit should not be squashed
# Rebase 36d15de..612f2f7 onto 36d15de (3 command(s))
#
# 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's log message
# x, exec = run command (the rest of the line) using shell
#
# 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 log после записи сообщения о фиксации
> git log --oneline
77393eb This commit should not be squashed
e090a8c Yet another commit
36d15de Rebase from here
17692d1 Did some more stuff
e647334 Another Commit
2e30df6 Initial commit
Autosquash: код, который вы хотите раздавить во время переустановки
Учитывая следующую историю, представьте, что вы вносили изменения, которые вы хотите раздавить в commit bbb2222 A second commit
:
$ git log --oneline --decorate
ccc3333 (HEAD -> master) A third commit
bbb2222 A second commit
aaa1111 A first commit
9999999 Initial commit
После того, как вы внесли свои изменения, вы можете добавить их в индекс как обычно, а затем зафиксировать их с --fixup
аргумента --fixup
со ссылкой на фиксацию, которую вы хотите выполнить:
$ git add .
$ git commit --fixup bbb2222
[my-feature-branch ddd4444] fixup! A second commit
Это создаст новую фиксацию с сообщением фиксации, которое Git может распознать во время интерактивной переадресации:
$ git log --oneline --decorate
ddd4444 (HEAD -> master) fixup! A second commit
ccc3333 A third commit
bbb2222 A second commit
aaa1111 A first commit
9999999 Initial commit
Затем выполните интерактивную --autosquash
аргументом --autosquash
:
$ git rebase --autosquash --interactive HEAD~4
Git предложит вам раздавить фиксацию, которую вы сделали, с commit --fixup
в правильную позицию:
pick aaa1111 A first commit
pick bbb2222 A second commit
fixup ddd4444 fixup! A second commit
pick ccc3333 A third commit
Чтобы избежать необходимости вводить --autosquash
при каждой перестановке, вы можете включить эту опцию по умолчанию:
$ git config --global rebase.autosquash true
Сбой во время слияния
Вы можете использовать git merge --squash
чтобы вырезать изменения, введенные веткой, в единую фиксацию. Никакая фактическая фиксация не будет создана.
git merge --squash <branch>
git commit
Это более или менее эквивалентно использованию git reset
, но более удобно, когда внесенные изменения имеют символическое имя. Для сравнения:
git checkout <branch>
git reset --soft $(git merge-base master <branch>)
git commit
Автосохранение и исправления
При совершении изменений можно указать, что в будущем коммит будет передан другому фиксатору, и это можно сделать так,
git commit --squash=[commit hash of commit to which this commit will be squashed to]
Можно также использовать, --fixup=[commit hash]
альтернативно для исправления.
Также возможно использовать слова из сообщения фиксации вместо хеширования фиксации, например,
git commit --squash :/things
где будет использоваться последняя фиксация со словом «вещи».
Это сообщение 'fixup!'
начнется с 'fixup!'
или 'squash!'
за которым следует остальная часть сообщения фиксации, к которому будут переданы эти коммиты.
Когда перебазирования --autosquash
флаг должен использоваться для использования функции autosquash / FixUp.