Я использую Git, и я зафиксировал несколько файлов, используя
git commit -a
Позже я обнаружил, что файл был ошибочно добавлен в коммит.
Как я могу удалить файл из последнего коммита?
git
git-commit
Лолли
источник
источник
git reset filepath
Ответы:
Я думаю, что другие ответы здесь неправильны, потому что это вопрос перемещения ошибочно зафиксированных файлов обратно в область подготовки из предыдущего коммита, без отмены внесенных в них изменений. Это можно сделать так, как предложил Паритош Сингх:
или
Затем сбросьте ненужные файлы, чтобы исключить их из коммита:
Теперь совершите коммит снова, вы даже можете повторно использовать то же самое сообщение коммита:
источник
git push
исправить его до репо, он будет жаловатьсяUpdates were rejected because the tip of your current branch is behind its remote counterpart.
. Если вы уверены, что хотите подтолкнуть их (например, это ваша вилка), то вы можете использовать-f
опцию для принудительного толчка, напримерgit push origin master -f
. (Не делайте этого сgit reset --soft HEAD^
моя самая распространенная операция отменыgit reset
но хотел, чтобы способ повлиять на существующий коммит "на месте". Я только что узнал оgit commit -C
. Так что для меня то, что я хочу, это ваш точный рецепт с еще одним шагом, «новый коммит снова» прописан какgit commit -C [hash of original HEAD commit from first step]
.ВНИМАНИЕ ! Если вы хотите только удалить файл из предыдущего коммита и сохранить его на диске , прочитайте ответ Джуззлина чуть выше.
Если это ваш последний коммит и вы хотите полностью удалить файл из вашего локального и удаленного репозитория , вы можете:
git rm <file>
git commit --amend
Флаг изменения указывает git выполнить коммит снова, но «объединить» (не в смысле слияния двух веток) этот коммит с последним коммитом.
Как указано в комментариях, использование
git rm
здесь похоже на использование самойrm
команды!источник
git rm --cached
для хранения файлов на дискеrm
git
rm
git commit --amend
все еще существует и может быть найдена, например, с помощьюgit reflog
. Так что это не так плохо, как предлагают другие комментарии.Все существующие ответы говорят об удалении ненужных файлов из последнего коммита.
Если вы хотите удалить ненужные файлы из старого коммита (даже отправленного) и не хотите создавать новый коммит, который не нужен из-за действия:
1.
Найдите коммит, которому вы хотите, чтобы файл соответствовал.
Вы можете сделать это несколько раз, если вы хотите удалить много файлов.
2.
3.
Найдите commit_id коммита, по которому файлы были добавлены по ошибке , скажем "35c23c2" здесь
Эта команда открывает редактор в соответствии с вашими настройками. По умолчанию используется vim.
Переместите последний коммит, который должен быть «удалить ненужные файлы», на следующую строку некорректного коммита (в нашем случае «35c23c2») и установите команду как
fixup
:Вы должны быть хороши после сохранения файла.
Заканчивать :
Если вы, к сожалению, получаете конфликты, вы должны решить их вручную.
источник
git rm --cached <file(s)>
.--fixup=35c23c2
вgit commit
команду. Это автоматически настроит коммит как исправление требуемого коммита, поэтому вам не нужно будет указывать его в ребазе. Кроме того, если добавить--autosquash
кgit rebase
команде, мерзавец будет автоматически перемещать вашу фиксацию в нужном месте, так что вам не нужно ничего делать в интерактивном перебазировании - просто сохранить результат (а это означает , что вам даже не нужно-i
флаг, хотя мне все равно нравится использовать его, чтобы убедиться, что все выглядит так, как я ожидаю).Как показывает принятый ответ, вы можете сделать это, сбросив весь коммит. Но это довольно тяжелый подход.
Более чистый способ сделать это - сохранить коммит и просто удалить из него измененные файлы.
Команда
git reset
примет файл, как это было в предыдущем коммите, и поместит его в индекс. Файл в рабочем каталоге остается нетронутым.Затем
git commit
будет зафиксировать и сжать индекс в текущий коммит.По сути, это берет версию файла, которая была в предыдущем коммите, и добавляет ее к текущему коммиту. Это не приводит к чистым изменениям, и поэтому файл эффективно удаляется из коммита.
источник
Если вы не отправили изменения на сервер, вы можете использовать
Это сбросит все изменения и вернется к одному коммиту обратно
Если вы отправили изменения, следуйте инструкциям @CharlesB.
источник
Удаление файла с помощью rm удалит его!
Вы всегда добавляете коммит в git, а не удаляете, поэтому в этом случае верните файл в состояние, в котором он находился до первого коммита (это может быть действие удаления 'rm', если файл новый), а затем повторно зафиксировать, и файл будет идти.
Чтобы вернуть файл в предыдущее состояние:
или вернуть его в состояние на удаленной ГОЛОВКЕ:
затем измените коммит, и вы обнаружите, что файл исчез из списка (и не удален с вашего диска!)
источник
источник
Следующее действие приведет к удалению только того файла, который вы намеревались, что и было задано OP.
Вы увидите что-то вроде следующего ...
На этом этапе вы можете делать с файлом все, что захотите, например, сбросить версию.
Когда вы будете готовы совершить:
или (если у вас есть другие изменения, которые вы не хотите совершать, пока)
источник
Я объясню вам с примером.
Пусть A, B, C - 3 последовательных коммита. Коммит B содержит файл, который не должен был быть зафиксирован.
источник
noop
наedit [A_commit_ID]
илиe [A_commit_ID]
Вы можете просто попробовать.
и создать новый коммит.
Тем не менее, есть потрясающее программное обеспечение "Gitkraken". что облегчает работу с git.
источник
git commit --amend
будет обновить удаление файла при последнем коммите; и после этого вы можете проверить, действительно ли он был удален с помощьюgit log -1 --stat
оставит вам локальный файл еще. Если вам также не нужен локальный файл, вы можете пропустить параметр --cached.
Если вся работа выполняется в вашей локальной ветке, вам нужно сохранить файл в последующем коммите, и, как при наличии чистой истории, я думаю, что более простой способ сделать это может быть:
и затем вы можете с легкостью завершить ребазинг, не запоминая более сложные команды, не фиксируя сообщение или не набирая столько текста.
источник
Использование git GUI может упростить удаление файла из предыдущего коммита.
Предполагая, что это не общая ветка, и вы не против переписать историю , запустите:
Вы можете отменить проверку файла, который был ошибочно зафиксирован, а затем нажать «Подтвердить».
Файл удаляется из коммита, но будет храниться на диске . Таким образом, если вы сняли галочку с файла после ошибочного добавления, он отобразится в вашем списке неотслеживаемых файлов (а если вы сняли галочку с файла после ошибочного изменения, он отобразится в ваших изменениях, не подготовленных для списка фиксации).
источник
sudo apt-get install git-gui
git rebase -i HEAD~4
а затем выполнил вашу команду, чтобы открыть редактор. Еще одно примечание: «Unstaging» можно найти в меню «Commit».git reset --soft HEAD^
(помня --soft arg), за которым следуетgit commit -c ORIG_HEAD
(вместо --amend, который все испортил).Если вы хотите сохранить свой коммит (возможно, вы уже потратили некоторое время на написание подробного сообщения о коммите и не хотите его потерять) и хотите удалить только файл из коммита, но не полностью из репозитория:
источник
Выполните последовательность следующих команд:
источник
Просто хотел дополнить верхний ответ, так как мне нужно было выполнить дополнительную команду:
Ура!
источник
Что-то, что сработало для меня, но все же думаю, что должно быть лучшее решение:
Просто оставьте изменения, которые вы хотите отменить, в другом коммите, проверьте другие
источник
git reset --soft HEAD^
откатывает ваш коммит, и когда вы печатаетеgit status
, он говорит вам, что делать:источник
На самом деле, я думаю, что более быстрый и простой способ - использовать интерактивный режим git rebase.
(или голова ~ 4, как далеко ты хочешь пойти)
а затем вместо «выбрать», используйте «редактировать». Я не понимал, насколько мощным является «редактирование».
https://www.youtube.com/watch?v=2dQosJaLN18
Надеюсь, вы найдете это полезным.
источник
Была такая же проблема, где у меня есть изменения в локальной ветке, где я хотел вернуть только один файл. То, что работало для меня, было -
( функция / target_branch ниже содержит все мои изменения, в том числе те, которые я хотел отменить для определенного файла)
( origin / feature / target_branch - это удаленная ветка, в которую я хочу отправить свои изменения)
( Feature / Staging - это моя временная промежуточная ветвь, в которую я буду выталкивать все мои разыскиваемые изменения, за исключением изменения в этом одном файле).
Создайте локальную ветку из моего источника / feature / target_branch - она называется feature / staging
Объединенной мой рабочий местное отделение функции / target_branch к функции / постановка филиала
Отмеченная функция / постановка, затем git reset --soft ORIG_HEAD (Теперь все изменения из функции / постановки 'будут поставлены, но не зафиксированы.)
Unstaged файл, который я ранее проверил с ненужными изменениями
Изменена ветвь вверх по течению для объекта / размещения на источник / функция / target_branch
Подтвердил остальные поэтапные изменения и отправил вверх по течению к моему удаленному источнику / feature / target_branch
источник
Если вам больше не нужен этот файл, вы можете сделать
источник
Если вы используете GitHub и еще не отправили коммит, GitHub Desktop легко решает эту проблему:
источник
Если вы хотите удалить файлы из предыдущих коммитов, используйте фильтры
Если вы видите эту ошибку:
Невозможно создать новую резервную копию. Предыдущая резервная копия уже существует в refs / original / Force для перезаписи резервной копии с -f
Просто удалите резервные копии в вашем локальном репо
источник
если вы еще не добавили свои изменения в git
Это сбросит все изменения и вернется к одному коммиту обратно
Если это последний сделанный вами коммит и вы хотите удалить файл из локального и удаленного репозитория, попробуйте это:
или даже лучше:
сбросить в первую очередь
сбросить ненужный файл
совершить снова
источник
Это сработало для меня, чтобы удалить файл из репозитория, который я изначально выдвинул.
источник
Я скопировал текущие файлы в другую папку, а затем избавился от всех незавершенных изменений:
Тогда скопируйте вещи обратно. Подтвердите, нажмите.
источник
Вы можете просто использовать эту команду:
источник
источник
Ни один из ответов на этот раз не является разумным. Похоже, что существует достаточное требование, чтобы было предложено реальное решение: https://github.com/git/git/blob/master/Documentation/SubmittingPatches
было бы здорово. Я понял, что мы не хотим изменять историю, но если я локально и случайно добавил локальный «хакерский» файл и хочу удалить его из коммита, это было бы очень полезно.
источник