Я зафиксировал изменение и забыл добавить файл в набор изменений. После других коммитов я понял, что файл теперь отсутствует в HEAD^4
коммите.
Как мне переписать предыдущую фиксацию, чтобы включить отсутствующий файл?
Я зафиксировал изменение и забыл добавить файл в набор изменений. После других коммитов я понял, что файл теперь отсутствует в HEAD^4
коммите.
Как мне переписать предыдущую фиксацию, чтобы включить отсутствующий файл?
Ответы:
Используйте git rebase --interactive HEAD~4
и установите edit
параметр для коммита, который вы хотите изменить.
Помните, что вам не следует изменять коммиты, отправленные таким образом в удаленный репозиторий. В этом случае лучше добавить новый коммит с отсутствующим файлом.
git push -f
если бы я был уверен, что восходящий поток не изменился?
add
отредактировал недостающие файлы, поэтому я сделал коммит, указав в сообщении «xxx». Затем я выполнил команду rebase и изменил фиксацию «xxx» с «pick» на «edit». Затем я сделал "git rebase --continue". Теперь, когда я смотрю на историю, у меня есть «xxx» как последняя фиксация, а предыдущая фиксация, в которую я хотел их добавить, не изменилась! Интересно, где была моя ошибка?
Я понимаю, что люди могут гуглить и приходить сюда, чтобы найти более простой ответ: что, если бы это была последняя фиксация? (Вопрос 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
будет храниться то же сообщение фиксации.
Очень просто!
--amend
имеют разные хэши
HEAD^4
. Это нормально, просто в качестве дополнения для справки. ;)
Если вы НЕ нажимали эти 4 коммита, вы можете сделать это следующим образом:
Создайте файлы патчей для всех этих коммитов:
git format-patch -4
Перемотка назад на 4 коммита:
git reset --hard HEAD~4
Добавить отсутствующий файл:
git add missing-file
Зафиксируйте это с помощью --amend
:
git commit --amend
Применить все сохраненные патчи обратно:
git am *.patch
Если вы нажали, вам НЕ следует использовать этот метод. Вместо этого просто признайте свою ошибку и создайте еще один коммит поверх HEAD, который исправит эту проблему.
git format-patch
/ git am
намного лучше. Самое главное, это дает вам больше уверенности, если вы что-то напортачите - фиксация, сохраненная как патч в физическом файле, - ваша лучшая подстраховка.
git gc
:)
rm *.patch
)
Хотя принятый ответ правильный, в нем отсутствуют подробные инструкции о том, как выполнить редактирование фиксации во время процесса перебазирования.
Сначала запустите процесс перебазирования:
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
во время перебазирования внести поправки в эти изменения (т. е. изменения, сохраненные перед запуском процесса перебазирования) на фиксацию, помеченную какedit
если что-то пошло не так, и вы хотите отменить изменения, сделанные во время процесса перебазирования до его завершения (т. е. вы хотите вернуться к точке до начала перебазирования), используйте git rebase --abort
- также прочтите: Как отменить интерактивное перебазирование, если --abort не ' т работать?
Как сказано в принятом ответе:
Помните, что вам не следует изменять коммиты, отправленные таким образом в удаленный репозиторий. В этом случае лучше добавить новый коммит с отсутствующим файлом.
Ответ «почему» находится в Git Book (абзац, озаглавленный « Опасности повторного базирования »):
Не перемещайте коммиты, существующие вне вашего репозитория.
Если вы будете следовать этому правилу, все будет в порядке. Если вы этого не сделаете, люди будут ненавидеть вас, а друзья и семья будут презирать вас.
Когда вы перемещаете материал, вы отказываетесь от существующих коммитов и создаете новые, похожие, но разные. Если вы куда-то отправляете коммиты, а другие снимают их и основывают работу на них, а затем вы переписываете эти коммиты с помощью git rebase и снова подталкиваете их, вашим соавторам придется повторно объединить свою работу, и все станет беспорядочно, когда вы попытаетесь перетащите их работу обратно в свою.
[...]