border=0

"77.95.5.4 - 77.95.5.4"

Hoe maak ik recente commits in git ongedaan?

Ik stuurde per ongeluk de verkeerde bestanden naar Git , maar ik heb nog geen commit naar de server gestuurd.

Hoe kan ik deze commits annuleren vanuit de lokale repository?

18990
29 мая '09 в 21:09 2009-05-29 21:09 Hamza Yerlikaya vroeg op 29 mei '09 om 21:09 uur 2009-05-29 21:09 uur
@ 92 antwoorden

Ongedaan maken en opnieuw uitvoeren

U kunt ook naar dit antwoord kijken:

Hoe verplaats je het hoofd naar de vorige plaats? (Enkele kop)

Het bovenstaande antwoord zal je de git reflog l laten git reflog die wordt gebruikt om erachter te komen wat SHA-1 is, waarnaar je wilt terugkeren. Nadat u het punt hebt gevonden waarop u wilt annuleren, gebruikt u de opdrachtreeks zoals hierboven beschreven.


1 Merk echter op dat u niet terug hoeft naar een eerdere oplossing als u zojuist een fout hebt gemaakt in uw commit-bericht. Een eenvoudigere optie is om een git reset te voeren (om alle wijzigingen ongedaan te maken die je sindsdien hebt gemaakt), en git commit --amend , dat je standaard message-editor opent, vooraf ingevuld met het laatste commit-bericht.

20501
29 мая '09 в 21:13 2009-05-29 21:13 antwoord gegeven door Esko Luontola 29 mei 09 om 21:13 2009-05-29 21:13

Het annuleren van een commit is een beetje eng als je niet weet hoe het werkt. Maar het is eigenlijk verrassend eenvoudig, als je het begrijpt.

Laten we zeggen dat je het hebt, waar C je HEAD is, en (F) de status van je bestanden.

  (F) ABC ↑ master 

U wilt commit C opnieuw instellen en nooit meer zien . Je doet dit:

 git reset --hard HEAD~1 

resultaat:

  (F) AB ↑ master 

Nu B - HOOFD. Omdat je --hard hebt gebruikt, keren je bestanden terug naar hun staat wanneer je B. commit.

Ah, maar stel dat commit C geen ramp is, maar nogal een beetje. U wilt een commit annuleren, maar sla uw wijzigingen op voor een kleine bewerking voordat u de beste commit maakt. Hier opnieuw beginnen, met C als uw hoofd:

  (F) ABC ↑ master 

Je kunt dit doen door --hard :

 git reset HEAD~1 

In dit geval is het resultaat:

  (F) ABC ↑ master 

In beide gevallen is HEAD slechts een verwijzing naar de laatste commit. Als je Git git reset HEAD~1 , dan zeg je Git om de HEAD pointer één commit terug te zetten. Maar (tenzij u --hard ) gebruikt, laat u uw bestanden zoals ze waren. De git status toont nu de veranderingen die je hebt geregistreerd in C. Je bent niets kwijt!

Voor een lichte aanslag kun je zelfs ontgrendelen, maar laat je je bestanden en index achter :

 git reset --soft HEAD~1 

Dit laat niet alleen uw bestanden achter, maar laat zelfs uw index met rust. Als je de git status , zul je zien dat de index dezelfde bestanden bevat als voorheen. In feite kun je direct na dit commando git commit uitvoeren en je dezelfde commit opnieuw uitvoeren die je net had.

Nog een ding: stel dat je een commit hebt vernietigd, zoals in het eerste voorbeeld, maar toen ontdekte je dat je het op het einde nodig hebt ? Geen geluk, toch?

Nee, er is nog steeds een manier om het terug te krijgen. Typ git reflog en je ziet een lijst met (gedeeltelijk) commit ShAS (dat is hash) die je hebt verplaatst om de commit te vinden die je hebt vernietigd, en doe het.

 git checkout -b someNewBranchName shaYouDestroyed 

Je hebt deze commit nu herrezen. Commissies worden niet echt vernietigd in Git voor ongeveer 90 dagen, dus je kunt meestal terugkeren en een opslaan die je niet kwijt wilde.

10099
29 июля '11 в 1:22 2011-07-29 01:22 het antwoord wordt gegeven door Ryan Lundy 29 juli '11 op 1:22 2011-07-29 01:22

