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

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

git commit -a

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

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

+1323
18 сент. '12 в 16:59
источник поделиться
24 ответа

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

git reset --soft HEAD^ 

или

git reset --soft HEAD~1

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

git reset HEAD path/to/unwanted_file

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

git commit -c ORIG_HEAD  
+2543
10 мар. '13 в 10:56
источник

Связанные вопросы


Похожие вопросы

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

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

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

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

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

+274
18 сент. '12 в 17:22
источник

Существующие ответы говорят об удалении нежелательных файлов из фиксации 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

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

+130
27 янв. '15 в 15:24
источник

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

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

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

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

+101
25 февр. '17 в 0:06
источник

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

git reset --soft HEAD~1

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

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

+37
18 сент. '12 в 18:28
источник

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

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

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

    git checkout <commit_id> <path_to_file>

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

    git checkout origin/master <path_to_file>

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

+35
28 янв. '13 в 14:00
источник
git checkout HEAD~ path/to/file
git commit --amend
+33
23 авг. '13 в 19:01
источник

Следующее приведет к отключению только файла, который вы намеревались, что и требовал 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
+28
07 дек. '14 в 7:13
источник

Я объясню вам с примером.
Пусть 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>    
+15
17 авг. '17 в 9:52
источник

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

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

git gui citool --amend

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

enter image description here

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

+10
18 мая '15 в 19:50
источник
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>^

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

+9
23 февр. '16 в 6:22
источник

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

git checkout origin/<remote-branch> <filename>
git commit --amend
+9
17 июн. '13 в 20:07
источник

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

//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'
+5
10 сент. '15 в 11:51
источник

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

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

Ура!

+4
25 мая '16 в 15:24
источник

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

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

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

$ git commit --amend // or stash and rebase to <commit_id> to amend changes
+3
14 авг. '14 в 5:34
источник

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

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
+3
08 мая '18 в 8:40
источник

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

git rebase -i head~1  

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

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

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

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

+2
19 мая '16 в 20:58
источник

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

(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

+2
23 янв. '17 в 4:13
источник

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

git rm file
git commit --amend
git push origin branch
+1
28 сент. '17 в 21:49
источник

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

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

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

git checkout origin/develop <path-to-file>
git add <path-to-file>
git commit -m "Message"
git push
0
14 авг. '18 в 16:19
источник

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

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
0
31 мар. '19 в 5:35
источник

если вы еще не добавили свои изменения в 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  
0
31 мар. '19 в 5:45
источник

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

git rm --cached path_to_file

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

0
08 февр. '19 в 12:17
источник

Посмотрите другие вопросы по меткам или Задайте вопрос