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>- фиксация с флагом изменения:
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эта команда открывает редактор в соответствии с вашими настройками. По умолчанию ВИМ.
переместите последнюю фиксацию ,которая должна быть "удалить ненужные файлы", в следующую строку неправильной фиксации ("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-editThe
git resetвозьмет файл, как это было в предыдущей фиксации, и разместит его в индексе. Файл в рабочем каталоге остается нетронутым.
Элемент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 только файл, который вы намеревались, что ОП спросил.
git reset HEAD^ /path/to/fileвы увидите что-то вроде следующего...
изменения для фиксации: (используйте " git reset HEAD ..."чтобы отменить добавление)
изменено: / 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
надеюсь, что вы найдете его полезным.
была та же проблема, когда у меня есть изменения в локальной ветке, где я хотел вернуть только один файл. То, что сработало для меня, было -
(feature / target_branch ниже, где у меня есть все мои изменения, включая те, которые я хотел отменить для конкретного файла)
(origin / feature / target_branch это удаленная ветка, куда я хочу нажать мои изменения)
(характеристика/постановки мой временная промежуточная ветвь, где я буду нажимать из всех моих желаемых изменений, исключая изменение в этот файл)
создать локальную ветку из my origin / feature / target_branch - это называется характеристика/постановки
слил мой рабочий местного отделения feature / target_branch до характеристика/постановки филиала
проверили характеристика/постановки затем git reset --soft ORIG_HEAD(Теперь все изменения из функции/staging' будут выполнены, но не отменены.)
Unstaged файл, который я ранее проверил с ненужными изменениями
изменил восходящую ветвь на характеристика/постановки до origin / feature / target_branch
совершил остальную часть постановки изменения и толкнул вверх по течению к моему удаленному origin / feature / target_branch
Если вам больше не нужен этот файл, вы можете сделать
git rm file git commit --amend git push origin branch
Если вы используете GitHub и еще не нажали фиксацию, GitHub Desktop легко решает эту проблему:
- Выберите Репозиторий - > Отменить Последнюю Фиксацию
- снимите флажок с файла, который вы по ошибке добавили. Предыдущее сообщение в диалоговом окне уже.
- нажать кнопку "Применить"!
это сработало для меня, чтобы удалить файл из РЕПО бит-ковша, который я изначально толкнул файл в ветвь.
git checkout origin/develop <path-to-file> git add <path-to-file> git commit -m "Message" git push

Comments