Как сквош фиксируется в git после того, как они были нажаты?
Это дает хорошее объяснение раздачи нескольких коммитов:
http://git-scm.com/book/en/Git-Branching-Rebasing
но он не работает для коммитов, которые уже были нажаты. Как я могу скворовать последние несколько коммитов как в моем локальном, так и удаленном репозитории?
EDIT:. Когда я делаю git rebase -i origin/master~4 master
, сохраните первый как pick
, установите остальные три как squash
, а затем выйдите (через cx cc в emacs), я получу
$ git rebase -i origin/master~4 master
# Not currently on any branch.
nothing to commit (working directory clean)
Could not apply 2f40e2c... Revert "issue 4427: bpf device permission change option added"
$ git rebase -i origin/master~4 master
Interactive rebase already started
где 2f40 является фиксацией pick
. И теперь ни один из 4 коммитов не появляется в git log
. Я ожидал, что мой редактор будет перезагружен, чтобы я мог ввести сообщение фиксации. Что я делаю неправильно?
Ответы
Ответ 1
Сквош совершает локально с
git rebase -i origin/master~4 master
а затем принудительно нажмите
git push origin +master
Разница между --force
и +
Из документации git push
:
Обратите внимание, что --force
применяется ко всем ссылкам, которые выдвигаются, следовательно, используя это с push.default
установленным на matching
или с многократным нажатием пункты назначения, настроенные с помощью remote.*.push
, могут перезаписывать ссылки на другие чем текущая ветвь (включая локальные ссылки, которые строго позади их удаленный аналог). Чтобы форсировать толчок только к одной ветки, используйте +
перед refspec, чтобы нажать (например, git push origin +master
, чтобы заставить толчок к ветке master
).
Ответ 2
На ветке я смог сделать это так (для последних 4 коммитов)
git checkout my_branch
git reset --soft HEAD~4
git commit
git push --force origin my_branch
Ответ 3
Небольшая разница с принятым ответом, но у меня было много трудностей при раздавливании, и я наконец получил его.
$ git rebase -i HEAD~4
- На открывшемся интерактивном экране замените кирку на сквош
вверху для всех коммитов, которые вы хотите раздавить.
- Сохраните и закройте редактор через
esc --> :wq
Нажмите на пульт, используя:
$ git push origin branch-name --force
Ответ 4
Можно избежать многих проблем, только создав branch
для работы и не, работая над master
:
git checkout -b mybranch
Следующие работы для remote
завершаются, и смесь из remote
нажата commits/local
только фиксирует:
# example merging 4 commits
git checkout mybranch
git rebase -i mybranch~4 mybranch
# at the interactive screen
# choose fixup for commit: 2 / 3 / 4
git push -u origin +mybranch
У меня также есть вытащить примечания по запросу, которые могут быть полезны.
Ответ 5
git rebase -i master
вы получите редактор vm open и msgs что-то вроде этого
Pick 2994283490 commit msg1
f 7994283490 commit msg2
f 4654283490 commit msg3
f 5694283490 commit msg4
#Some message
#
#some more
Здесь я изменил выбор для всех остальных коммитов на "f" (Стенды для исправления).
git push -f origin feature/feature-branch-name-xyz
это зафиксирует все фиксации на один фиксатор и удалит все остальные коммиты.
Я сделал это, и это помогло мне.
Ответ 6
Когда вы работаете с Gitlab или Github, у вас могут возникнуть проблемы с этим. Вы раздавливаете свои коммиты одним из вышеуказанных методов. Мой любимый:
git rebase -i HEAD~4
or
git rebase -i origin/master
выберите сквош или фикс для своего коммита. На этом этапе вы должны проверить состояние git. И сообщение может быть:
On branch ABC-1916-remote
Your branch and 'origin/ABC-1916' have diverged,
and have 1 and 7 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
И ты можешь испытать это. НЕ ДЕЛАЙТЕ ЭТОГО, иначе вы окажетесь в той же ситуации, что и раньше.
Вместо этого нажмите на свое происхождение с помощью:
git push origin +ABC-1916-remote:ABC-1916
+ позволяет принудительно толкать только одну ветку.
Ответ 7
Для сдавливания двух коммитов, один из которых уже был помещен в одну ветку, работали следующие:
git rebase -i HEAD~2
[ pick older-commit ]
[ squash newest-commit ]
git push --force
По умолчанию это будет включать в себя сообщение о коммите самого нового коммита в качестве комментария к старому коммите.
Ответ 8
1) git rebase -i HEAD ~ 4
To elaborate: It works on the current branch; the HEAD~4 means squashing the latest four commits; interactive mode (-i)
2) В этот момент редактор со списком коммитов открыл, чтобы изменить второй и последующие коммиты, заменив pick на squash, а затем сохранив его.
вывод: успешно перебазирован и обновлен refs/heads/branch-name.
3) git push origin refs/возглавляет/название ветки --force
выход:
...
удаленный:
remote: чтобы создать запрос на слияние для имени ветки, посетите:
удаленный: http://xxx/sc/server/merge_requests/new?merge_request%5Bsource_branch%5D=sss
удаленный: для ip: sc/server.git
+ 84b4b60... 5045693 имя-ветки → имя-ветки (принудительное обновление)
Ответ 9
Там другой, лучший способ - но я не могу вспомнить детали (я делал это много, но это было по-другому). В основном вы используете rebase с флагом -force. Это заставляет Git восстановить все коммиты в вашей локальной ветки, даже если она обновлена. Затем вы можете сквозировать и нажимать --force. Я просто не могу получить эту работу здесь, но я знаю, что это работает, и я использовал ее много - в прошлом!