Удаление файлов из git commit
Я использую Git, и я совершил несколько файлов, используя
git commit -a
позже, я обнаружил, что файл был ошибочно добавлен в фиксации.
Как удалить файл из последнего фиксации?
21 ответов
Я думаю, что другие ответы здесь неправильны, потому что это вопрос о перемещении ошибочно зафиксированных файлов обратно в промежуточную область из предыдущей фиксации, не отменяя внесенных в них изменений. Это можно сделать так, как предложил Паритош Сингх:
git reset --soft HEAD^
или
git reset --soft HEAD~1
затем сбросьте нежелательные файлы, чтобы оставить их вне фиксации:
git reset HEAD path/to/unwanted_file
теперь зафиксируйте снова, вы даже можете повторно использовать ту же фиксацию сообщение:
git commit -c ORIG_HEAD
внимание! Если вы хотите удалить только файл из предыдущей фиксации и сохранить его на диск, читать juzzlin это!--10--> чуть выше.
если это ваш последний коммит и вы хотите полностью удалить файл из локального и удаленного репозитория вы можете:
- удалить файл
git rm <file>
- commit с флагом amend:
git commit --amend
флаг изменения сообщает git для фиксации снова, но "слияние" (не в смысле слияния двух ветвей) этой фиксации с последней фиксацией.
как указано в комментариях, используя git rm
вот например !
существующие ответы все говорят об удалении ненужных файлов из последние commit.
если вы хотите удалить ненужные файлы старый commit (даже нажал) и не хочет создавать новую фиксацию, которая не нужна, из-за действия:
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 reset HEAD^ -- path/to/file
git commit --amend --no-edit
на git reset
возьмет файл, как он был в предыдущей фиксации, и разместит его в индексе. Файл в рабочем каталоге остается нетронутым.
The 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>
затем изменить коммит и вы должны найти файл исчез из списка (а не удален с вашего диска!)
следующее будет unstage только файл, который вы намеревались, что и спросил OP.
git reset HEAD^ /path/to/file
вы увидите что-то вроде следующего...
изменения, которые будут зафиксированы: (используйте " git reset HEAD ..."to unstage)
изменено:/path/to / file
изменения, не поставленные для фиксации: (используйте " git add ..." обновлять что будет совершено) (используйте "git checkout -- ..." отбрасывать изменения в рабочем каталоге)
изменено:/path/to / file
- "изменения, подлежащие фиксации" - это предыдущая версия файла перед фиксацией. Это будет выглядеть как удаление, Если файл никогда не существовал. Если вы зафиксируете это изменение,будет пересмотр, который вернет изменение в файл в вашей ветви.
- "изменения не устроили для фиксации" это изменения, которые вы совершили, и текущее состояние файла
в этот момент Вы можете делать все, что угодно например, к файлу, например, сброс в другую версию.
когда вы будете готовы совершить:
git commit --amend -a
или (если у вас есть некоторые другие изменения, которые вы еще не хотите совершать)
git commit add /path/to/file
git commit --amend
Если вы хотите сохранить фиксацию (возможно, вы уже потратили некоторое время на написание подробного сообщения фиксации и не хотите его потерять), и вы хотите удалить файл из фиксации, но не из репозитория полностью:
git checkout origin/<remote-branch> <filename>
git commit --amend
я объясню вам на примере.
Пусть A, B, C-3 последовательных коммита. Commit 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 <branchName>
использование Git GUI может упростить удаление файла из предыдущей фиксации.
предполагая, что это не общая ветвь, и вы не возражаете переписывание истории, затем запустите:
git gui citool --amend
вы можете отменить проверку файла, который был ошибочно зафиксирован, а затем нажмите "зафиксировать".
файл удаляется из фиксации, но будет на диске. Поэтому, если вы не проверили файл после его ошибочного добавления, он будет показать в списке неотслеженных файлов (и если вы не проверили файл после его ошибочного изменения, он будет отображаться в списке изменений, не поставленных для фиксации).
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>^
и вы можете легко завершить перебазирование без необходимости запоминать более сложные команды или фиксировать сообщение или вводить столько же.
выполните последовательность следующих команд:
//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 reset --soft HEAD^
сворачивает вашу фиксацию, и когда вы вводите git status
, Он говорит вам, что делать:
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
на самом деле, я думаю, что более быстрый и простой способ-использовать интерактивный режим git rebase.
git rebase -i head~1
(или head~4, как далеко вы хотите пойти)
и затем вместо "выбрать" используйте "редактировать". Я не понимал, насколько мощным является "редактирование".
https://www.youtube.com/watch?v=2dQosJaLN18
надеюсь, вы найдете это полезным.
была та же проблема, когда у меня есть изменения в локальной ветви, где я хотел вернуть только один файл. Что сработало для меня, так это ... --1-->
(функция/target_branch ниже, где у меня есть все мои изменения, включая те, которые я хотел отменить для конкретного файла)
(origin / feature / target_branch является удаленной веткой, где я хочу нажать мои изменения)
(характеристика/постановки мой временная промежуточная ветвь, где я буду нажимать на все мои нужные изменения, исключая изменение в этом одном файле)
создайте локальную ветку из my origin / feature / target_branch - это называется характеристика/постановки
слил мой рабочий местного отделения функция/target_branch до характеристика/постановки филиала
проверили характеристика/постановки затем git reset --soft ORIG_HEAD (Теперь все изменения из функции/постановки " будут поставлены, но не зафиксированы.)
Unstaged файл, который я ранее проверил с ненужными изменениями
изменил ветку вверх по течению на характеристика/постановки to origin / feature / target_branch
совершил остальную часть постановки изменения и толкнул вверх по течению к моему remote origin / feature / target_branch
Если вам больше не нужен этот файл, вы можете сделать
git rm file
git commit --amend
git push origin branch
Если вы используете GitHub и еще не нажали фиксацию, GitHub Desktop легко решает эту проблему:
- Выберите Репозиторий - > Отменить Последнюю Фиксацию
- снимите флажок с файла, который вы ошибочно добавили. Предыдущее сообщение в диалоговом окне уже.
- нажать кнопку "Применить"!
это сработало для меня, чтобы удалить файл из репозитория bit bucket, который я изначально толкнул файл в ветвь.
git checkout origin/develop <path-to-file>
git add <path-to-file>
git commit -m "Message"
git push