Het kostte me wat tijd om het te begrijpen, dus misschien zou het iemand helpen ...

Er zijn twee manieren om je laatste commit "ongedaan te maken", afhankelijk van of je een openbaar rapport hebt gemaakt (geklikt op de externe repository):

Hoe een lokale commit te annuleren

Laat het gezegd worden dat ik het lokaal heb gemaakt, maar nu wil ik deze fixatie verwijderen.

 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 

Om alles te herstellen voordat het vóór de laatste commit was, moeten we een reset uitvoeren voordat we 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 

Nu zal git log tonen dat onze laatste commit is verwijderd.

Hoe een openbare oplossing te annuleren

Als je je commits al publiekelijk beschikbaar hebt gemaakt, moet je een nieuwe commit maken die de wijzigingen die je hebt aangebracht in de vorige commit (de huidige HEAD) "retourneert".

 git revert HEAD 

Nu worden uw wijzigingen ongedaan gemaakt en zijn ze klaar om te worden vastgelegd:

 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 

Ga voor meer informatie naar Git Basics - Cancel Things.

1889
16 июня '11 в 20:27 2011-06-16 20:27 het antwoord wordt gegeven door Andrew op 16 juni 11 om 20:27 2011-06-16 20:27

Voeg bestanden toe of verwijder ze om te krijgen wat je wilt:

 git rm classdir git add sourcedir 

Verander dan de commit:

 git commit --amend 

De vorige foutieve correctie wordt bewerkt om de nieuwe staat van de index weer te geven. Met andere woorden, het lijkt erop dat u nooit een fout hebt gemaakt.

Houd er rekening mee dat u dit alleen moet doen als u nog niet hebt geklikt. Als je hebt geklikt, hoef je je alleen nog maar te binden om het op de normale manier op te lossen.

1664
29 мая '09 в 21:16 2009-05-29 21:16 het antwoord wordt gegeven door bdonlan op 29 mei '09 om 21:16 2009-05-29 21:16
926
29 мая '09 в 21:13 2009-05-29 21:13 het antwoord wordt gegeven door Lennart Koopmann op 29 mei '09 om 21:13 januari 2009 21:29

Om de laatste commit te veranderen

Vervang bestanden in de index:

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

Als het een private branch is, verander dan de commit:

 git commit --amend 

Of, als dit een gedeelde branch is, voer dan een nieuwe commit uit:

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


( om de vorige commit te veranderen , gebruik een geweldige interactieve rebase )


ProTip ™: voeg *.class .class toe aan gitignore om deze herhaling te stoppen.


Om een ​​fix terug te sturen

Het veranderen van een commit is een ideale oplossing als je de laatste commit moet veranderen, maar reset algemenere oplossing.

Je kunt git naar elke fixture resetten met:

 git reset @~N 

Waarbij N het aantal commits vóór HEAD , en @~ teruggaat naar de vorige commit.

Dus in plaats van wijzigingen aan te brengen in een commit, kunt u het volgende gebruiken:

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

Controleer git help reset , met name de --soft --mixed en --mixed --hard om beter te begrijpen wat het doet.

reflog

Als je een fout maakt, kun je altijd reflog gebruiken om commits op afstand te vinden:

 $ 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 het antwoord wordt gegeven Zaz 31 juli '10 om 12:39 2010-07-31 12:39

Gebruik git revert <commit-id>

Gebruik git log om een ​​fix id te krijgen

589
25 мая '12 в 19:04 2012-05-25 19:04 het antwoord wordt gegeven door Jaco Pretorius 25 mei '12 om 19:04 uur 2012-05-25 19:04 uur

Als u van plan bent de lokale commit volledig te annuleren, ongeacht wat u hebt gewijzigd, hebt u een commit gemaakt en als u zich daar geen zorgen over maakt, voert u gewoon de volgende opdracht uit.

 git reset --hard HEAD^1 

(Deze opdracht negeert al uw verplichtingen en uw wijzigingen zullen volledig verloren gaan van uw lokale werkboom). Als je een commit wilt annuleren, maar je wilt wijzigingen aanbrengen in het faseringsgebied (voordat je commit, net zoals na git add ), voer je de volgende opdracht uit.

 git reset --soft HEAD^1 

