Удалить файлы из Git commit

Я использую Git, и я сделал несколько файлов, используя

git commit -a

Позже я обнаружил, что файл был ошибочно добавлен в коммит.

Как удалить файл из последнего коммита?

Ответ 1

Я думаю, что другие ответы здесь неверны, потому что речь идет о перемещении ошибочно зафиксированных файлов обратно в промежуточную область из предыдущего фиксации без отмены сделанных им изменений. Это можно сделать, как предложил Паритош Сингх:

git reset --soft HEAD^ 

или

git reset --soft HEAD~1

Затем reset нежелательные файлы, чтобы оставить их вне коммита:

git reset HEAD path/to/unwanted_file

Теперь повторите попытку, вы можете повторно использовать одно и то же сообщение фиксации:

git commit -c ORIG_HEAD  

Ответ 2

ВНИМАНИЕ! Если вы хотите только удалить файл из предыдущего коммита и сохранить его на диске, прочитайте ответ juzzlin чуть выше.

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

  1. удалить файл git rm <file>
  2. совершить с флагом изменения: git commit --amend

Флаг изменения указывает git выполнить коммит снова, но "объединить" (не в смысле слияния двух веток) этот коммит с последним коммитом.

Как указано в комментариях, использование git rm здесь похоже на использование самой команды rm !

Ответ 3

Существующие ответы говорят об удалении нежелательных файлов из фиксации last.

Если вы хотите удалить ненужные файлы из старой фиксации (даже нажатой) и не хотите создавать новую фиксацию, что необязательно, из-за действия:

1.

Найдите фиксацию, которой вы хотите, чтобы файл соответствовал.

git checkout <commit_id> <path_to_file>

вы можете сделать это несколько раз, если вы хотите удалить много файлов.

2.

git commit -am "remove unwanted files"

3.

Найти commit_id commit , по которому файлы были добавлены ошибочно, скажем, "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

Если вы, к сожалению, получаете конфликты, вы должны решить их вручную.

Ответ 4

Как показывает принятый ответ, вы можете сделать это, сбросив всю фиксацию. Но это довольно тяжелый подход.
Более чистый способ сделать это - сохранить фиксацию и просто удалить из нее измененные файлы.

git reset HEAD^ -- path/to/file
git commit --amend --no-edit

git reset возьмет файл так же, как и в предыдущем коммите, и сгенерирует его в индексе. Файл в рабочем каталоге не тронут.
Затем git commit фиксирует и выдавливает индекс в текущую фиксацию.

Это по существу принимает версию файла, которая была в предыдущем коммите, и добавляет ее в текущую фиксацию. Это не приводит к изменению сети, поэтому файл эффективно удаляется из фиксации.

Ответ 5

Если вы не нажали изменения на сервере, вы можете использовать

git reset --soft HEAD~1

Он будет reset всех изменений и вернется к одной фиксации назад

Если вы нажали свои изменения, выполните следующие шаги, как указано в @CharlesB

Ответ 6

Удаление файла с помощью rm удалит его!

Вы всегда добавляете фиксацию в git, а не удаляете, поэтому в этом экземпляре возвращаете файл в состояние, в котором оно находилось до первого коммита (это может быть действие delete "rm", если файл является новым), а затем повторно зафиксировать и файл пойдет.

Чтобы вернуть файл в предыдущее состояние:

    git checkout <commit_id> <path_to_file>

или вернуть его в состояние на удаленной HEAD:

    git checkout origin/master <path_to_file>

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

Ответ 7

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

Ответ 8

Следующее приведет к отключению только файла, который вы намеревались, что и требовал OP.

git reset HEAD^ /path/to/file

Вы увидите что-то вроде следующего...

Изменения, которые необходимо совершить: (используйте "git reset HEAD..." для неустановления)

modified:/path/to/file

Изменения не выполняются для фиксации: (используйте "git add..." для обновления что будет сделано) (используйте "git checkout -...", чтобы отменить изменения в рабочем каталоге)

modified:/path/to/file

  • "Изменения, которые необходимо совершить" - это предыдущая версия файла перед фиксацией. Это будет выглядеть как удаление, если файл никогда не существовал. Если вы сделаете это изменение, появится ревизия, которая вернет изменение в файл в вашей ветке.
  • "Изменения не поставлены для фиксации" - это сделанное вами изменение и текущее состояние файла

В этот момент вы можете делать все, что захотите, в файл, например, сбросить в другую версию.

Когда вы готовы к фиксации:

git commit --amend -a

или (если у вас есть другие изменения, которые вы еще не хотите совершать)

git commit add /path/to/file
git commit --amend

Ответ 9

Я объясню вам с примером.
Пусть 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>    

Ответ 10

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>^

и вы можете легко закончить перезагрузку без необходимости запоминать более сложные команды или фиксировать сообщение или вводить столько же.

Ответ 11

Использование git GUI может упростить удаление файла из предшествующего коммита.

Предполагая, что это не разделяемая ветка, и вы не возражаете переписываете историю, затем выполните:

git gui citool --amend

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

enter image description here

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

Ответ 12

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

git checkout origin/<remote-branch> <filename>
git commit --amend

Ответ 13

Выполните последовательность из следующих команд:

//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'

Ответ 14

Просто хотел дополнить верхний ответ, поскольку мне пришлось выполнить дополнительную команду:

git reset --soft HEAD^
git checkout origin/master <filepath>

Ура!

Ответ 15

Если вы случайно добавили файл в свой коммит, вы можете сделать что-то вроде

git rm --cached path_to_file

Обязательно используйте --cached иначе ваш файл также будет удален из вашего проекта.

Ответ 16

Что-то, что сработало для меня, но все же думаю, что должно быть лучшее решение:

$ git revert <commit_id>
$ git reset HEAD~1 --hard

Просто оставьте изменение, которое вы хотите отменить в другом коммите, проверьте других.

$ git commit --amend // or stash and rebase to <commit_id> to amend changes

Ответ 17

git reset --soft HEAD^ возвращает ваш коммит, и когда вы git reset --soft HEAD^ git status, он говорит вам, что делать:

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

Ответ 18

На самом деле, я думаю, что более быстрый и простой способ - использовать интерактивный режим git.

git rebase -i head~1  

(или голова ~ 4, как далеко вы хотите идти)

а затем вместо 'pick' используйте 'edit'. Я не понял, насколько мощным является "редактирование".

https://www.youtube.com/watch?v=2dQosJaLN18

Надеюсь, вам понравится.

Ответ 19

Имел ту же проблему, когда у меня есть изменения в локальной ветке, где я хотел вернуть только один файл. Что для меня работало -

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

(origin/feature/target_branch) - это удаленная ветка, в которую я хочу внести изменения)

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

  • Создайте локальную ветку из моего origin/feature/target_branch - назвали ее функцией/постановкой

  • Слияние моей локальной локальной ветки feature/target_branch с веткой

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

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

  • Изменена ветвь восходящего потока для функции/постановки в origin/feature/target_branch

  • Переделал остальные поэтапные изменения и нажал вверх по течению до моего удаленного источника/функции/target_branch

Ответ 20

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

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

Ответ 21

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

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

Ответ 22

Если вы хотите удалить файлы из предыдущих коммитов, используйте фильтры

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

Ответ 23

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

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

Ответ 24

если вы еще не добавили свои изменения в 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  

Ответ 25

Я скопировал текущие файлы в другую папку, а затем избавился от всех внесенных изменений с помощью:

git reset --hard @{u}

Тогда скопируйте вещи обратно. Подтвердите, нажмите.