Як мне адмяніць апошнія камітаў у Git?

Я выпадкова перадаў няправільныя файлы ў Git , але я яшчэ не адправіў комм на сервер.

Як я магу адмяніць гэтыя камітаў з лакальнага рэпазітара?

18990
29 мая '09 в 21:09 2009-05-29 21:09 зададзены Hamza Yerlikaya 29 мая '09 а 21:09 2009-05-29 21:09
@ 92 адказаў

Адмяніць фіксацыю і паўтарыць

20501
29 мая '09 в 21:13 2009-05-29 21:13 адказ дадзены Esko Luontola 29 мая '09 у 21:13 2009-05-29 21:13

Адмена камітаў трохі страшная, калі вы не ведаеце, як ён працуе. Але гэта на самай справе дзіўна лёгка, калі вы разумееце.

Скажам, у вас гэта значыць, дзе C - гэта ваша ГАЛАВУ, а (F) - гэта стан вашых файлаў.

  (F) ABC ↑ master 

Вы хочаце абнуліць комм C і больш ніколі яго не бачыць. Ты робіш гэта:

 git reset --hard HEAD~1 

Вынік:

  (F) AB ↑ master 

Цяпер Б - Галаву. Паколькі вы выкарыстоўвалі --hard , вашыя файлы вяртаюцца ў свой стан пры фіксацыі B.

Ах, але выкажам здагадку, што commit C - гэта не катастрофа, а зусім няшмат. Вы хочаце адмяніць комм, але захаваеце свае змены для невялікага рэдагавання, перш чым зрабіць лепшы комм. Пачынаючы зноў тут, з C у якасці вашай галавы:

  (F) ABC ↑ master 

Вы можаце зрабіць гэта, пакінуўшы --hard :

border=0
 git reset HEAD~1 

У гэтым выпадку вынік:

  (F) ABC ↑ master 

У абодвух выпадках HEAD - гэта проста паказальнік на апошні комм. Калі вы робіце git reset HEAD~1 , вы кажаце Git перамясціць паказальнік HEAD назад на адзін комм. Але (калі вы не выкарыстоўваеце --hard ) вы пакідаеце свае файлы такімі, якімі яны былі. Цяпер git status паказвае змены, якія вы зарэгістравалі ў C. Вы нічога не страцілі!

Для лёгкага дотыку вы можаце нават адмяніць фіксацыю, але пакінуць свае файлы і індэкс :

 git reset --soft HEAD~1 

Гэта не толькі пакідае вашыя файлы ў спакоі, але нават пакідае ваш індэкс ў спакоі. Калі вы зробіце git status , вы ўбачыце, што ў індэксе ёсць тыя ж файлы, што і раней. Фактычна, адразу пасля гэтай каманды вы можаце выканаць git commit і вы будзеце перарабляць той жа комм, які толькі што ў вас быў.

Яшчэ адна рэч: выкажам здагадку, вы знішчылі комм, як у першым прыкладзе, але потым выявілі, што ён вам патрэбен у рэшце рэшт? Не повезло, праўда?

Не, яшчэ ёсць спосаб вярнуць яго. Тып git reflog , і вы ўбачыце спіс (часткова) здзяйсняць ШАС (гэта значыць, хэш), што вы перамясціліся вакол у Знайсці комм вы знішчылі, і зрабіць гэта .:

 git checkout -b someNewBranchName shaYouDestroyed 

Вы зараз ўваскрэсілі гэты комм. Камітэты на самай справе не знішчаюцца ў Git на працягу прыкладна 90 дзён, таму звычайна вы можаце вярнуцца і выратаваць таго, ад якога не хацелі пазбавіцца.

10099
29 июля '11 в 1:22 2011-07-29 01:22 адказ дадзены Ryan Lundy 29 ліпеня '11 ў 01:22 2011-07-29 01:22

Мне спатрэбілася некаторы час, каб зразумець, так што, магчыма, гэта дапаможа каму-то ...

Існуе два спосабу "адмяніць" ваш апошні комм, у залежнасці ад таго, ці зрабіў вы агульнадаступны справаздачу (націснуў на выдалены рэпазітар):

Як адмяніць лакальную фіксацыю

