Как мне `git rebase -i` и предотвратить вас попросили изменить самый последний коммит, но это сделало бы его пустым.?

Я хочу запустить git rebase -i some-hash.

Когда я запускаю его, я получаю сообщение об ошибке:

Вы попросили изменить самый последний коммит, но это сделало бы его пустым. Вы можете повторить свою команду с помощью --allow-empty или полностью удалить фиксацию с помощью "git reset HEAD^".
[...]
Не удалось применить [...]

Эта ошибка кажется характерной для одной фиксации, поскольку --allow-empty не является вариантом, который я могу передать для перебазирования.

По-видимому, --keep-empty - это вариант, который я могу передать git rebase, но, похоже, это не решает проблему.

Как я могу перебазировать и сказать git, не беспокойтесь, если фиксация в перебазировании не будет иметь никакого эффекта?


person z5h    schedule 02.06.2016    source источник
comment
Я не перебазирую ни одного коммита.   -  person z5h    schedule 03.06.2016


Ответы (4)


Похоже на бег:

git commit --allow-empty
git rebase --continue

Создает 2 сжатых коммита вместо одного. Запуск git rebase -i some-hash позволяет мне объединить 2 новых коммита в один.

person z5h    schedule 02.06.2016
comment
Спасибо. Это меня очень сблизило. В итоге я получил один дополнительный коммит после выполнения перебазирования, созданный на этом первом шаге. Но выполнение еще одной перебазировки, чтобы раздавить это, было успешным. Подход @Yar может быть проще: используйте rebase, чтобы отредактировать последний из коммитов, которые нужно раздавить, затем используйте git reset HEAD^, чтобы раздавить любые дополнительные коммиты, затем продолжите --continue. - person Ted; 21.04.2018

Если вы не выполняете ребазинг одного коммита и сталкиваетесь с одной и той же проблемой, причина в том, что конечным результатом вашего ребазинга является пустой коммит.

Предполагая, что вы не хотите совершать пустую фиксацию, скажем, у вас есть эти две фиксации:

commit 1
commit 2

И вы получаете сообщение об ошибке, когда хотите объединить эти два коммита (скажем, git rebase -i HEAD~2), исправление состоит в том, чтобы сбросить эти два коммита, выполнив следующую команду два раза:

git reset HEAD^
person Yar    schedule 15.02.2018

Я обнаружил, что самым простым решением было просто интерактивно перебазировать (git rebase -i {some head}), а затем удалить коммиты, которые вызывали проблемы (с d на экране перебазирования).

Если вы знаете, что коммиты являются прямыми зеркалами друг друга (удаление их приведет к пустой фиксации), и попытка раздавить с помощью перебазирования не работает, тогда просто удаление самих коммитов работает.

Как бы болезненно это ни звучало, вы все равно возитесь с историей, так что это помогает очиститься.

person scallaway    schedule 09.01.2020

Сообщение об ошибке1 немного вводит в заблуждение, поскольку git rebase сама по себе не поддерживает --allow-empty. Поэтому нам нужна еще одна команда, которая делает это. Мы могли бы сделать еще один коммит (например, @z5h), но тогда у вас все еще есть два коммита, которые нужно исправить/убрать.

Решение на самом деле довольно простое:

git commit --amend --allow-empty
git rebase --continue

Это прекрасно предотвращает создание другого коммита и напрямую приводит к пустому коммиту.


1 Вы попросили изменить самую последнюю фиксацию, но это сделало бы
ее пустой. Вы можете повторить команду с --allow-empty или можете
полностью удалить фиксацию с помощью "git reset HEAD^".
[курсив мой]

person stk    schedule 13.09.2019