Nu bevinden uw vaste bestanden zich in het verzamelgebied. Stel dat u de volgende opdracht uitvoert als u bestanden wilt overvullen omdat u de onjuiste inhoud moet bewerken

 git reset HEAD 

De overgedragen bestanden komen nu van het gefaseerde gebied naar het niet-bezorgde gebied. Nu zijn de bestanden klaar om te bewerken, dus wat u ook verandert, u wilt naar bewerken gaan en het toevoegen en een nieuwe / nieuwe commit maken.

grotere

472
31 янв. het antwoord is Madhan Ayyasamy gegeven 31 januari 2013-01-31 10:06 '13 om 10:06 2013-01-31 10:06

Als je Git Extras hebt geïnstalleerd, kun je git undo om de laatste commit git undo te maken. git undo 3 maakt de laatste 3 commits git undo 3 .

451
13 дек. het antwoord wordt gegeven nickf 13 dec. 2011-12-13 13:18 '11 om 13:18. 2011-12-13 13:18

Ik wilde de laatste 5 commits annuleren in onze gedeelde repository. Ik heb gekeken naar de revisie-id waarnaar ik terug wilde. Daarna typte ik het volgende.

 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 апр. het antwoord wordt gegeven neoneye 06 apr. 2012-04-06 16:58 '12 om 16:58 uur 2012-04-06 16:58

Ik geef er de voorkeur aan om git rebase -i voor deze taak te gebruiken, omdat er een goede lijst is waar ik commits kan selecteren om van af te komen. Het is misschien niet zo eenvoudig als sommige van de andere antwoorden hier, maar het lijkt gewoon goed.

Selecteer het aantal commits dat u wilt opsommen en bel het (om de laatste drie op te halen)

 git rebase -i HEAD~3 

Voorbeeldlijst

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

Git zal dan de commit verwijderen voor elke regel die verwijderd moet worden.

397
25 окт. Antwoord van Steven Penny op 25 oktober 2012-10-25 06:41 '12 om 06:41 uur 2012-10-25 06:41

Hoe vorige lokale commit te herstellen

Gebruik git-gui (of equivalent) om git commit --amend te voeren. Vanuit de GUI kunt u afzonderlijke bestanden van de commit toevoegen of verwijderen. U kunt ook het commit-bericht wijzigen.

Hoe vorige lokale commit te annuleren

gitk gewoon je branch terug op zijn vorige locatie (bijvoorbeeld met gitk of git rebase ). Breng vervolgens de wijzigingen opnieuw aan in de opgeslagen kopie. Nadat garbage collection in je lokale opslag zal zijn als het feit dat ongewenste commit nooit heeft plaatsgevonden. Gebruik git reset HEAD~1 om dit alles in één commando te doen.

Een woord van waarschuwing : onzorgvuldig gebruik van git reset is een goede manier om je werkkopie te verwarren. Ik raad Git aan aan newbies om dit te voorkomen als ze dat kunnen.

Hoe een openbare commit te annuleren

Keer reverse cherry ( git-revert ) om wijzigingen te annuleren.

Als je nog geen andere wijzigingen in je thread hebt aangebracht, kun je gewoon ...

 git revert --no-edit HEAD 

Stuur vervolgens de bijgewerkte vertakking naar de algemene repository.

De commit-geschiedenis toont beide commits afzonderlijk.


Optioneel: fixeer privétak in openbare repository

Dit kan gevaarlijk zijn - zorg dat je een lokale kopie van het filiaal hebt.

Let ook op: dit wil je niet doen als iemand anders aan het filiaal werkt.

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

Ruim uw filiaal lokaal op en druk vervolgens op ...

 git push origin (branch_name) 

In het normale geval hoeft u zich waarschijnlijk geen zorgen te maken dat uw commit-geschiedenis in een privékantoor onaangetast blijft. Raak gewoon een volgende commit aan (zie "Hoe een openbare commit annuleren" hierboven), en voeg vervolgens een squash samen voeg toe om het verhaal te verbergen.

382
23 апр. het antwoord is gegeven nobar 23 april 2013-04-23 20:27 '13 om 20:27 uur 2013-04-23 20:27

Als je een fout hebt gemaakt, maar niet hebt geklikt,

 git reset --soft HEAD~1 

HEAD ~ 1 is een afkorting voor bevestiging voor het hoofd. Als alternatief kunt u de SHA-1- hash raadplegen als u deze wilt resetten. --soft zal de commit verwijderen, maar het laat al je gewijzigde bestanden achter "Veranderingen zullen gemaakt worden", zoals git status zou zeggen.

Als u zich wilt ontdoen van eventuele wijzigingen in de bewaakte bestanden in de werkboom, aangezien de commit voor de stem " --hard " gebruikt.

OR

Als je al hebt geklikt en iemand hebt getrokken, wat meestal mijn zaak is, kun je git reset niet gebruiken. Je kunt echter git revert doen,

 git revert HEAD 

Hiermee wordt een nieuwe fix gemaakt, die alles wat door een willekeurige fix is ​​ingevoerd, annuleert.

307
03 сент. het antwoord wordt gegeven santos_mgr 03 sep . 2014-09-03 10:15 '14 om 10:15 uur 2014-09-03 10:15 uur

Als je het permanent wilt annuleren en je hebt een repository gekloond

De fix-ID kan worden bekeken.

 git log 

Dan kun je doen -

 git reset --hard <commit_id> git push origin <branch_name> -f 
303
17 мая '13 в 16:02 2013-05-17 16:02 het antwoord wordt gegeven door poorva 17 mei '13 om 4:02 2013-05-17 16:02

In SourceTree (GUI voor GitHub), kunt u met de rechtermuisknop op de commit klikken en Reverse Fix uitvoeren. Dit zou uw wijzigingen ongedaan moeten maken.

Op de terminal:

Je kunt ook gebruiken:

 git revert 

of:

256
28 июня '13 в 13:18 2013-06-28 13:18 het antwoord wordt gegeven door Varun Parakh op 28 '13 -13 om 13:18 2013-06-28 13:18

Eén team:

241
05 марта '14 в 16:55 2014-03-05 16:55 het antwoord wordt gegeven door Manish Shrivastava op 05 maart '14 om 16:55 uur 2014-03-05 16:55

Reset het gewoon door de onderstaande opdracht uit te voeren met behulp van git :

 git reset --soft HEAD~1 

Leg uit dat wat git reset doet in principe wordt reset naar elke --soft waarnaar je wilt terugkeren, en als je het samenvoegt met --soft , zal het terugkeren, maar sla je de wijzigingen in je bestanden op, zodat je terugkeert naar de scène waar een bestand is toegevoegd, HEAD is de kop van de branch, en als je combineert met ~1 (in dit geval gebruik je HEAD^ ), zal het alleen terugkeren naar één commando dat je wilt ...

Ik maak de stappen in de afbeelding hieronder voor u in meer detail, inclusief alle stappen die kunnen plaatsvinden in reële situaties en de uitvoering van de code:

2019

Hoe de laatste git te annuleren?

Om alles te herstellen voordat het voor de laatste commit was, moeten we de fix opnieuw instellen op HEAD.

  1. Als u uw wijzigingen niet wilt opslaan, hebt u het volgende gedaan:

     git reset --hard HEAD^ 
  2. Als u uw wijzigingen wilt opslaan:

     git reset --soft HEAD^ 

Controleer nu je git-logboek. Het zal aantonen dat onze laatste fix is ​​verwijderd.

214
23 апр. het antwoord wordt gegeven aan Ranjithkumar Ravi op 23 april 2014-04-23 14:21 '14 om 14:21 2014-04-23 14:21

Gebruik een reflog om de juiste status te vinden.

 git reflog 

2019

172
07 янв. antwoord gegeven door Shubham Chaudhary 07 jan 2014-01-07 01:34 '14 om 1:34 2014-01-07 01:34

"Reset de werkboom voor de laatste commit"

 git reset --hard HEAD^ 

"Wis onbekende bestanden uit de werkboom"

 git clean 

zie - Git quick reference

NOTE. Dit commando zal de vorige commit verwijderen, dus gebruik het met voorzichtigheid! git reset --hard veiliger -

167
03 окт. antwoord gegeven Ravi_Parmar 03 oktober. 2013-10-03 15:43 '13 om 15:43 2013-10-03 15:43

Eerste run:

 git reflog 

Het zal je alle mogelijke acties tonen die je in je repository hebt uitgevoerd, bijvoorbeeld commit, merge, pull, etc.