Няхай кажуць, што я здзейсніў лакальна, але цяпер хачу выдаліць гэтую фіксацыю.

 git log commit 101: bad commit # latest commit, this would be called 'HEAD' commit 100: good commit # second to last commit, this is the one we want 

Каб аднавіць усё да таго, як гэта было да апошняга фіксацыі, нам трэба выканаць reset да фіксацыі перад HEAD :

 git reset --soft HEAD^ # use --soft if you want to keep your changes git reset --hard HEAD^ # use --hard if you don't care about keeping the changes you made changes git reset --soft HEAD^ # use --soft if you want to keep your changes git reset --hard HEAD^ # use --hard if you don't care about keeping the changes you made 

Цяпер git log пакажа, што наша апошняя фіксацыя была выдаленая.

Як адмяніць публічную фіксацыю

Калі вы ўжо зрабілі свае камітаў агульнадаступнымі, вам трэба будзе стварыць новы комм, які "верне" змены, унесеныя вамі ў папярэднюю фіксацыю (бягучы HEAD).

 git revert HEAD 

Зараз вашы змены будуць адменены і гатовыя да фіксацыі:

 git commit -m 'restoring the file I removed by accident' git log commit 102: restoring the file I removed by accident commit 101: removing a file we don't need commit 100: adding a file that we need 

Для атрымання дадатковай інфармацыі, азнаёмцеся з Асновамі Git - Адмяніць рэчы

1889
16 июня '11 в 20:27 2011-06-16 20:27 адказ дадзены Andrew 16 чэрвеня '11 у 20:27 2011-06-16 20:27

Дадаць / выдаліць файлы, каб атрымаць тое, што вы хочаце:

 git rm classdir git add sourcedir 

Затым зменіце фіксацыю:

 git commit --amend 

Папярэдні, памылковая фіксацыя будзе адрэдагавана, каб адлюстраваць новы стан індэкса - іншымі словамі, гэта будзе падобна на тое, што вы ніколі не рабілі памылку ў першую чаргу.

Звярніце ўвагу, што вы павінны зрабіць гэта толькі ў тым выпадку, калі вы яшчэ не націснулі. Калі вы націснулі, вам проста прыйдзецца здзейсніць выправіць нармальна.

1664
29 мая '09 в 21:16 2009-05-29 21:16 адказ дадзены bdonlan 29 мая '09 а 21:16 2009-05-29 21:16
926
29 мая '09 в 21:13 2009-05-29 21:13 адказ дадзены Lennart Koopmann 29 мая '09 у 21:13 2009-05-29 21:13

Каб змяніць апошняе фіксацыю

Заменіце файлы ў індэксе:

 git rm --cached *.class git add *.java 

Затым, калі гэта прыватны філіял, зменіце фіксацыю:

 git commit --amend 

Ці, калі гэта агульная галінка, выканайце новую фіксацыю:

 git commit -m 'Replace .class files with .java files' 


(Каб змяніць папярэднюю фіксацыю, выкарыстоўвайце дзіўную інтэрактыўную rebase )


ProTip ™: дадайце *.class ў gitignore, каб спыніць гэта паўтор.


Каб вярнуць фіксацыю

Змена камітаў - ідэальнае рашэнне, калі вам трэба змяніць апошняе комм, але reset больш агульнае рашэнне.

Вы можаце скінуць git на любы фіксатар з дапамогай:

 git reset @~N 

Дзе N - колькасць камітаў перад HEAD , а @~ вяртанне да папярэдняга фіксацыі.

Такім чынам, замест ўнясення змяненняў у комм вы можаце выкарыстаць:

 git reset @~ git add *.java git commit -m "Add .java files" 

Праверце git help reset , у прыватнасці раздзелы --soft --mixed і --hard , каб лепш зразумець, што гэта робіць.

Reflog

Калі вы сапсаваліся, вы заўсёды можаце выкарыстоўваць reflog, каб знайсці аддаленыя камітаў:

 $ git reset @~ $ git reflog c4f708b HEAD@{0}: reset: moving to @~ 2c52489 HEAD@{1}: commit: added some .class files $ git reset 2c52489 ... and you're back where you started 


