Выдаліць файлы з 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 
1673
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 03: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 у 09:22 2016/02/23 09: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 00: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 у 08:34 2014/08/14 08: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 07: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

Іншыя пытанні па пазнаках або Задайце пытанне