Я пытаюсь объединить 2 коммита в 1, поэтому я следовал «коммитам сдвига с ребазой» из git ready .
Я побежал
git rebase --interactive HEAD~2
В результирующем редакторе я изменяю pick
на squash
и затем сохраняю-выход, но перебазирование завершается неудачно с ошибкой
Не может "сквош" без предыдущего коммита
Теперь, когда дерево работы достигло этого состояния, у меня возникли проблемы с восстановлением.
Команда git rebase --interactive HEAD~2
не выполняется с:
Интерактивный ребаз уже начался
и git rebase --continue
терпит неудачу с
Не может "сквош" без предыдущего коммита
Ответы:
Резюме
Сообщение об ошибке
означает, что вы, вероятно, пытались «раздавить вниз». Git всегда вытесняет новый коммит в более старый коммит или «вверх», как это видно в интерактивном списке задач перебазирования, то есть в коммит в предыдущей строке. Изменение команды в самой первой строке списка задач на
squash
всегда будет приводить к этой ошибке, так как нет ничего для первого коммита, в который нужно попасть.Исправление
Сначала вернитесь туда, откуда вы начали
Скажи, что твоя история
То есть a был первым коммитом, затем b и, наконец, c. После совершения c мы решаем раздавить b и c вместе:
(Примечание. По умолчанию на большинстве платформ
git log
поток выводится в пейджерless
. Чтобы выйти из пейджера и вернуться в командную строку, нажмитеq
клавишу.)Запуск
git rebase --interactive HEAD~2
дает вам редактор с(Обратите внимание, что этот список задач находится в обратном порядке по сравнению с выводом
git log
.)Изменение b
pick
наsquash
приведет к появившейся ошибке, но если вместо этого вы сдавите c в b (новый коммит в более старый или «сдавить вверх»), изменив список задач наи сохранить выход из вашего редактора, вы получите другой редактор, содержимое которого
Когда вы сохраняете и выходите, содержимое отредактированного файла становится сообщением коммита нового комбинированного коммита:
Примечание о переписывании истории
Интерактивный ребаз переписывает историю. Попытка передать на удаленный компьютер, который содержит старую историю, потерпит неудачу, потому что это не перемотка вперед.
Если ветка, которую вы перебазировали, является темой или тематической веткой, в которой вы работаете самостоятельно , ничего страшного. Перенос в другое хранилище потребует
--force
опции, или, в качестве альтернативы, вы можете, в зависимости от разрешений удаленного хранилища, сначала удалить старую ветку, а затем нажать на перебазированную версию. Примеры тех команд, которые потенциально могут разрушить работу, выходят за рамки этого ответа.Переписывание уже опубликованной истории в ветке, в которой вы работаете с другими людьми без очень веских причин, таких как утечка пароля или других конфиденциальных данных, заставляет ваших коллег работать и антиобщественно и раздражает других разработчиков. Раздел «Восстановление из вышестоящей ребазы» в
git rebase
документации объясняется с дополнительным акцентом.источник
git log hashoftheoldcommit
и это сработало, но мне было любопытно увидетьgit log --graph
со всеми этими недостижимымиЕсли есть несколько коммитов, вы можете использовать,
git rebase -i
чтобы раздавить два коммита в один.Если вы хотите объединить только два коммита, и они являются «самыми последними двумя», следующие команды могут использоваться для объединения двух коммитов в один:
источник
git reset --soft HEAD~10
, где 10 - это количество коммитов, которые вы хотите объединить.HEAD
с помощьюgit reset --soft 47b5c5...
где47b5c5...
SHA1 ID коммита.Rebase: Вам это не нужно:
Более простой способ для наиболее частых сценариев.
В большинстве случаев:
На самом деле, если все, что вам нужно, это просто объединить несколько недавних коммитов в один, но не нужно
drop
,reword
и другие операции по перебазированиюВы можете просто сделать:
~n
это число фиксаций мягко снимите фиксации (т.е.~1
,~2
...)Затем используйте следующую команду, чтобы изменить сообщение фиксации.
который в значительной степени совпадает с длинным диапазоном
squash
и однимpick
.И это работает для n коммитов, а не только для двух коммитов, как указано выше.
источник
~n
это число фиксаций мягко оон зафиксированной (то есть~1
,~2
, ...)n
последние коммиты, аn
коммиты в середине? Могу ли я сделать это легко?git rebase -i
это то, что вам нужно дляsquash
работы. @chumakoffn
последним коммитам в одно, первое использованиеgit reset --soft @~m
, гдеm = n - 1
Сначала вы должны проверить, сколько коммитов у вас есть:
Есть два статуса:
Во-первых, есть только два коммита:
Например:
(В этом случае вы не можете использовать git rebase), вам нужно выполнить следующее.
Другое состоит в том, что существует более двух коммитов; Вы хотите объединить коммиты C и D.
Например:
(при этом условии вы можете использовать git rebase)
А потом использовать «сквош». Остальное очень просто. Если вы все еще не знаете, пожалуйста, прочитайте http://zerodie.github.io/blog/2012/01/19/git-rebase-i/
источник
git push -f origin master
может быть необходимо.Предполагая, что вы были в своей собственной ветке темы. Если вы хотите объединить последние 2 коммита в один и выглядеть как герой, разветвите коммит непосредственно перед тем, как вы сделали последние два коммита.
Затем сквош фиксирует другую ветку в этой новой ветке:
Это внесет изменения, но не совершит их. Так что просто передайте их, и все готово.
Теперь вы можете объединить эту новую ветку темы с вашей основной веткой.
источник
a
иc
требует , чтобы быть объединены вместе и сохранить ,b
как это.git checkout -b combine-last-two-commits "HEAD^2"
выполнить первую команду ( ) в git версии 2.17, я получаю сообщение об ошибке:fatal: 'HEAD^2' is not a commit and a branch 'combine-last-two-commits' cannot be created from it
Вы можете отменить ребаз с
и когда вы снова запускаете интерактивную команду rebase 'squash; коммит должен быть ниже пика коммита в списке
источник
Я часто использую git reset --mixed, чтобы вернуть базовую версию перед несколькими коммитами, которые вы хотите объединить, затем я делаю новый коммит, так что вы можете сделать свой коммит самым новым, убедившись, что ваша версия HEAD после того, как вы отправили на сервер.
Если я хочу объединить две коммиты в одну, сначала я использую:
«249cf9392da197573a17c8426c282» была третьей версией, также является вашей базовой версией до слияния, после чего я делаю новый коммит:
Это все, надежда - это другой путь для всех.
К вашему сведению, из
git reset --help
:источник
$ git rebase --abort
Запустите этот код в любое время, если вы хотите отменить git rebase
$ git rebase -i HEAD~2
Повторно применить последние два коммита. Приведенная выше команда откроет редактор кода
После: wq вы будете в активном режиме перебазирования
Примечание : вы получите другой редактор, если нет предупреждений / сообщений об ошибках, если есть ошибка или предупреждение, что другой редактор не будет отображаться, вы можете прервать выполнение,
$ git rebase --abort
если увидите ошибку или предупреждение, иначе просто продолжите работу$ git rebase --continue
Вы увидите ваше сообщение 2 коммита. Выберите одно или напишите свое собственное сообщение о коммите, сохраните и выйдите [: wq]
Примечание 2: Вам может потребоваться принудительно отправить ваши изменения в удаленное хранилище, если вы запустите команду rebase
$ git push -f
$ git push -f origin master
источник
git push -f origin/master
это то, что другие ответы отсутствуют. +1Поскольку я использую
git cherry-pick
почти все, для меня это естественно сделать даже здесь.Учитывая, что я
branchX
проверил, и на кончике есть два коммита, из которых я хочу создать один коммит, комбинирующий их контент, я делаю это:Если я хочу обновить
branchX
также (и я полагаю, что это недостаток этого метода), я также должен:источник
Если ваша основная ветка
git log
выглядит примерно так:и вы хотите объединить два верхних коммита, просто выполните следующие простые шаги:
git checkout 77df2a40e53136c7a2d58fd847372 -b merged-commits
git cherry-pick -n -x ac72a4308ba70cc42aace47509a5e
. (Разрешите конфликты, если они возникнут)git commit --amend
.Вот и все. Вы можете отправить эту объединенную версию в ветку "объединенные-коммиты", если хотите.
Кроме того, теперь вы можете отказаться от двух-двух коммитов в вашей основной ветке. Просто обновите вашу основную ветку как:
источник
Если вы хотите объединить два последних коммита и просто использовать сообщение более старого коммита, вы можете автоматизировать процесс, используя
expect
.Я предполагаю:
Я проверял с
git version 2.14.3 (Apple Git-98)
.источник
expect
не описан.expect
.