707
31 июля '10 в 12:39 2010-07-31 12:39 адказ дадзены Zaz 31 ліпеня '10 ў 12:39 2010-07-31 00:39

Выкарыстоўваць git revert <commit-id>

Каб атрымаць ідэнтыфікатар фіксацыі, проста выкарыстоўвайце git log

589
25 мая '12 в 19:04 2012-05-25 19:04 адказ дадзены Jaco Pretorius 25 мая '12 у 19:04 2012-05-25 19:04

Калі вы плануеце цалкам адмяніць лакальную фіксацыю, незалежна ад таго, што вы змянілі, вы зрабілі ў фіксацыі, і калі вы нічога не хвалюецеся пра гэта, проста запусціце наступную каманду.

 git reset --hard HEAD^1 

(Гэтая каманда будзе ігнараваць усю вашу фіксацыю, і Вашае рэдагаваньне будзе цалкам страчаныя з вашага лакальнага працоўнага дрэва). Калі вы хочаце адмяніць фіксацыю, але хочаце ўнесці змены ў прамежкавую вобласць (перад фіксацыяй сапраўды гэтак жа, як пасля git add ), запусціце наступную каманду.

 git reset --soft HEAD^1 

Зараз вашы фіксаваныя файлы ўваходзяць у прамежкавую вобласць. Выкажам здагадку, што калі вы хочаце перавыканаць файлы, таму што вам трэба адрэдагаваць некарэктны кантэнт, запусціце наступную каманду

 git reset HEAD 

Цяпер перададзеныя файлы паступаюць з паэтапнай вобласці ў непастаўленую вобласць. Цяпер файлы гатовыя да рэдагавання, таму, што б вы ні змянілі, вы хочаце перайсці да рэдагавання і дадаць яго і стварыць новы / новы комм.

больш

472
31 янв. адказ дадзены Madhan Ayyasamy 31 студз. 2013-01-31 10:06 '13 у 10:06 2013/01/31 10:06

Калі ў вас ўстаноўлена Git Extras , вы можаце запусціць git undo каб адмяніць апошнюю фіксацыю. git undo 3 адмяняе апошнія 3 фіксацыі.

451
13 дек. адказ дадзены nickf 13 снеж. 2011-12-13 13:18 '11 у 13:18 2011-12-13 13:18

Я хацеў адмяніць апошнія 5 камітаў ў нашым агульным сховішчы. Я прагледзеў ідэнтыфікатар рэвізіі, да якога я хацеў адкат. Затым я набраў наступнае.

 prompt> git reset --hard 5a7404742c85 HEAD is now at 5a74047 Added one more page to catalogue prompt> git push origin master --force Total 0 (delta 0), reused 0 (delta 0) remote: bb/acl: neoneye is allowed. accepted payload. To git@bitbucket.org:thecompany/prometheus.git + 09a6480...5a74047 master -> master (forced update) prompt> page to catalogue prompt> git reset --hard 5a7404742c85 HEAD is now at 5a74047 Added one more page to catalogue prompt> git push origin master --force Total 0 (delta 0), reused 0 (delta 0) remote: bb/acl: neoneye is allowed. accepted payload. To git@bitbucket.org:thecompany/prometheus.git + 09a6480...5a74047 master -> master (forced update) prompt> 
419
06 апр. адказ дадзены neoneye 06 крас. 2012-04-06 16:58 '12 у 16:58 2012-04-06 16:58

Я аддаю перавагу выкарыстоўваць git rebase -i для гэтага задання, таму што з'яўляецца добры спіс, дзе я магу выбраць камітаў, каб пазбавіцца. Гэта можа быць не так прама, як некаторыя іншыя адказы тут, але гэта проста здаецца правільным.

Выберыце колькасць камітаў, якія вы хочаце пералічыць, затым выклічце гэта (каб забраць апошнія тры)

 git rebase -i HEAD~3 

прыкладны спіс

 pick aa28ba7 Sanity check for RtmpSrv port pick c26c541 RtmpSrv version option pick 58d6909 Better URL decoding support 

Затым Git выдаліць фіксацыі для любой выдалянай радка.

397
25 окт. адказ дадзены Steven Penny 25 каст. 2012-10-25 06:41 '12 у 06:41 2012/10/25 06:41

