Как я могу объединить два коммита в один, если я уже начал ребаз?

Чисто и просто JSfiddle

Это будет полезно, если вы хотите, чтобы событие вызывалось косвенно из div или кнопки.









1096
задан JGallardo 14 June 2018 в 18:21
поделиться

2 ответа

Резюме

Сообщение об ошибке

Невозможно «сжать» без предыдущей фиксации

означает, что вы, вероятно, пытались «сжать вниз». Git всегда сжимает более новую фиксацию в более старую фиксацию или «вверх», как показано в интерактивном списке задач перебазирования, то есть в фиксацию в предыдущей строке. Изменение команды в самой первой строке вашего списка дел на squash всегда будет приводить к этой ошибке, поскольку для первого коммита нет ничего, что можно было бы сжать.

Исправление

Сначала вернитесь к тому месту, где вы начали с

$ git rebase --abort

Допустим, ваша история -

$ git log --pretty=oneline
a931ac7c808e2471b22b5bd20f0cad046b1c5d0d c
b76d157d507e819d7511132bdb5a80dd421d854f b
df239176e1a2ffac927d8b496ea00d5488481db5 a

То есть сначала была фиксация a, затем b и, наконец, c. После фиксации c мы решаем сжать b и c вместе:

(Примечание: запуск git log направляет его вывод на пейджер, less по умолчанию на большинстве платформ. Чтобы выйти из пейджер и вернитесь в командную строку, нажмите клавишу q .)

Выполнение git rebase --interactive HEAD ~ 2 дает вам редактор с

pick b76d157 b
pick a931ac7 c

# Rebase df23917..a931ac7 onto df23917
#
# 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
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

(обратите внимание, что это Список задач находится в обратном порядке по сравнению с выводом git log .)

Изменение параметра b pick на squash приведет к ошибке, которую вы видели, но если вместо этого вы превратите c в b (более новая фиксация в более старой или «сдавливание вверх») на изменив список задач на

pick   b76d157 b
squash a931ac7 c

и сохранив при выходе из редактора, вы получите другой редактор с содержимым

# This is a combination of 2 commits.
# The first commit's message is:

b

# This is the 2nd commit message:

c

. Когда вы сохраняете и выходите, содержимое отредактированного файла становится сообщением фиксации новой комбинированной фиксации:

$ git log --pretty=oneline
18fd73d3ce748f2a58d1b566c03dd9dafe0b6b4f b and c
df239176e1a2ffac927d8b496ea00d5488481db5 a

Примечание о перезаписи истории

Интерактивная перебазировка перезаписывает историю. Попытка нажать на удаленный компьютер, который содержит старую историю, потерпит неудачу, потому что это не перемотка вперед.

Если ветка, которую вы перебазировали, является веткой темы или функции , в которой вы работаете самостоятельно , ничего страшного. Для переноса в другой репозиторий потребуется опция - force , или же вы можете, в зависимости от разрешений удаленного репозитория, сначала удалить старую ветку, а затем отправить обновленную версию. Примеры тех команд, которые потенциально могут разрушить работу, выходят за рамки этого ответа.

Переписывание уже опубликованной истории в ветке, в которой вы работаете с другими людьми, без очень уважительной причины, такой как утечка пароля или других конфиденциальных данных, заставляет работать ваших сотрудников и является антиобщественным и будет раздражать других Разработчики. Раздел «Восстановление из исходной базы» в документации git rebase объясняет с дополнительным акцентом.

Перебазирование (или любая другая форма переписывания) ветки, над которой работали другие, - плохая идея: любой, кто находится ниже по течению, вынужден вручную исправлять свою историю. В этом разделе объясняется, как исправить это с точки зрения нижестоящих. Настоящее исправление, однако, состоит в том, чтобы в первую очередь избежать перебазирования восходящего потока.

1688
ответ дан 19 December 2019 в 20:16
поделиться

вы можете отменить rebase с помощью

git rebase --abort

и когда вы снова запустите интерактивную команду rebase, 'squash; commit must be below the pick commit in the list

22
ответ дан 19 December 2019 в 20:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: