Как сквош фиксируется в 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. Я просто не могу получить эту работу здесь, но я знаю, что это работает, и я использовал ее много - в прошлом!