Як выправіць папярэдні лакальны комм

Выкарыстоўвайце git-gui (ці аналагічны) для выканання git commit --amend . З графічнага інтэрфейсу вы можаце дадаваць або выдаляць асобныя файлы з камітаў. Вы таксама можаце змяніць паведамленне камітаў.

Як адмяніць папярэдні лакальны комм

Проста вярніце сваю галінку ў папярэдняе месцазнаходжанне (напрыклад, выкарыстоўваючы gitk або git rebase ). Затым паўторна ўжыеце змены з захаванай копіі. Пасля зборкі смецця ў вашым лакальным сховішча будзе падобна на тое, што непажаданы комм ніколі не адбываўся. Каб зрабіць усё гэта ў адной камандзе, выкарыстоўвайце git reset HEAD~1 .

Слова папярэджання: неасцярожнае выкарыстанне git reset - добры спосаб прывесці вашу рабочую копію ў заблытаная стан. Я рэкамендую пачаткоўцам Git пазбягаць гэтага, калі яны могуць.

Як адмяніць публічны комм

Выканайце зваротны выбар вішні ( git-revert ), каб адмяніць змены.

Калі вы яшчэ не ўнеслі іншыя змены ў сваю галінку, вы можаце проста зрабіць ...

 git revert --no-edit HEAD 

Затым адпраўце абноўленую галінку ў агульны рэпазітар.

Гісторыя камітаў пакажа абодва камітаў асобна.


Дадаткова: выпраўленне прыватнай галінкі ў публічным сховішча

Гэта можа быць небяспечна - пераканайцеся, што ў вас ёсць лакальная копія адгалінаванні.

Таксама зьвярніце ўвагу: вы не хочаце рабіць гэта, калі хто-то яшчэ працуе над галінкай.

 git push --delete (branch_name) ## remove public version of branch 

Ачысціце сваю галінку лакальна, затым Адпіхні ...

 git push origin (branch_name) 

У нармальным выпадку вам, верагодна, не трэба турбавацца аб тым, што ваша гісторыя камітаў ў прыватнай галінцы будзе некранутай. Проста націсніце наступны комм (гл. "Як адмяніць публічны комм" вышэй), а затым выканаеце сквош-зліццё, каб схаваць гісторыю.

382
23 апр. адказ дадзены nobar 23 крас. 2013-04-23 20:27 '13 у 20:27 2013/04/23 20:27

Калі вы здзейснілі памылку, але не націснулі,

 git reset --soft HEAD~1 

HEAD ~ 1 з'яўляецца скарачэннем для фіксацыі перад галавой. У якасці альтэрнатывы вы можаце звярнуцца да SHA-1 хэша, калі вы хочаце скінуць яго. --soft выдаліць комм, але ён пакіне ўсе вашы змененыя файлы "Змены будуць здзейсненыя", як сказаў бы статус git.

Калі вы хочаце пазбавіцца ад любых змяненняў у адсочваных файлах ў працоўным дрэве, так як фіксацыя перад голасам выкарыстоўвае "--hard".

АБО

Калі вы ўжо націснулі, і хто-то пацягнуў, што звычайна з'яўляецца маёй справай, вы не можаце выкарыстоўваць скід git. Аднак вы можаце зрабіць git revert,

 git revert HEAD 

Гэта створыць новую фіксацыю, якая адмяняе ўсе, уведзенае выпадковым фіксацыяй.

307
03 сент. адказ дадзены santos_mgr 03 сент. 2014-09-03 10:15 '14 у 10:15 2014/09/03 10:15

Калі вы хочаце канчаткова адмяніць яго, і вы кланавалі некаторы рэпазітар

Ідэнтыфікатар фіксацыі можна ўбачыць

 git log 

Тады вы можаце зрабіць -

 git reset --hard <commit_id> git push origin <branch_name> -f 
303
17 мая '13 в 16:02 2013-05-17 16:02 адказ дадзены poorva 17 мая '13 у 16:02 2013/05/17 16:02

У SourceTree (GUI для GitHub) вы можаце пстрыкнуць правай кнопкай мышы фіксацыю і выканаць "Зваротны фиксат". Гэта павінна адмяніць вашыя змены.

