Премахване на файлове от Git ангажимент

Използвам git и използвам някои файлове

 git commit -a 

По-късно открих, че файлът е погрешно добавен към коммита.

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

849
18 сент. Mojoy е на 18 септември. 2012-09-18 19:59 '12 в 7:59 pm 2012-09-18 19:59
@ 19 отговора

Мисля, че другите отговори тук са неправилни, защото става въпрос за преместване на погрешно фиксираните файлове обратно в междинната зона от предишната фиксация, без да се отменят направените от него промени. Това може да се направи, както е предложено от Paritosh Singh:

 git reset --soft HEAD^ 

или

 git reset --soft HEAD~1 

След това нулирайте ненужните файлове, за да ги оставите извън ангажимента:

 git reset HEAD path/to/unwanted_file 

Сега опитайте отново, можете да използвате отново същото съобщение за четене:

 git commit -c ORIG_HEAD 
1673
10 марта '13 в 13:56 2013-03-10 13:56 отговорът е даден juzzlin 10 март '13 в 13:56 2013-03-10 13:56

Внимание ! Ако искате да изтриете файл от предишния запис и да го запишете на диск, прочетете отговора на джазлин малко по-високо.

Ако това е последното ви поемане и искате да премахнете напълно файла от локалното и отдалечено хранилище , можете да:

  • изтрийте файла git rm <file>
  • commit с флаг за промяна: git commit --amend
border=0

Флагът за корекция казва на git да поправя отново, но да "слее" (не в смисъл на сливане на два клона) го поправя с последното поправка.

И да го кажем като йо, командата rm в git прави това, което се прави rm !

168
18 сент. отговор, даден от CharlesB 18 септември. 2012-09-18 20:22 '12 в 20:22 ч. 2012-09-18 20:22

Съществуващите отговори предполагат премахване на нежелани файлове от последния .

Ако искате да изтриете ненужни файлове от старата фиксация (дори и да е натиснат) и да не искате да създавате нов коммит, който не е задължителен поради действието:

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 

Тази команда отваря редактора според вашите настройки. По подразбиране е vim.

Преместване на последното фиксиране, което трябва да бъде "изтриване на ненужни файлове", в следващия ред на грешното поемане ("35c23c2" в нашия случай) и задаване на командата като fixup :

 pick 35c23c2 the first commit fixup 0d78b28 remove unwanted files 

След като запазите файла, трябва да сте добре.

За да завършите:

 git push -f 

Ако за съжаление получите конфликти, трябва да ги разрешите ръчно.

75
27 янв. Отговорено от Brian Jan. 27 2015-01-27 18:24 '15 в 18:24 2015-01-27 18:24

Изтриването на файл с rm ще го изтрие!

