Я совершил изменение и забыл добавить файл в набор изменений. После других коммитов я понял, что файл отсутствует в транзакции HEAD^4
.
Как переписать предыдущую фиксацию для включения отсутствующего файла?
Я совершил изменение и забыл добавить файл в набор изменений. После других коммитов я понял, что файл отсутствует в транзакции HEAD^4
.
Как переписать предыдущую фиксацию для включения отсутствующего файла?
Используйте git rebase --interactive HEAD~4
и установите параметр edit
для фиксации, которую вы хотите изменить.
Помните, что вы не должны изменять коммитты, перенаправленные в удаленный репозиторий таким образом. Лучше добавить новый коммит с отсутствующим файлом в этом случае.
Я понимаю, что люди могут google и приходят сюда, чтобы найти более простой ответ: Что делать, если это была последняя фиксация? (Вопрос OP предназначен для фиксации 4-го фиксации в истории)
В случае, когда вы совершаете и понимаете, что забыли добавить какой-либо файл немедленно, просто выполните:
# edited file-that-i-remember.txt
git add file-that-i-remember.txt
git commit
# realize you forgot a file
git add file-that-i-forgot.txt
git commit --amend --no-edit
Где --no-edit
будет сохранять одно и то же сообщение фиксации.
Легкий peasy!
Если вы НЕ нажали эти 4 фиксации, вы можете сделать это следующим образом:
Создайте файлы патчей для всех этих коммитов:
git format-patch -4
Верните назад 4 фиксации:
git reset --hard HEAD~4
Добавить отсутствующий файл:
git add missing-file
Зафиксируйте его с помощью --amend
:
git commit --amend
Применить все сохраненные исправления назад:
git am *.patch
Если вы нажали, вы НЕ должны использовать этот метод. Вместо этого просто признайте свою ошибку и создайте еще одну фиксацию поверх HEAD, которая исправляет эту проблему.
Хотя принятый ответ верен, ему не хватает подробных инструкций о том, как выполнить редактирование фиксации во время процесса переадресации.
Сначала запустите процесс переадресации:
git rebase --interactive HEAD~4
Будет представлен список коммитов, выберите фиксацию, которую вы хотите изменить, изменив слово pick
на edit
и сохраните файл.
Внесите необходимые изменения в свой код (не забудьте вызвать git add
для новых файлов)
После того, как все изменения будут выполнены, введите git commit --ammend
- это приведет к сбою фиксации, помеченной как edit
Вызов git rebase --continue
, который завершит процесс (если есть больше коммитов, отмеченных как edit
, вышеуказанные шаги необходимо повторить)
Важные замечания:
НЕ удаляйте строки, помеченные как pick
, которые вы не хотите редактировать, оставьте их как есть. Удаление этих строк приведет к удалению связанных коммитов
GIT заставляет вас stash
перед перезагрузкой, если ваш рабочий каталог не является чистым, однако вы можете git stash pop / git stash apply
во время переустановки, чтобы изменить эти изменения (т.е. изменения, спрятанные перед запуском процесса переадресации), до фиксация, отмеченная как edit
если что-то пошло не так, и вы хотите вернуть изменения, сделанные во время процесса восстановления до его завершения (т.е. вы хотите вернуться к точке перед запуском rebase), используйте git rebase --abort
- также читайте: Как прервать интерактивную rebase, если --abort не работает?
Как сказано в принятом ответе:
Помните, что вы не должны изменять транзакции, перенаправленные в удаленный репозиторий. Лучше добавить новый коммит с отсутствующим файлом в этом случае.
Ответ, почему находится в GIT Book (пункт под названием "Опасности для ребоксинга" ):
Не перегружать коммиты, существующие за пределами вашего репозитория.
Если вы будете следовать этому руководству, вы будете в порядке. Если вы этого не сделаете, люди будут вас ненавидеть, и вас будут презирать друзья и семья.
Когда вы перегружаете вещи, вы отказываетесь от существующих коммитов и создаете новые, похожие, но разные. Если вы нажимаете фиксации где-то, а другие вытаскивают их и работают над ними, а затем вы переписываете эти коммиты с помощью git rebase и нажимаете их снова, вашим сотрудникам придется повторно объединить их работу, и все будет беспорядочно, когда вы попытайтесь вернуть свою работу в свою.
[...]