Vraag Hoe de meest recente commits in Git ongedaan te maken?


Ik heb per ongeluk verkeerde bestanden gepleegd Git, maar ik heb de commit nog niet naar de server geduwd.

Hoe kan ik die commits ongedaan maken vanuit de lokale repository?


17794
2017-07-28 22:22


oorsprong


antwoorden:


Maak een commit ongedaan en herhaal

$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
<< edit files as necessary >>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. Dit is wat je wilt ongedaan maken
  2. Hierdoor blijft je werkende structuur (de status van je bestanden op schijf) ongewijzigd maar wordt de commit ongedaan gemaakt en blijven de wijzigingen die je hebt vastgelegd ongestage (de wijzigingen worden niet weergegeven als "Veranderingen niet vastgelegd" in git statusen je moet ze opnieuw toevoegen voordat je commit). als jij enkel en alleen willen toevoegen meer wijzigingen aanbrengen in de vorige commit of het commit-bericht wijzigen1, je zou kunnen gebruiken git reset --soft HEAD~ in plaats daarvan, wat zoiets is git reset HEAD~ (waar HEAD~ is hetzelfde als HEAD~1) maar laat je bestaande wijzigingen geënsceneerd.
  3. Breng correcties aan in werkende boomstammen.
  4. git add alles dat je in je nieuwe commit wilt opnemen.
  5. Voer de wijzigingen uit en hergebruik het oude commit-bericht. reset kopieerde het oude hoofd naar .git/ORIG_HEAD; commit met -c ORIG_HEAD opent een editor die in eerste instantie het logbericht van de oude commit bevat en waarmee u deze kunt bewerken. Als u het bericht niet hoeft te bewerken, kunt u de -C keuze.

Let echter op dat als u nieuwe wijzigingen aan de index hebt toegevoegd, u de commit --amend zal ze toevoegen aan je vorige commit.

Als de code al naar uw server is gepusht en u toestemming hebt om de geschiedenis te overschrijven (rebase), dan:

git push origin master --force

U kunt ook naar dit antwoord kijken:

Hoe HEAD terug naar een vorige locatie te verplaatsen? (Vrijstaande kop)

Het bovenstaande antwoord zal je tonen git reflog die wordt gebruikt om uit te zoeken wat de SHA-1 is waarnaar u wilt terugkeren. Zodra u het punt hebt gevonden dat u wilt ongedaan maken om de reeks opdrachten te gebruiken zoals hierboven uitgelegd.


1 Merk echter op dat u niet naar een eerdere commit hoeft te resetten als u net een fout heeft gemaakt in uw commit bericht. De eenvoudigere optie is om git reset (om wijzigingen die u sindsdien heeft aangebracht upstage) en vervolgens git commit --amend, waarmee uw standaard commit message-editor wordt geopend, vooraf ingevuld met het laatste commit-bericht.


19231
2018-06-16 17:27



Het ongedaan maken van een commit is een beetje eng als je niet weet hoe het werkt. Maar het is eigenlijk verbazingwekkend eenvoudig als je het begrijpt.

Stel dat je dit hebt, waarbij C je HEAD is en (F) de status van je bestanden is.

   (F)
A-B-C
    ↑
  master

U wilt nuke commit C en ziet het nooit meer. Jij doet dit:

git reset --hard HEAD~1

Het resultaat is:

 (F)
A-B
  ↑
master

Nu is B het HOOFD. Omdat je gebruikte --hard, uw bestanden worden teruggezet naar hun staat bij commit B.

Ah, maar stel dat commit C geen ramp was, maar gewoon een beetje uit. U wilt maak de commit ongedaan maar houd je wijzigingen aan voor een beetje bewerken voordat je een betere commit doet. Opnieuw beginnen vanaf hier, met C als je HEAD:

   (F)
A-B-C
    ↑
  master

Je kunt dit doen, het verlaten van de --hard:

git reset HEAD~1

In dit geval is het resultaat:

   (F)
A-B-C
  ↑
master

In beide gevallen is HEAD slechts een verwijzing naar de laatste commit. Wanneer je een a git reset HEAD~1, zeg je Git om de HEAD-pointer een commit terug te zetten. Maar (tenzij je gebruikt --hard) u laat uw bestanden zoals ze waren. Dus nu git status toont de veranderingen die u had ingecheckt in C. U bent niets verloren!

Voor de lichtste aanraking, kunt u zelfs maak je commit ongedaan maar laat je bestanden en jouw inhoudsopgave:

git reset --soft HEAD~1

Dit laat niet alleen uw bestanden achter, maar verlaat zelfs uw bestanden inhoudsopgave alleen. Wanneer je dat doet git status, u zult zien dat dezelfde bestanden als voorheen in de index staan. In feite, vlak na dit commando, zou je het kunnen doen git commit en je zou dezelfde commit opnieuw doen die je net had.

Nog een ding: Stel dat je een commit vernietigt zoals in het eerste voorbeeld, maar ontdek dan dat je het toch nodig hebt? Moeilijk geluk, toch?

Nee, dat is zo nog steeds een manier om het terug te krijgen. Type git reflog en je ziet een lijst met (gedeeltelijke) commit sha's waarin je bent rondgegaan. Zoek de commit die je hebt vernietigd en doe dit:

git checkout -b someNewBranchName shaYouDestroyed

