Дополнительно
Удалить файлы из Git commit
Я использую Git и совершил несколько файлов, используя
git commit -a
Позже я обнаружил, что файл был ошибочно добавлен в коммит.
Как я могу удалить файл из последнего коммита?
1468
25
Я думаю, что другие ответы здесь неверны, потому что это вопрос перемещения ошибочно совершенных файлов обратно в область подготовки из предыдущего коммита, без отмены внесенных в них изменений. Это можно сделать, как предложил Паритош Сингх:
или
Затем сбросьте ненужные файлы, чтобы исключить их из коммита:
Теперь зафиксируйте снова, вы даже можете повторно использовать то же сообщение коммита:
ВНИМАНИЕ ! Если вы хотите удалить только файл из предыдущего коммита и сохранить его на диске, прочитайте ответ Джазлина чуть выше.
Если это ваш последний коммит, и вы хотите полностью удалить файл из локального и удаленного репозитория , вы можете:
git rm < file >
git commit --amend
Флаг изменения говорит git, чтобы он снова совершил, но «слияние» (не в смысле слияния двух ветвей) этого коммита с последним коммитом.
Как указано в комментариях, использование
git rm
здесь похоже на использование самой командыrm
!Все существующие ответы говорят об удалении нежелательных файлов из коммита last .
Если вы хотите удалить ненужные файлы из старого коммита (даже нажатого) и не хотите создавать новый коммит, который не нужен из-за действия:
Найдите коммит, которому вы хотите, чтобы файл соответствовал.
Вы можете сделать это несколько раз, если хотите удалить много файлов.
Найдите commit_id коммита , в который файлы были добавлены по ошибке , скажем, «35c23c2» здесь
Эта команда открывает редактор в соответствии с вашими настройками. По умолчанию используется vim.
Переместите последний коммит, который должен быть «удалить ненужные файлы», в следующую строку неправильного коммита («35c23c2» в нашем случае) и установите команду как «fixup»:
Вы должны быть хороши после сохранения файла.
Чтобы закончить:
Если у вас, к сожалению, возникают конфликты, вы должны решать их вручную.
Как показывает принятый ответ, вы можете сделать это, сбросив весь коммит. Но это довольно тяжелый подход. Более чистый способ сделать это - сохранить коммит и просто удалить измененные файлы из него.
Git reset
возьмет файл, как это было в предыдущем коммите, и помещает его в индекс. Файл в рабочем каталоге не тронут. Затемgit commit
зафиксирует и раздавит индекс в текущий коммит.По сути, это берет версию файла, которая была в предыдущем коммите, и добавляет ее к текущему коммиту. Это не приводит к чистым изменениям, и поэтому файл эффективно удаляется из коммита.
Если вы не выдвинули изменения на сервере, вы можете использовать
Он сбросит все изменения и вернется к одному коммиту обратно
Если вы выдвинули свои изменения, выполните шаги в соответствии с ответом @CharlesB
Удаление файла с помощью rm удалит его!
Вы всегда добавляете коммит в git, а не удаляете, поэтому в этом случае возвращайте файл в состояние, в котором он находился до первого коммита (это может быть действие удаления 'rm', если файл новый), а затем повторно совершить и файл пойдет.
Чтобы вернуть файл в предыдущее состояние:
или вернуть его в состояние на удаленном HEAD:
затем измените коммит, и вы обнаружите, что файл исчез из списка (и не удален с вашего диска!)
Следующее отклеит только файл, который вы намеревались, и это то, что попросил OP.
Вы увидите что-то вроде следующего...
На этом этапе вы можете делать все, что захотите с файлом, например, переустанавливаться на другую версию.
Когда вы будете готовы совершить:
или (если у вас есть другие изменения, которые вы еще не хотите совершать)
Я объясню вам пример. Пусть A, B, C будут 3 последовательными коммитами. Commit B содержит файл, который не должен был быть совершен.
Если вы случайно добавили файл в свой коммит, вы можете сделать что-то вроде
Обязательно используйте
- cached
, иначе ваш файл также будет удален из вашего проекта.оставит вам локальный файл еще. Если вы не хотите, чтобы файл был локальным, вы можете пропустить опцию --cached.
Если вся работа находится в вашей локальной ветке, вам нужно сохранить файл в более позднем коммите, и, как и в случае с чистой историей, я думаю, что более простой способ сделать это может быть:
и затем вы можете легко завершить ребазу, не запоминая более сложные команды, не фиксируя сообщения и не печатая их.
Использование git GUI может упростить удаление файла из предыдущего коммита.
Предполагая, что это не общая ветка, и вы не возражаете против переписывания истории, тогда запустите:
Вы можете снять флажок с файла, который был ошибочно совершен, а затем нажать «Команда».
введите описание изображения здесь! Файл удален из коммита, но будет сохранен на диске . Поэтому, если вы не проверили файл после его неправильного добавления, он будет отображаться в вашем списке не отслеживаемых файлов (и если вы не проверили файл после его ошибочного изменения, он будет отображаться в ваших изменениях, не подготовленных для списка коммитов).
Если вы хотите сохранить свой коммит (возможно, вы уже потратили некоторое время на написание подробного сообщения о коммите и не хотите его терять), и вы хотите удалить только файл из коммита, но не из хранилища полностью:
Просто хотел дополнить главный ответ, так как мне пришлось выполнить дополнительную команду:
Выполните последовательность из следующих команд:
Что-то, что сработало для меня, но все же думаю, что должно быть лучшее решение:
Просто оставьте изменения, которые вы хотите отменить в другом коммите, проверьте других
git reset --soft HEAD ^
возвращает ваш коммит, и когда вы вводитеgit status
, он говорит вам, что делать:На самом деле, я думаю, что более быстрый и простой способ - использовать интерактивный режим git rebase.
(или голова ~ 4, как далеко ты хочешь пойти)
и затем вместо «выбрать» используйте «править». Я не осознавал, насколько силен «править».
https://www.youtube.com/watch?v = 2dQosJaLN18
Надеюсь, вы найдете это полезным.
Была та же проблема, когда у меня были изменения в локальной ветке, где я хотел вернуть только один файл. Что сработало для меня, так это -
( feature / target_branch ниже - это место, где у меня есть все мои изменения, включая те, которые я хотел отменить для определенного файла) *
( origin / feature / target_branch - это удаленная ветка, в которую я хочу внести свои изменения) *
( feature / staging - это моя временная постановочная ветка, в которой я буду настаивать на всех моих необходимых изменениях, исключая изменение в этом файле) *
Создайте локальную ветку из моего origin / feature / target_branch - называется feature / staging
Объединил мою рабочую локальную ветку feature / target_branch с веткой feature / staging
Проверено feature / staging затем git reset --soft ORIG_HEAD (Теперь все изменения в функции / постановке будут организованы, но не зафиксированы.)
Не удалось зарегистрировать файл, который я ранее зарегистрировал, с ненужными изменениями
Изменен восходящий филиал для feature / staging в origin / feature / target_branch
Совершил остальные поэтапные изменения и подтолкнул вверх по течению к моему удаленному origin / feature / target_branch
Если вам больше не нужен этот файл, вы можете это сделать