Как изменить прошлый коммит, чтобы включить пропущенный файл?

Я совершил изменение и забыл добавить файл в набор изменений. После других коммитов я понял, что файл отсутствует в транзакции HEAD^4.

Как переписать предыдущую фиксацию для включения отсутствующего файла?

Ответ 1

Используйте git rebase --interactive HEAD~4 и установите параметр edit для фиксации, которую вы хотите изменить.

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

Ответ 2

Я понимаю, что люди могут 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!

Ответ 3

Если вы НЕ нажали эти 4 фиксации, вы можете сделать это следующим образом:

Создайте файлы патчей для всех этих коммитов:

git format-patch -4

Верните назад 4 фиксации:

git reset --hard HEAD~4

Добавить отсутствующий файл:

git add missing-file

Зафиксируйте его с помощью --amend:

git commit --amend

Применить все сохраненные исправления назад:

git am *.patch

Если вы нажали, вы НЕ должны использовать этот метод. Вместо этого просто признайте свою ошибку и создайте еще одну фиксацию поверх HEAD, которая исправляет эту проблему.

Ответ 4

Хотя принятый ответ верен, ему не хватает подробных инструкций о том, как выполнить редактирование фиксации во время процесса переадресации.

  • Сначала запустите процесс переадресации:

    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 и нажимаете их снова, вашим сотрудникам придется повторно объединить их работу, и все будет беспорядочно, когда вы попытайтесь вернуть свою работу в свою.

    [...]