Je hebt die verbintenis nu herrezen. Commits worden niet echt vernietigd in Git gedurende ongeveer 90 dagen, dus je kunt meestal teruggaan en een redden die je niet wilde laten verdwijnen.


9726
2018-05-29 18:16



Dit kostte me een tijdje om erachter te komen, dus misschien helpt dit iemand ...

Er zijn twee manieren om je laatste commit "ongedaan te maken", afhankelijk van of je je commit al dan niet openbaar hebt gemaakt (geduwd naar je externe repository):

Hoe een lokale commit ongedaan te maken

Laten we zeggen dat ik lokaal heb gecommit, maar nu die commit wil 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 terug te brengen naar de manier waarop het was voorafgaand aan de laatste commit, moeten we dit doen reset aan de commit eerder 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 git log zal laten zien dat onze laatste commit is verwijderd.

Hoe een openbare commit ongedaan te maken

Als je je commits al openbaar hebt gemaakt, wil je een nieuwe commit maken die de wijzigingen die je in je vorige commit hebt gemaakt (current HEAD) "terugdraait".

git revert HEAD

Uw wijzigingen worden nu teruggezet en staan ​​voor u klaar om te plegen:

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

Kijk voor meer informatie Git Basics - Dingen ongedaan maken


1744
2018-05-29 18:13



Voeg bestanden toe of verwijder ze om de dingen te krijgen zoals jij dat wilt:

git rm classdir
git add sourcedir

Wijzig vervolgens de commit:

git commit --amend

De vorige, foutieve commit zal worden bewerkt om de nieuwe indexstatus weer te geven - met andere woorden, het zal zijn alsof je nooit de fout hebt gemaakt in de eerste plaats.

Merk op dat je dit alleen zou moeten doen als je nog niet hebt gepusht. Als je hebt gepusht, hoef je alleen maar een fix te maken.


1623
2017-07-31 09:39



git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

of

git reset --hard HEAD~1

Waarschuwing: het bovenstaande commando zal de aanpassingen aan de permanent verwijderen .java bestanden (en andere bestanden) die u wilde vastleggen.

De hard reset naar HEAD-1 zal uw werkkopie instellen op de status van de commit voor uw verkeerde commit.


875
2018-05-25 16:04



Om de laatste commit te veranderen

Vervang de bestanden in de index:

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

Als het een privékantoor is, wijzigen de commit:

git commit --amend

Of, als het een gedeelde branch is, maak een nieuwe commit:

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


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


ProTip: toevoegen *.class naar een gitignore om dit weer te stoppen.


Een commit terugdraaien

Het wijzigen van een commit is de ideale oplossing als je de laatste commit moet veranderen, maar een meer algemene oplossing is dat reset.

Je kunt git naar elke commit resetten met:

git reset @~N

Waar N is het aantal commits eerder HEAD, en @~ reset naar de vorige commit.

Dus in plaats van de commit te wijzigen, zou je kunnen gebruiken:

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

Uitchecken git help reset, met name de secties op --soft  --mixed en --hard, voor een beter begrip van wat dit doet.

reflog

Als je het verprutst, kun je altijd de reflog gebruiken om gevonden commits 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



677
2018-01-31 07:06



Gebruik git revert commit-id

Om de commit-ID te krijgen, gebruikt u gewoon git log


547
2017-12-13 10:18



Als u van plan bent om een ​​lokale commit volledig ongedaan te maken, wat u ook in de commit verandert, en als u zich daarover geen zorgen maakt, voert u gewoon de volgende opdracht uit.

git reset --hard HEAD^1

(Deze opdracht negeert uw gehele commit en uw wijzigingen zullen volledig verloren gaan van uw lokale werkboom). Als je je commit wilt ongedaan maken, maar je wilt je veranderingen in het faseringsgebied (voordat je je commit net zoals daarna commit git add) voer dan het volgende commando uit.

git reset --soft HEAD^1

Nu komen uw gecommitteerde bestanden de staging area binnen. Stel dat je de volgende opdracht wilt uitvoeren als je de bestanden wilt desagennen, omdat je een verkeerde conent moet bewerken

git reset HEAD

Nu gaan toegewijde bestanden van het gefaseerde gebied naar het niet-gecategoriseerde gebied. Nu zijn bestanden klaar om te bewerken, dus wat je ook verandert, je wilt het gaan bewerken en toevoegen en een nieuwe / nieuwe commit maken.

Meer


440
2018-04-06 13:58



Als je hebt Git Extras geïnstalleerd, kunt u uitvoeren git undo om de laatste commit ongedaan te maken. git undo 3 zal de laatste 3 commits ongedaan maken.


430
2017-10-25 03:41



Ik wilde de laatste 5 commits ongedaan maken in onze gedeelde repository. Ik heb de revisie-id opgezocht waarnaar ik wilde terugdraaien. Toen typte ik het volgende in.

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>

398



Ik geef de voorkeur om te gebruiken git rebase -i voor deze klus, want er verschijnt een mooie lijst waarin ik de commits kan kiezen om van af te komen. Het is misschien niet zo direct als sommige andere antwoorden hier, maar het is gewoon zo voelt goed.

Kies het aantal commits dat u wilt opsommen en roep vervolgens zo aan (om de laatste drie in dienst te nemen)

git rebase -i HEAD~3

Voorbeeldlijst

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

Dan zal git commits verwijderen voor elke regel die je verwijdert.


380