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

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

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

90 голосов | спросил kolrie 17 Jam1000000amThu, 17 Jan 2013 02:34:19 +040013 2013, 02:34:19

4 ответа


0

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

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

ответил Rafał Rawicki 17 Jam1000000amThu, 17 Jan 2013 02:43:06 +040013 2013, 02:43:06
0

Я понимаю, что люди могут гуглить и приходить сюда, чтобы найти более простой ответ: Что, если это был последний коммит?  (Вопрос ОП - исправить 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!

ответил Dr Beco 16 J0000006Europe/Moscow 2016, 03:52:07
0

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

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

git format-patch -4

Перемотка назад на 4 коммита:

git reset --hard HEAD~4

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

git add missing-file

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

git commit --amend

Применить все сохраненные патчи обратно:

git am *.patch

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

ответил mvp 17 Jam1000000amThu, 17 Jan 2013 02:44:45 +040013 2013, 02:44:45
0

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

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

    git rebase --interactive HEAD~4
    
  • Будет представлен список коммитов, выберите коммит, который вы хотите отредактировать, изменив слово pick на edit и сохраните файл.

  • Внесите необходимые изменения в свой код (не забывайте вызывать git add для новых файлов)

  • После того, как все изменения сделаны, выполните git commit --amend - это изменит коммит, помеченный как edit

  • Вызовите git rebase --continue, который завершит процесс (если есть больше коммитов, помеченных как edit, вышеуказанные шаги необходимо повторить)

Важные примечания.

  • НЕ удаляйте строки, помеченные как pick, которые вы не хотите редактировать - оставьте их как есть. Удаление этих строк приведет к удалению связанных коммитов

  • GIT заставляет вас stash перед перезагрузкой, если ваш рабочий каталог не чист; однако вы можете git stash pop / git stash apply во время перебазирования, чтобы изменить эти изменения (т. е. изменения, спрятанные перед началом процесса перебазировки) на коммит, помеченный как ---- +: = 11 = + ----

  • если что-то пошло не так и вы хотите отменить изменения, внесенные в процессе перебазирования до его завершения (т. е. хотите вернуться к точке до начала перебазировки), используйте edit - также читайте: Как прервать интерактивное перебазирование, если --abort не работает?

  • Как сказано в принятом ответе:

      

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

    Ответ "почему" содержится в Git Book (пункт, озаглавленный « Опасность перебазирования »):

      

    Не перебазируйте коммиты, которые существуют за пределами вашего хранилища.

         

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

         

    Когда вы перебазируете вещи, вы отказываетесь от существующих коммитов и создаете новые, похожие, но разные. Если вы куда-то толкаете коммиты, а другие сносят их и основывают на них работу, а затем переписываете эти коммиты с помощью git rebase и снова их подталкиваете, вашим соавторам придется заново объединять свою работу, и когда вы попытаетесь втяните их работу обратно в свою.

         

    [...]

ответил dominik 6 WedEurope/Moscow2017-12-06T00:20:07+03:00Europe/Moscow12bEurope/MoscowWed, 06 Dec 2017 00:20:07 +0300 2017, 00:20:07

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132