Я использую Git, и я зафиксировал несколько файлов, используя
git commit -a
Позже я обнаружил, что файл был ошибочно добавлен в коммит.
Как я могу удалить файл из последнего коммита?
git reset filepath
Я использую Git, и я зафиксировал несколько файлов, используя
git commit -a
Позже я обнаружил, что файл был ошибочно добавлен в коммит.
Как я могу удалить файл из последнего коммита?
git reset filepath
Ответы:
Я думаю, что другие ответы здесь неправильны, потому что это вопрос перемещения ошибочно зафиксированных файлов обратно в область подготовки из предыдущего коммита, без отмены внесенных в них изменений. Это можно сделать так, как предложил Паритош Сингх:
git reset --soft HEAD^
или
git reset --soft HEAD~1
Затем сбросьте ненужные файлы, чтобы исключить их из коммита:
git reset HEAD path/to/unwanted_file
Теперь совершите коммит снова, вы даже можете повторно использовать то же самое сообщение коммита:
git commit -c ORIG_HEAD
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.
Найдите коммит, которому вы хотите, чтобы файл соответствовал.
git checkout <commit_id> <path_to_file>
Вы можете сделать это несколько раз, если вы хотите удалить много файлов.
2.
git commit -am "remove unwanted files"
3.
Найдите commit_id коммита, по которому файлы были добавлены по ошибке , скажем "35c23c2" здесь
git rebase 35c23c2~1 -i // notice: "~1" is necessary
Эта команда открывает редактор в соответствии с вашими настройками. По умолчанию используется vim.
Переместите последний коммит, который должен быть «удалить ненужные файлы», на следующую строку некорректного коммита (в нашем случае «35c23c2») и установите команду как fixup
:
pick 35c23c2 the first commit
fixup 0d78b28 remove unwanted files
Вы должны быть хороши после сохранения файла.
Заканчивать :
git push -f
Если вы, к сожалению, получаете конфликты, вы должны решить их вручную.
git rm --cached <file(s)>
.
--fixup=35c23c2
в git commit
команду. Это автоматически настроит коммит как исправление требуемого коммита, поэтому вам не нужно будет указывать его в ребазе. Кроме того, если добавить --autosquash
к git rebase
команде, мерзавец будет автоматически перемещать вашу фиксацию в нужном месте, так что вам не нужно ничего делать в интерактивном перебазировании - просто сохранить результат (а это означает , что вам даже не нужно -i
флаг, хотя мне все равно нравится использовать его, чтобы убедиться, что все выглядит так, как я ожидаю).
Как показывает принятый ответ, вы можете сделать это, сбросив весь коммит. Но это довольно тяжелый подход.
Более чистый способ сделать это - сохранить коммит и просто удалить из него измененные файлы.
git reset HEAD^ -- path/to/file
git commit --amend --no-edit
Команда git reset
примет файл, как это было в предыдущем коммите, и поместит его в индекс. Файл в рабочем каталоге остается нетронутым.
Затем git commit
будет зафиксировать и сжать индекс в текущий коммит.
По сути, это берет версию файла, которая была в предыдущем коммите, и добавляет ее к текущему коммиту. Это не приводит к чистым изменениям, и поэтому файл эффективно удаляется из коммита.
Если вы не отправили изменения на сервер, вы можете использовать
git reset --soft HEAD~1
Это сбросит все изменения и вернется к одному коммиту обратно
Если вы отправили изменения, следуйте инструкциям @CharlesB.
Удаление файла с помощью rm удалит его!
Вы всегда добавляете коммит в git, а не удаляете, поэтому в этом случае верните файл в состояние, в котором он находился до первого коммита (это может быть действие удаления 'rm', если файл новый), а затем повторно зафиксировать, и файл будет идти.
Чтобы вернуть файл в предыдущее состояние:
git checkout <commit_id> <path_to_file>
или вернуть его в состояние на удаленной ГОЛОВКЕ:
git checkout origin/master <path_to_file>
затем измените коммит, и вы обнаружите, что файл исчез из списка (и не удален с вашего диска!)
git checkout HEAD~ path/to/file
git commit --amend
Следующее действие приведет к удалению только того файла, который вы намеревались, что и было задано OP.
git reset HEAD^ /path/to/file
Вы увидите что-то вроде следующего ...
Изменения, которые необходимо зафиксировать: (используйте «git reset HEAD ...» для удаления)
изменено: / путь / к / файлу
Изменения, не подготовленные для фиксации: (используйте «git add ...» для обновления того, что будет зафиксировано) (используйте «git checkout - ...» для отмены изменений в рабочем каталоге)
изменено: / путь / к / файлу
На этом этапе вы можете делать с файлом все, что захотите, например, сбросить версию.
Когда вы будете готовы совершить:
git commit --amend -a
или (если у вас есть другие изменения, которые вы не хотите совершать, пока)
git commit add /path/to/file
git commit --amend
Я объясню вам с примером.
Пусть A, B, C - 3 последовательных коммита. Коммит B содержит файл, который не должен был быть зафиксирован.
git log # take A commit_id
git rebase -i "A_commit_ID" # do an interactive rebase
change commit to 'e' in rebase vim # means commit will be edited
git rm unwanted_file
git rebase --continue
git push --force-with-lease <branchName>
noop
на edit [A_commit_ID]
илиe [A_commit_ID]
Вы можете просто попробовать.
git reset --soft HEAD~1
и создать новый коммит.
Тем не менее, есть потрясающее программное обеспечение "Gitkraken". что облегчает работу с git.
git commit --amend
будет обновить удаление файла при последнем коммите; и после этого вы можете проверить, действительно ли он был удален с помощьюgit log -1 --stat
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "removed unwanted file from git"
оставит вам локальный файл еще. Если вам также не нужен локальный файл, вы можете пропустить параметр --cached.
Если вся работа выполняется в вашей локальной ветке, вам нужно сохранить файл в последующем коммите, и, как при наличии чистой истории, я думаю, что более простой способ сделать это может быть:
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit --squash <commit_id>
git add <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "brand new file!"
git rebase --interactive <commit_id>^
и затем вы можете с легкостью завершить ребазинг, не запоминая более сложные команды, не фиксируя сообщение или не набирая столько текста.
Использование git GUI может упростить удаление файла из предыдущего коммита.
Предполагая, что это не общая ветка, и вы не против переписать историю , запустите:
git gui citool --amend
Вы можете отменить проверку файла, который был ошибочно зафиксирован, а затем нажать «Подтвердить».
Файл удаляется из коммита, но будет храниться на диске . Таким образом, если вы сняли галочку с файла после ошибочного добавления, он отобразится в вашем списке неотслеживаемых файлов (а если вы сняли галочку с файла после ошибочного изменения, он отобразится в ваших изменениях, не подготовленных для списка фиксации).
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 checkout origin/<remote-branch> <filename>
git commit --amend
Выполните последовательность следующих команд:
//to remove the last commit, but preserve changes
git reset --soft HEAD~1
//to remove unneded file from the staging area
git reset HEAD `<your file>`
//finally make a new commit
git commit -m 'Your message'
Просто хотел дополнить верхний ответ, так как мне нужно было выполнить дополнительную команду:
git reset --soft HEAD^
git checkout origin/master <filepath>
Ура!
Что-то, что сработало для меня, но все же думаю, что должно быть лучшее решение:
$ git revert <commit_id>
$ git reset HEAD~1 --hard
Просто оставьте изменения, которые вы хотите отменить, в другом коммите, проверьте другие
$ git commit --amend // or stash and rebase to <commit_id> to amend changes
На самом деле, я думаю, что более быстрый и простой способ - использовать интерактивный режим git rebase.
git rebase -i head~1
(или голова ~ 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
Если вы хотите удалить файлы из предыдущих коммитов, используйте фильтры
git filter-branch --prune-empty --index-filter 'git rm --ignore-unmatch --cached "file_to_be_removed.dmg"'
Если вы видите эту ошибку:
Невозможно создать новую резервную копию. Предыдущая резервная копия уже существует в refs / original / Force для перезаписи резервной копии с -f
Просто удалите резервные копии в вашем локальном репо
$ rm -rf .git/refs/original/refs
если вы еще не добавили свои изменения в git
git reset --soft HEAD~1
Это сбросит все изменения и вернется к одному коммиту обратно
Если это последний сделанный вами коммит и вы хотите удалить файл из локального и удаленного репозитория, попробуйте это:
git rm <file>
git commit --amend
или даже лучше:
сбросить в первую очередь
git reset --soft HEAD~1
сбросить ненужный файл
git reset HEAD path/to/unwanted_file
совершить снова
git commit -c ORIG_HEAD
Here is the step to remove files from Git Commit.
>git reset --soft HEAD^1(either commitid ) -- now files moved to the staging area.
>git rm --cached filename(it will removed the file from staging area)
>git commit -m 'meaningfull message'(Now commit the required files)
Ни один из ответов на этот раз не является разумным. Похоже, что существует достаточное требование, чтобы было предложено реальное решение: https://github.com/git/git/blob/master/Documentation/SubmittingPatches
git --uncommit <имя файла>
было бы здорово. Я понял, что мы не хотим изменять историю, но если я локально и случайно добавил локальный «хакерский» файл и хочу удалить его из коммита, это было бы очень полезно.