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

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

git commit -a

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

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

Комментарии к вопросу (4)
Решение

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

git reset --soft HEAD^ 

или

git reset --soft HEAD~1

Затем сбросьте ненужные файлы, чтобы исключить их из коммита:

git reset HEAD path/to/unwanted_file

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

git commit -c ORIG_HEAD  
Комментарии (28)

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

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

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

Флаг изменения говорит git, чтобы он снова совершил, но «слияние» (не в смысле слияния двух ветвей) этого коммита с последним коммитом.

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

Комментарии (5)

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

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

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

git checkout  <path_to_file>

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

git commit -am "remove unwanted files"

Найдите 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

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

Комментарии (9)

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

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

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

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

Комментарии (8)

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

git reset --soft HEAD~1

Он сбросит все изменения и вернется к одному коммиту обратно

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

Комментарии (8)

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

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

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

    git checkout  <path_to_file>

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

    git checkout origin/master <path_to_file>

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

Комментарии (0)
git checkout HEAD~ path/to/file
git commit --amend
Комментарии (1)

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

git reset HEAD^ /path/to/file

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

Изменения, которые должны быть зафиксированы: (используйте «git reset HEAD < file >..."отклеивать)

изменено: / path / to / file

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

изменено: / path / to / file

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

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

Когда вы будете готовы совершить:

git commit --amend -a

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

git commit add /path/to/file
git commit --amend
Комментарии (1)

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

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

git rm --cached path_to_file

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

Комментарии (1)
git rm --cached 
git commit -m "removed unwanted file from git"

оставит вам локальный файл еще. Если вы не хотите, чтобы файл был локальным, вы можете пропустить опцию --cached.

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

git rm --cached 
git commit --squash 
git add 
git commit -m "brand new file!"
git rebase --interactive ^

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

Комментарии (1)

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

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

git gui citool --amend

Вы можете снять флажок с файла, который был ошибочно совершен, а затем нажать «Команда».

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

Комментарии (3)

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

git checkout origin/ 
git commit --amend
Комментарии (0)

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


git reset --soft HEAD^
git checkout origin/master 
Комментарии (1)

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

//to remove the last commit, but preserve changes  
git reset --soft HEAD~1

//to remove unneded file from the staging area  
git reset HEAD `` 

//finally make a new commit  
git commit -m 'Your message'
Комментарии (3)

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

$ git revert 
$ git reset HEAD~1 --hard

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

$ git commit --amend // or stash and rebase to  to amend changes
Комментарии (0)

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

Changes to be committed:
  (use "git reset HEAD ..." to unstage)
Комментарии (0)

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

git rebase -i head~1  

(или голова ~ 4, как далеко ты хочешь пойти)

и затем вместо «выбрать» используйте «править». Я не осознавал, насколько силен «править».

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

Надеюсь, вы найдете это полезным.

Комментарии (1)

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

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

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

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

  1. Создайте локальную ветку из моего origin / feature / target_branch - называется feature / staging

  2. Объединил мою рабочую локальную ветку feature / target_branch с веткой feature / staging

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

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

  5. Изменен восходящий филиал для feature / staging в origin / feature / target_branch

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

Комментарии (0)

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

git rm file
git commit --amend
git push origin branch
Комментарии (0)