Я зафиксировал изменение и забыл добавить файл в набор изменений. После других коммитов я понял, что файл теперь отсутствует в HEAD^4
коммите.
Как мне переписать предыдущую фиксацию, чтобы включить отсутствующий файл?
git
git-commit
Колри
источник
источник
Ответы:
Используйте
git rebase --interactive HEAD~4
и установитеedit
параметр для коммита, который вы хотите изменить.Помните, что вам не следует изменять коммиты, отправленные таким образом в удаленный репозиторий. В этом случае лучше добавить новый коммит с отсутствующим файлом.
источник
git push -f
если бы я был уверен, что восходящий поток не изменился?add
отредактировал недостающие файлы, поэтому я сделал коммит, указав в сообщении «xxx». Затем я выполнил команду rebase и изменил фиксацию «xxx» с «pick» на «edit». Затем я сделал "git rebase --continue". Теперь, когда я смотрю на историю, у меня есть «xxx» как последняя фиксация, а предыдущая фиксация, в которую я хотел их добавить, не изменилась! Интересно, где была моя ошибка?Я понимаю, что люди могут гуглить и приходить сюда, чтобы найти более простой ответ: что, если бы это была последняя фиксация? (Вопрос OP предназначен для исправления 4-го коммита в истории)
В случае , если вы совершали и понимаете , что вы забыли добавить файл сразу , просто сделать:
Где
--no-edit
будет храниться то же сообщение фиксации.Очень просто!
источник
--amend
имеют разные хэшиHEAD^4
. Это нормально, просто в качестве дополнения для справки. ;)Если вы НЕ нажимали эти 4 коммита, вы можете сделать это следующим образом:
Создайте файлы патчей для всех этих коммитов:
Перемотка назад на 4 коммита:
Добавить отсутствующий файл:
Зафиксируйте это с помощью
--amend
:Применить все сохраненные патчи обратно:
Если вы нажали, вам НЕ следует использовать этот метод. Вместо этого просто признайте свою ошибку и создайте еще один коммит поверх HEAD, который исправит эту проблему.
источник
git format-patch
/git am
намного лучше. Самое главное, это дает вам больше уверенности, если вы что-то напортачите - фиксация, сохраненная как патч в физическом файле, - ваша лучшая подстраховка.git gc
:)rm *.patch
)Хотя принятый ответ правильный, в нем отсутствуют подробные инструкции о том, как выполнить редактирование фиксации во время процесса перебазирования.
Сначала запустите процесс перебазирования:
Будет представлен список коммитов, выберите коммит, который вы хотите отредактировать, изменив слово
pick
наedit
и сохраните файл.Внесите необходимые изменения в свой код (не забудьте вызывать
git add
новые файлы)После внесения всех изменений, проблема
git commit --amend
- это изменит фиксацию, помеченную какedit
Вызов
git rebase --continue
, который завершит процесс (если отмечено больше коммитовedit
, указанные выше шаги необходимо повторить)Важные заметки:
НЕ удаляйте строки, отмеченные как те,
pick
которые вы не хотите редактировать - оставьте их как есть. Удаление этих строк приведет к удалению связанных коммитовGIT вынуждает вас выполнить
stash
перебазирование, если ваш рабочий каталог не чистый; однако вы можетеgit stash pop / git stash apply
во время перебазирования внести поправки в эти изменения (т. е. изменения, сохраненные перед запуском процесса перебазирования) на фиксацию, помеченную какedit
если что-то пошло не так, и вы хотите отменить изменения, сделанные во время процесса перебазирования до его завершения (т. е. вы хотите вернуться к точке до начала перебазирования), используйте
git rebase --abort
- также прочтите: Как отменить интерактивное перебазирование, если --abort не ' т работать?Как сказано в принятом ответе:
Ответ «почему» находится в Git Book (абзац, озаглавленный « Опасности повторного базирования »):
источник