Doe dan:

 git reset --hard ActionIdFromRefLog 
150
11 окт. het antwoord wordt gegeven door U. Ali op 11 oktober. 2013-10-11 17:41 '13 om 17:41 2013-10-11 17:41

Laatste commit annuleren:

git reset --soft HEAD^ of git reset --soft HEAD~

Dit maakt de laatste commit ongedaan.

Hier --soft betekent opnieuw instellen.

HEAD~ of HEAD^ betekent naar een commit gaan voor de HEAD.


Vervang de laatste commit door een nieuwe:

 git commit --amend -m "message" 

Het zal de laatste commit vervangen door een nieuwe fixer.

141
06 марта '16 в 14:53 2016-03-06 14:53 het antwoord is gegeven akshay_rahar 06 maart '16 om 14:53 2016-03-06 14:53

Een andere manier:

Maak een aanvraag voor de vestiging die u wilt retourneren en stuur vervolgens de lokale werkkopie terug naar de commit die u als laatste op de externe server wilt plaatsen (en alles na deze doei). Om dit te doen, klikte ik met de rechtermuisknop in SourceTree en koos ik "Reset BRANCHNAME naar deze commit".

Ga vervolgens naar de lokale repository-directory en voer de volgende opdracht uit:

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

Hiermee worden alle commits verwijderd na de huidige in de lokale repository, maar alleen voor één filiaal.

136
13 мая '13 в 20:12 2013-05-13 20:12 het antwoord is gegeven CommaToast 13 mei '13 om 20:12 uur 2013-05-13 20:12

Voer git log en vind de nieuwste hash-code en voer in:

 git reset <the previous co> 
127
15 мая '13 в 16:12 2013-05-15 16:12 het antwoord is gegeven door user853293 15.13 mei om 16:12 uur 2013-05-15 16:12 uur

In mijn geval heb ik per ongeluk een aantal bestanden gemaakt die ik niet wilde. Dus ik deed het volgende, en het werkte:

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

Bekijk resultaten met gitk of git log --stat

124
18 июля '13 в 9:41 2013-07-18 09:41 het antwoord wordt gegeven door egridasov 18 juli '13 om 9:41 2013-07-18 09:41

Gebruik SourceTree (een grafische tool voor Git) om je commit en tree te zien. U kunt het handmatig opnieuw instellen door met de rechtermuisknop te klikken.

113
29 авг. Het antwoord is gegeven iOS Coder 29 aug. 2013-08-29 19:18 '13 om 19:18 2013-08-29 19:18

Als u wilt terugkeren naar de vorige revisie, verwijdert u permanent alle niet-gecommiteerde wijzigingen:

 git reset --hard HEAD~1 
111
28 авг. het antwoord wordt gegeven door Thestar 28 aug. 2014-08-28 19:03 '14 om 19:03 2014-08-28 19:03

Er zijn twee hoofdscenario's.

Je hebt de commit niet ingedrukt

Als het probleem gerelateerd is aan extra bestanden die u hebt vastgelegd (en u wilt ze niet gebruiken in de repository), kunt u ze verwijderen met git rm en vervolgens --amend met --amend

 git rm <pathToFile> 

Je kunt ook hele directories verwijderen met -r of zelfs samenvoegen met andere bash- commando's.

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

Na het verwijderen van bestanden, kunt u repareren met de optie --amend

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

Hiermee kun je een recente lokale commit herschrijven, waardoor onnodige bestanden worden verwijderd, dus deze bestanden worden nooit verzonden om te pushen en worden ook verwijderd uit je lokale .git-repository via GC.

Je hebt al op de commit geklikt

Je kunt dezelfde oplossing toepassen op een ander script en git push met de optie -f naar -f , maar dit wordt niet aanbevolen omdat het de verwijderde geschiedenis overschrijft met een afwijkende wijziging (dit kan je repository ruïneren).

In plaats daarvan moet je committen zonder de --amend (onthoud deze -amend ": deze optie overschrijft de geschiedenis van de laatste commit).

111
12 сент. het antwoord is gegeven dseminara 12 september . 2014-09-12 17:51 '14 om 17:51 2014-09-12 17:51

Для локальной фиксации

 git reset --soft HEAD~1