На тэрмінале:

Вы таксама можаце выкарыстаць:

 git revert 

альбо:

256
28 июня '13 в 13:18 2013-06-28 13:18 адказ дадзены Varun Parakh 28 чэрвеня '13 у 13:18 2013/06/28 13:18

Адзіная каманда:

241
05 марта '14 в 16:55 2014-03-05 16:55 адказ дадзены Manish Shrivastava 05 сакавіка '14 У 16:55 2014/03/05 16:55

Проста скіньце яго, выканаўшы каманду ніжэй, выкарыстоўваючы git :

 git reset --soft HEAD~1 

Растлумачце: што робіць git reset , ён у асноўным reset на любы фіксатар, на які вы хочаце вярнуцца, тады, калі вы аб'яднаеце яго з --soft , ён вернецца, але захавае змены ў вашых файлах, таму вы вернецеся на сцэну, у якую быў дададзены файл, HEAD - кіраўнік галінкі, і калі вы аб'яднаецеся з ~1 (у гэтым выпадку вы таксама карыстаецеся HEAD^ ), ён вернецца толькі да адной камандзе, якую вы хочаце ...

Я ствараю крокі на малюнку ніжэй больш падрабязна для вас, уключаючы ўсе крокі, якія могуць адбыцца ў рэальных сітуацыях і здзяйсненне кода:

2019

Як адмяніць апошні Git?

Каб аднавіць усё да таго, як гэта было да апошняга фіксацыі, нам трэба скінуць фіксацыю да HEAD.

  1. Калі вы не хочаце захоўваць свае змены, якія вы зрабілі:

     git reset --hard HEAD^ 
  2. Калі вы хочаце захаваць свае змены:

     git reset --soft HEAD^ 

Цяпер праверце свой часопіс git. Ён пакажа, што наша апошняя фіксацыя была выдаленая.

214
23 апр. адказ дадзены Ranjithkumar Ravi 23 крас. 2014-04-23 14:21 '14 у 14:21 2014/04/23 14:21

Выкарыстоўвайце reflog, каб знайсці правільнае стан

 git reflog 

2019

172
07 янв. адказ дадзены Shubham Chaudhary 07 студз. 2014-01-07 01:34 '14 у 1:34 2014/01/07 01:34

"Скінуць працоўнае дрэва да апошняга фіксацыі"

 git reset --hard HEAD^ 

"Ачысціць невядомыя файлы ад працоўнага дрэва"

 git clean 

см. - Кароткая спасылка Git

ЗАЎВАГА. Гэтая каманда выдаліць папярэднюю фіксацыю, таму выкарыстоўвайце яе з асцярогай! git reset --hard бяспечней -

167
03 окт. адказ дадзены Ravi_Parmar 03 каст. 2013-10-03 15:43 '13 у 15:43 2013/10/03 15:43

Першы забег:

 git reflog 

Ён пакажа вам усе магчымыя дзеянні, якія вы выканалі ў сваім рэпазітары, напрыклад, commit, merge, pull і г.д.

Затым выканаеце:

 git reset --hard ActionIdFromRefLog 
150
11 окт. адказ дадзены U. Ali 11 каст. 2013-10-11 17:41 '13 у 17:41 2013/10/11 17:41

Адмяніць апошняе комм:

git reset --soft HEAD^ або git reset --soft HEAD~

Гэта прывядзе да адмены апошняга фіксацыі.

Тут --soft азначае скід налад.

HEAD~ або HEAD^ азначае пераход да фіксацыі перад HEAD.


Замяніць апошнюю фіксацыю на новую фіксацыю:

 git commit --amend -m "message" 

Ён заменіць апошняе комм новым фіксатарам.

141
06 марта '16 в 14:53 2016-03-06 14:53 адказ дадзены akshay_rahar 06 сакавіка '16 у 14:53 2016/03/06 14:53

Іншы шлях:

Аформіце заяўку на філіял, які хочаце вярнуць, затым вярніце лакальную працоўную копію назад на комм, які вы хочаце быць апошнім на выдаленым серверы (усе пасля таго, як яно пройдзе да пабачэння). Для гэтага ў SourceTree я пстрыкнуў правай кнопкай мышы і абраў "Скінуць BRANCHNAME на гэта комм".

