Как да отмените последните ангажименти в git?

Случайно изпратих неправилни файлове в Git , но все още не съм изпратил ангажимент към сървъра.

Как мога да анулирам тези команди от локалното хранилище?

18990
29 мая '09 в 21:09 2009-05-29 21:09 Хамза Йерликая попита 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

Анулирането на поемането е малко страшно, ако не знаете как работи. Но всъщност е изненадващо лесно, ако разбирате.

Да речем, че го имате, където С е вашата HEAD, и (F) е състоянието на вашите файлове.

  (F) ABC ↑ master 

Искаш да рестартираш заданието C и никога повече да не го видиш . Правите това:

 git reset --hard HEAD~1 

резултат:

  (F) AB ↑ master 

Сега B - HEAD. Тъй като сте използвали --hard , вашите файлове се връщат в състоянието си, когато извършите B.

Ах, но предположим, че коммитирането на C не е катастрофа, но доста малко. Искате да анулирате ангажимент, но запазете промените си за малка редакция, преди да направите най-доброто предаване. Започваме оттук, като C като главата ви:

  (F) ABC ↑ master 

Можете да направите това, като напуснете:

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 отговорът е даден от Райън Лунди 29 юли '11 в 1: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 

Сега 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 Basics - Cancel Things.

1889
16 июня '11 в 20:27 2011-06-16 20:27 отговорът е даден от Андрю на 16 юни 2009 г. в 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' 


(за да промените предишния ангажимент , използвайте невероятна интерактивна ребаза )


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 , по-специално, --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 12: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 екстри , можете да стартирате git undo да отмените последното фиксиране. git undo 3 отменя последните 3 коммита.

451
13 дек. отговорът се дава nickf 13 dec. 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> 
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 окт. Отговор, даден от Стивън Пени на 25 октомври 2012-10-25 06:41 '12 в 6:41 ч. 2012-10-25 06:41

Как да се поправи предишното местно поемане

Използвайте git-gui (или еквивалент), за да извършите git commit --amend . От GUI можете да добавяте или премахвате отделни файлове от коммита. Можете също да промените съобщението за фиксиране.

Как да отмените предишното локално поемане

Просто върнете клона на предишното му местоположение (например, използвайки 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 апр. отговорът е даден на нибар 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 status.

Ако искате да се отървете от всякакви промени в наблюдаваните файлове в работното дърво, тъй като ангажиментът преди гласът използва " --hard ".

ИЛИ

Ако вече сте кликнали и някой е изтеглен, което обикновено е моя работа, не можете да използвате git reset. Можете обаче да го направите,

 git revert HEAD 

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

307
03 сент. отговорът е даден santos_mgr 03 sep . 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 отговорът е даден от badva на 17 май '13 в 4:02 2013-05-17 16:02

В SourceTree (GUI за GitHub) можете да щракнете с десния бутон върху ангажимента и да изпълните Reverse Fix. Това трябва да отмени промените ви.

На терминала:

Можете също да използвате:

 git revert 

или:

256
28 июня '13 в 13:18 2013-06-28 13:18 отговорът е даден от Варун Парах на 28 юни'13 в 13:18 2013-06-28 13:18

Единичен екип:

241
05 марта '14 в 16:55 2014-03-05 16:55 отговорът е даден от Маниш Шривастава на 05.03.2014 г. в 16:55 2014-03-05 16:55

Просто го нулирайте, като изпълните командата по-долу, използвайки git :

 git reset --soft HEAD~1 

Обяснете, че това, което git reset прави, е основно reset на всяко --soft което искате да се върнете, след това, ако го обедините с --soft , то ще се върне, но запазете промените във вашите файлове, така че ще се върнете на сцената, където Добавен е файл, HEAD е главата на клона, и ако се комбинира с ~1 (в този случай, вие също използвате HEAD^ ), той ще се върне само към една команда, която искате ...

Създавам по-подробно стъпките в изображението по-долу, включително всички стъпки, които могат да се случат в реални ситуации и изпълнението на кода:

2019

Как да отмените последното git?

За да възстановите всичко, преди да е било преди последното фиксиране, трябва да рестартираме fix към HEAD.

  1. Ако не искате да запазите направените от вас промени:

     git reset --hard HEAD^ 
  2. Ако искате да запазите промените си:

     git reset --soft HEAD^ 

Сега проверете дневника си. Ще покаже, че последното ни поправка е премахнато.

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 Oct 03. 2013-10-03 15:43 '13 в 15:43 2013-10-03 15:43

Първо пускане:

 git reflog 

Той ще ви покаже всички възможни действия, които сте извършили в хранилището си, например, ангажиране, сливане, издърпване и др.

Тогава направете:

 git reset --hard ActionIdFromRefLog 
150
11 окт. отговорът е даден от У. Али на 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 март 2016 г. в 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 aug. 2013-08-29 19:18 '13 в 19:18 2013-08-29 19:18

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

 git reset --hard HEAD~1 
111
28 авг. отговорът е даден от thestar 28 aug. 2014-08-28 19:03 '14 в 19:03 2014-08-28 19:03

Има два основни сценария.

Не сте натиснали коммита

Ако проблемът е свързан с допълнителни файлове, които сте ангажирали (и не искате да ги използвате в хранилището), можете да ги изтриете с git rm и след това --amend with --amend

 git rm <pathToFile> 

Можете също да изтриете цели директории с -r или дори да се слеете с други bash команди.

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

След изтриването на файловете, можете да се ангажирате с опцията --andend

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

Това ще ви позволи да презапишете скорошно локално поемане, премахване на ненужни файлове, така че тези файлове никога няма да бъдат изпратени да натискат и също ще бъдат изтрити от вашия локален .git хранилище чрез GC.

Вече сте кликнали върху ангажимент

Можете да приложите същото решение към различен скрипт и след това да стартирате git push с опцията -f в -f , но това не се препоръчва, тъй като презаписва изтритата история с различна промяна (това може да повреди хранилището).

Вместо това трябва да се ангажирате без --amend (запомнете това - amend): тази опция презаписва историята на последното --amend .

111
12 сент. отговорът е даден на 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) . 

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

Има много начини да направите това:

Команда Git за отмяна на последното фиксиране / предишни корекции:

Предупреждение: Не используйте --hard, если вы не знаете, что делаете. --hard слишком опасен , и он может удалить ваши файлы.

Основная команда для отмены фиксации в Git:

 $ git reset --hard <COMMIT -ID> 

или

 $ git reset --hard HEAD~<n> 

COMMIT-ID : идентификатор для фиксации

n: число последних коммитов, которые вы хотите вернуть