Видалити файли з Git commit

Я використовую Git, і я зробив кілька файлів, використовуючи

 git commit -a 

Пізніше я виявив, що файл був помилково доданий в кому.

Як видалити файл з останнього коммітов?

849
18 сент. заданий Mojoy 18 сент. 2012-09-18 19:59 '12 о 19:59 2012-09-18 19:59
@ 19 відповідей

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

 git reset --soft HEAD^ 

або

 git reset --soft HEAD~1 

Потім reset небажані файли, щоб залишити їх поза коммітов:

 git reset HEAD path/to/unwanted_file 

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

 git commit -c ORIG_HEAD 
1 673
10 марта '13 в 13:56 2013-03-10 13:56 відповідь дан juzzlin 10 березня '13 о 13:56 2013-03-10 13:56

Увага! Якщо ви хочете видалити файл зі свого попереднього коммітов і зберегти його на диску, прочитайте juzzlin answer трохи вище.

Якщо це ваша остання фіксація і ви хочете повністю видалити файл зі свого локального і віддаленого сховища, ви можете:

  • видаліть файл git rm <file>
  • commit з прапором зміни: git commit --amend
border=0

Прапор виправлення повідомляє git знову зафіксувати, але "злити" (не в сенсі злиття двох гілок) це зафіксувати з останнім фіксатором.

І щоб сказати це як yo, команда rm в git робить те, що робить сама rm !

168
18 сент. відповідь дан CharlesB 18 сент. 2012-09-18 20:22 '12 о 20:22 2012-09-18 20: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 

Якщо ви, на жаль, отримуєте конфлікти, ви повинні вирішити їх вручну.

75
27 янв. відповідь дан Brian 27 Січня. 2015-01-27 18:24 '15 о 18:24 2015-01-27 18:24

Видалення файлу з допомогою rm видалить його!

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

Щоб повернути файл в попередній стан:

  git checkout <commit_id> <path_to_file> 

або повернути його в стан на віддаленій HEAD:

  git checkout origin/master <path_to_file> 

потім змініть фіксацію, і ви повинні знайти, що файл зник зі списку (і не видаляється з вашого диска!)

30
28 янв. відповідь дан Bob Flannigon 28 Січня. 2013-01-28 17:00 '13 о 17:00 2013-01-28 17:00

Якщо ви не натиснули зміни на сервері, ви можете використовувати

 git reset --soft HEAD~1 

Він буде reset всіх змін і повернеться до однієї фіксації назад

Якщо ви натиснули свої зміни, виконайте наступні кроки, як зазначено в @CharlesB

28
18 сент. відповідь дан Paritosh Singh 18 сент. 2012-09-18 21:28 '12 о 21:28 2012-09-18 21:28
 git checkout HEAD~ path/to/file git commit --amend 
27
23 авг. відповідь дан Denis Shchepetov 23 Серпня. 2013-08-23 22:01 '13 о 22:01 2013-08-23 22:01

Як показує прийнятий відповідь, ви можете зробити це, скинувши всю фіксацію. Але це досить важкий підхід.
Більш чистий спосіб зробити це - зберегти фіксацію і просто видалити з неї змінені файли.

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

git reset візьме файл так само, як і в попередньому Ком, і згенерує його в індексі. Файл в робочому каталозі не чіпатимуть.
Потім git commit фіксує і видавлює індекс в поточну фіксацію.

Це по суті приймає версію файлу, яка була в попередньому Ком, і додає її в поточну фіксацію. Це не призводить до зміни мережі, тому файл ефективно видаляється з фіксації.

25
25 февр. відповідь дан Patrick 25 февр. 2017-02-25 03:06 '17 в 3:06 2017-02-25 3:06

Наступне призведе до відключення тільки файлу, який ви мали намір, що і вимагав 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 
24
07 дек. відповідь дан ThatsAMorais 07 дек. 2014-12-07 10:13 '14 о 10:13 2014-12-07 10:13

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

 git checkout origin/<remote-branch> <filename> git commit --amend 
8
17 июня '13 в 23:07 2013-06-17 23:07 відповідь дан mattexx 17 червня '13 о 23:07 2013-06-17 23:07
 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>^ 

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

6
23 февр. відповідь дан Bryan Buckley 23 февр. 2016-02-23 09:22 '16 о 9:22 2016-02-23 9:22

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

Припускаючи, що це не колективна гілка, і ви не заперечуєте переписуєте історію , потім виконайте:

 git gui citool --amend 

Ви можете скасувати файл, який був помилково зафіксовано, а потім натиснути "Зафіксувати".

2019

6
18 мая '15 в 22:50 2015-05-18 22:50 відповідь дан JDiMatteo 18 травня '15 о 22:50 2015-05-18 22:50

Виконайте послідовність з наступних команд:

 //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 сент. відповідь дан Sergey Onishchenko 10 верес. 2015-09-10 14:51 '15 о 14:51 2015-09-10 14:51

Я поясню вам приклад Нехай A, B, C - 3 послідовних фіксації. Commit B містить файл, який не повинен був бути зафіксований.

  • $ Git log # take A commmit_id
  • $ Git rebase -i "A_ID"
  • змінити фіксацію на 'e' в rebase vim
  • $ Git rm unwanted_file
  • $ Git rebase continue
  • $ Git push -force
3
17 авг. відповідь дан Moaz Rashad 17 Серпня. 2017-08-17 12:52 '17 о 12:52 2017-08-17 12:52

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

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

Ура!

3
25 мая '16 в 18:24 2016-05-25 18:24 відповідь дан andrepo 25 травня '16 о 18:24 2016-05-25 18:24

Щось, що спрацювало для мене, але все ж думаю, що повинно бути краще рішення:

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

Просто залиште зміна, яку ви хочете скасувати в іншому Ком, перевірте інших.

 $ git commit --amend // or stash and rebase to <commit_id> to amend changes 
2
14 авг. відповідь дан saiyancoder 14 Серпня. 2014-08-14 08:34 '14 о 8:34 2014-08-14 8:34

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

 git rebase -i head~1 

(Або голова ~ 4, як далеко ви хочете йти)

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

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

Сподіваюся вам сподобається.

1
19 мая '16 в 23:58 2016-05-19 23:58 відповідь дан Matt 19 травня '16 о 23:58 2016-05-19 23: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

1
23 янв. відповідь дан user1201303 23 Січня. 2017-01-23 07:13 '17 в 7:13 2017-01-23 7:13

Якщо ви ще не натиснули фіксацію, GitHub Desktop легко вирішує цю проблему:

  • Виберіть репозиторій → Скасувати останню фіксацію
  • Скасуйте вибір файлу, який ви помилково додали. Ваше попереднє повідомлення про фіксацію буде вже в діалоговому вікні.
  • Натисніть кнопку фіксації!
1
14 марта '17 в 22:41 2017-03-14 22:41 відповідь дан Ron 14 березня '17 о 22:41 2017-03-14 22:41

Якщо вам більше не потрібен цей файл, ви можете зробити

 git rm file git commit --amend git push origin branch 
0
29 сент. відповідь дан tven 29 сент. 2017-09-29 00:49 '17 в 0:49 2017-09-29 00:49

Інші питання по мітках або Задайте питання