Затым перайдзіце ў лакальны каталог рэпазітара і запусціце наступную каманду:

 git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME 

Гэта прывядзе да выдалення ўсіх камітаў пасля бягучага ў лакальным рэпазітары, але толькі для адной галінкі.

136
13 мая '13 в 20:12 2013-05-13 20:12 адказ дадзены CommaToast 13 мая '13 у 20:12 2013/05/13 20:12

Увядзіце git log і знайдзіце апошні код хэшавання і ўвядзіце:

 git reset <the previous co> 
127
15 мая '13 в 16:12 2013-05-15 16:12 адказ дадзены user853293 15 мая '13 у 16:12 2013/05/15 16:12

У маім выпадку я выпадкова здзейсніў некаторыя файлы, якія я не хацеў. Таму я зрабіў наступнае, і гэта спрацавала:

 git reset --soft HEAD^ git rm --cached [files you do not need] git add [files you need] git commit -c ORIG_HEAD 

Праверце вынікі з дапамогай gitk або git log --stat

124
18 июля '13 в 9:41 2013-07-18 09:41 адказ дадзены egridasov 18 ліпеня '13 г. ў 9:41 2013/07/18 09:41

Выкарыстоўвайце SourceTree (графічны інструмент для Git), каб убачыць вашыя камітаў і дрэва. Вы можаце ўручную скінуць яго, пстрыкнуўшы правай кнопкай мышы.

113
29 авг. адказ дадзены iOS Coder 29 жнів. 2013-08-29 19:18 '13 у 19:18 2013/08/29 19:18

Каб вярнуцца да папярэдняй рэвізіі, назаўжды выдаліце ​​ўсе незафіксаваных змены:

 git reset --hard HEAD~1 
111
28 авг. адказ дадзены thestar 28 жнів. 2014-08-28 19:03 '14 у 19:03 2014/08/28 19:03

Існуе два асноўных сцэнара

Вы яшчэ не націснулі фіксацыю

Калі праблема звязана з дадатковымі файламі, якія вы здзейснілі (і вы не жадаеце іх выкарыстоўваць у рэпазітары), вы можаце выдаліць іх з дапамогай git rm а затым --amend з --amend

 git rm <pathToFile> 

Вы таксама можаце выдаліць цэлыя каталогі з дапамогай -r ці нават аб'яднаць з іншымі камандамі Bash

 git rm -r <pathToDirectory> git rm $(find -name '*.class') 

Пасля выдалення файлаў вы можаце зафіксаваць з дапамогай опцыі --amend

 git commit --amend -C HEAD # the -C option is to use the same commit message 

Гэта дазволіць перапісаць нядаўні лакальны комм, выдаліўшы лішнія файлы, таму гэтыя файлы ніколі не будуць адпраўляцца на push, а таксама будуць выдаленыя з вашага лакальнага репозитория.git праз GC.

Вы ўжо націснулі на фіксацыю

Вы можаце ўжыць адно і тое ж рашэнне іншага сцэнара, а затым выканаць git push з -f опцыі -f , але гэта не рэкамендуецца, так як ён перазапісвае выдаленую гісторыю з разбежным зменай (гэта можа сапсаваць ваш рэпазітар).

Замест гэтага вам неабходна выканаць фіксацыю без --amend (памятаеце пра гэта -amend ": гэты варыянт перазапісвае гісторыю апошняга камітаў).

111
12 сент. адказ дадзены dseminara 12 сент. 2014-09-12 17:51 '14 у 17:51 2014/09/12 17:51

Для лакальнай фіксацыі

 git reset --soft HEAD~1 

або калі вы дакладна не памятаеце, у якой фіксацыі гэта магчыма, вы можаце выкарыстоўваць

 git rm --cached <file> 

Для націснутай фіксацыі

Правільны спосаб выдалення файлаў з гісторыі рэпазітара - выкарыстанне git filter-branch . Гэта значыць,

раздзеле git-filter-branch (1) Manual . 

111
ответ дан geoom 04 марта '14 в 7:35 2014-03-04 07:35