Удаление файлов из 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--> чуть выше.

если это ваш последний коммит и вы хотите полностью удалить файл из локального и удаленного репозитория вы можете:

  1. удалить файл git rm <file>
  2. 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>

затем изменить коммит и вы должны найти файл исчез из списка (а не удален с вашего диска!)


git checkout HEAD~ path/to/file
git commit --amend

следующее будет 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

вы можете отменить проверку файла, который был ошибочно зафиксирован, а затем нажмите "зафиксировать".

enter image description here

файл удаляется из фиксации, но будет на диске. Поэтому, если вы не проверили файл после его ошибочного добавления, он будет показать в списке неотслеженных файлов (и если вы не проверили файл после его ошибочного изменения, он будет отображаться в списке изменений, не поставленных для фиксации).


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 является удаленной веткой, где я хочу нажать мои изменения)

(характеристика/постановки мой временная промежуточная ветвь, где я буду нажимать на все мои нужные изменения, исключая изменение в этом одном файле)

  1. создайте локальную ветку из my origin / feature / target_branch - это называется характеристика/постановки

  2. слил мой рабочий местного отделения функция/target_branch до характеристика/постановки филиала

  3. проверили характеристика/постановки затем git reset --soft ORIG_HEAD (Теперь все изменения из функции/постановки " будут поставлены, но не зафиксированы.)

  4. Unstaged файл, который я ранее проверил с ненужными изменениями

  5. изменил ветку вверх по течению на характеристика/постановки to origin / feature / target_branch

  6. совершил остальную часть постановки изменения и толкнул вверх по течению к моему remote origin / feature / target_branch


Если вам больше не нужен этот файл, вы можете сделать

git rm file
git commit --amend
git push origin branch

Если вы используете GitHub и еще не нажали фиксацию, GitHub Desktop легко решает эту проблему:

  1. Выберите Репозиторий - > Отменить Последнюю Фиксацию
  2. снимите флажок с файла, который вы ошибочно добавили. Предыдущее сообщение в диалоговом окне уже.
  3. нажать кнопку "Применить"!

это сработало для меня, чтобы удалить файл из репозитория bit bucket, который я изначально толкнул файл в ветвь.

git checkout origin/develop <path-to-file>
git add <path-to-file>
git commit -m "Message"
git push