Винаги добавяте ангажимент към git, вместо да го изтривате, така че в този случай връщате файла в състоянието, в което е бил преди първото фиксиране (това може да бъде изтриването на "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 

Той ще нулира всички промени и ще се върне към едно фиксиране.

Ако сте кликнали върху промените си, следвайте стъпките по-долу, както е посочено в @CharlesB

28
18 сент. Отговорът е даден от Паритош Сингх 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 авг. Отговор, даден от Денис Шепетов на 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 февр. Отговор, даден от Патрик на 25 февруари 2017-02-25 03:06 '17 в 3:06 2017-02-25 03:06

Следното ще деактивира само файла, който сте възнамерявали, което е необходимо на ОП.

 git reset HEAD^ /path/to/file 

Ще видите нещо като следното ...

Промените, които трябва да направите: (използвайте „git reset HEAD ...“, за да деинсталирате)

модифициран: / път / до / файл

Промените не се правят за поемане: (използвайте „git add ...“, за да актуализирате какво ще бъде направено) (използвайте „git checkout -...“, за да отхвърлите промените в работната директория)

модифициран: / път / до / файл

  • „Промени, които трябва да направите“ е предишна версия на файла, преди да извършите. Ще изглежда като изтриване, ако файлът никога не е съществувал. Ако направите тази промяна, ще се покаже редакция, която ще върне промяната на файла във вашия клон.
  • "Промените не се доставят за фиксиране" е направената от вас промяна и текущото състояние на файла

В този момент можете да правите каквото си искате във файла, например, да се върнете към друга версия.

Когато сте готови да се ангажирате:

 git commit --amend -a 

или (ако имате други промени, които не искате да направите)

 git commit add /path/to/file git commit --amend 
24
07 дек. отговорът е даден ThatsAMorais 07 Dec. 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 февр. Отговорът е даден от Брайън Бъкли на 23 февруари. 2016-02-23 09:22 '16 в 9:22 ч. 2016-02-23 09:22

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

Ако приемем, че това не е споделен клон и нямате нищо против да пренапишете историята , след това изпълнете:

 git gui citool --amend 

Можете да отмените файла, който е бил погрешно фиксиран, и след това да натиснете "Commit".

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 сент. отговорът е даден от Сергей Онишченко 10 сеп . 2015-09-10 14:51 '15 в 14:51 2015-09-10 14:51

Ще ви обясня един пример: Нека А, В, С са 3 последователни фиксации. Commit B съдържа файл, който не би трябвало да бъде поет.

  • $ git log # отнема A commmit_id
  • $ git rebase -i "A_ID"
  • промените се ангажират с „e“ при vim rebase
  • $ git rm unwanted_file
  • $ git rebase продължава
  • $ git push-force
3
17 авг. отговор, даден от Moaz Rashad 17 Aug. 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 08:34

Всъщност мисля, че по-бързият и по-лесен начин е да се използва интерактивен режим git.

 git rebase -i head~1 

(или главата ~ 4, докъде искате да отидете)

и след това използвайте 'edit' вместо 'pick'. Не разбрах колко мощно е редактирането.

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

Надявам се да ви хареса.

1
19 мая '16 в 23:58 2016-05-19 23:58 отговорът е даден от Мат 19 май, 16 в 23:58 2016-05-19 23:58

Имаше същия проблем, когато имах промени в местния клон, където исках да върна само един файл. Какво работи за мен -

( функция / target_branch ) където имам всичките си промени, включително тези, които исках да отмените за конкретен файл)

( начало / функция / target_branch ) е отдалечения клон, към който искам да направя промени.)

( функцията / етапът е временното междинно подразделение, в което ще изграждам всичките си желани промени, с изключение на модификацията на този файл)

  • Създайте локален клон от моя произход / функция / target_branch - нарича го функция / изявление

  • Обединяване на локалния ми локален елемент / клон на target_branch с клон

  • Функцията / изявление се проверява, след което git reset --soft ORIG_HEAD (сега всички промени от функцията / етап "ще бъдат организирани, но не са фиксирани.)

  • Деинсталиран файл, който преди това съм проверявал с ненужни промени

  • Променен е клонът за функция / начало / функция / target_branch

  • Пренасочете останалите фазови промени и щракнете нагоре към моя отдалечен източник / функция / target_branch

1
23 янв. отговорът се дава от user1201303 23 януари. 2017-01-23 07:13 '17 в 7:13 2017-01-23 07:13

Ако все още не сте натиснали ангажимента, GitHub Desktop лесно решава този проблем:

  • Изберете хранилище → Отмени последния финал.
  • Премахнете отметката на файла, който сте добавили по погрешка. Предишното ви съобщение за корекция вече ще бъде в диалоговия прозорец.
  • Натиснете бутона за задържане!
1
14 марта '17 в 22:41 2017-03-14 22:41 отговорът е даден от Рон на 14 март '17 в 22:41 2017-03-14 22:41

Ако вече не се нуждаете от този файл, можете да го направите

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

Други въпроси относно тагове или Ask a Question