Вы можете запустить git rebase --interactive
и изменить порядок D до B и раздавить D в A.
Git откроет редактор, и вы увидите такой файл, например: git rebase --interactive HEAD~4
pick aaaaaaa Commit A
pick bbbbbbb Commit B
pick ccccccc Commit C
pick ddddddd Commit D
# Rebase aaaaaaa..ddddddd onto 1234567 (4 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
Теперь вы меняете файл так, как он выглядит:
pick aaaaaaa Commit A
squash ddddddd Commit D
pick bbbbbbb Commit B
pick ccccccc Commit C
И теперь git объединит изменения A и D в один коммит, а затем поместит B и C. Если вы не хотите сохранять сообщение фиксации D, вместо этого squash
вы должны использовать fixup
ключевое слово. Для получения дополнительной информации fixup
вы можете обратиться к git rebase
документации или проверить этот вопрос, который имеет несколько хороших ответов.
There is no tracking information for the current branch
ошибку при перебазировании. В этом случае вам нужно указать количество коммитов, с которыми вы хотите работать, например:git rebase -i HEAD~4
. Смотрите этот ответ .Примечание: вы должны не каким-либо образом изменять коммиты, которые были переданы другому репо, если вы не знаете последствий .
git log --oneline -4
git rebase --interactive
Тип
i
(Переведите VIM в режим вставки)Измените список так, чтобы он выглядел следующим образом (вам не нужно удалять или включать сообщение фиксации). Не опечатка
squash
! :Введите Escзатем
ZZ
(Сохранить и выйти из VIM)Тип
i
Измените текст так, как вы хотите, чтобы выглядело новое сообщение о коммите. Я рекомендую это описание изменений в коммите
A
иD
:Введите Escтогда
ZZ
git log --oneline -4
git show E
Вы создали новый коммит
E
. КоммитыA
иD
больше не в вашей истории, но не ушли. Вы все еще можете восстановить их в этот момент и на некоторое времяgit rebase --hard D
(git rebase --hard
уничтожит все локальные изменения! ).источник
Для тех, кто использует SourceTree :
Убедитесь, что вы еще не выдвинули коммиты.
Squash with previous
источник
Интерактивная перебазировка работает хорошо, пока у вас не будет большой ветки функций с 20-30 коммитами и / или парой слияний от мастера или / и исправления конфликтов, пока вы коммитили в своей ветке. Даже при нахождении моих фиксаций через историю и замену
pick
сsquash
не работали здесь. Поэтому я искал другой путь и нашел эту статью . Я сделал свои изменения, чтобы работать над этим на отдельной ветке:До этого я получил свой запрос на получение с ~ 30 коммитами с 2-3 слияниями от master + исправление конфликтов. И после этого я получил четкий пиар с одним коммитом.
PS вот скрипт bash для этого в автомоде.
источник
$ git checkout master
$ git log --oneline
$ git rebase --onto HEAD ^^^ HEAD ^
$ git log --oneline
источник
--oneline
? И похоже, что вы бросили,C
аB
это не то, что намеревался ОП.git show A
), и D, C и B были потеряны в моем ref-log. Пришлосьgit rebase D
вернуться.