Hoe verwijder ik niet-gepushte git-commits?

Ik heb me per ongeluk aan de verkeerde branch gecommitteerd.
Hoe verwijder ik die toezegging?


Antwoord 1, autoriteit 100%

Verwijder de meest recente commit en behoud het werk dat je hebt gedaan:

git reset --soft HEAD~1

Verwijder de meest recente commit, het vernietigen van het werkdat je hebt gedaan:

git reset --hard HEAD~1

Antwoord 2, autoriteit 12%

Ik vraag me af waarom het beste antwoord dat ik heb gevonden alleen in de reacties staat! (door Daenyth met 86 stemmen tegen)

git reset --hard origin

Deze opdracht synchroniseert de lokale repository met de externe repository en verwijdert elke wijziging die u op uw lokale repository hebt aangebracht.
Je kunt ook het volgende doen om de exacte branch op te halen die je in de origin hebt.

git reset --hard origin/<branch>

Antwoord 3, autoriteit 3%

Verwijder het niet: voor slechts één commit git cherry-pickis genoeg.

Maar als je verschillendecommits op de verkeerde branch had, dan is dat waar git rebase --ontoschijnt:

Stel dat je dit hebt:

x--x--x--x <-- master
           \
            -y--y--m--m <- y branch, with commits which should have been on master

, dan kun je mastermarkeren en verplaatsen waar je wilt zijn:

git checkout master
 git branch tmp
 git checkout y
 git branch -f master
 x--x--x--x <-- tmp
           \
            -y--y--m--m <- y branch, master branch

, reset y branch waar het had moeten zijn:

git checkout y
 git reset --hard HEAD~2 # ~1 in your case, 
                         # or ~n, n = number of commits to cancel
 x--x--x--x <-- tmp
           \
            -y--y--m--m <- master branch
                ^
                |
                -- y branch

, en verplaats tenslotte je commits (pas ze opnieuw toe, maak daadwerkelijk nieuwe commits)

git rebase --onto tmp y master
 git branch -D tmp
 x--x--x--x--m'--m' <-- master
           \
            -y--y <- y branch

Antwoord 4

Voer een git rebase -i FAR_ENOUGH_BACKuit en laat de regel vallen voor de commit die je niet wilt.


Antwoord 5

Als je die commit naar een andere branch wilt verplaatsen, verkrijg dan de SHA van de betreffende commit

git rev-parse HEAD

Verander dan de huidige tak

git checkout other-branch

En cherry-pickde toezegging aan other-branch

git cherry-pick <sha-of-the-commit>

Antwoord 6

Het volgende commando werkte voor mij, alle lokale vastgelegde wijzigingen worden verwijderd & local wordt gereset naar hetzelfde als remote origin/master branch.

git reset –hard origin


Antwoord 7

Ter referentie, ik geloof dat je commits uit je huidige branch kunt “hard cut” niet alleen met git reset –hard, maar ook met het volgende commando:

git checkout -B <branch-name> <SHA>

In feite, als u niet wilt afrekenen, kunt u de vertakking instellen op wat u maar wilt met:

git branch -f <branch-name> <SHA>

Dit zou een programmatische manier zijn om commits van een branch te verwijderen, bijvoorbeeld om er nieuwe commits naar te kopiëren (met behulp van rebase).

Stel dat je een branch hebt die is losgekoppeld van de master omdat je bronnen van een andere locatie hebt gehaald en in de branch hebt gedumpt.

Je hebt nu een branch waarin je wijzigingen hebt toegepast, laten we het “topic” noemen.

Je gaat nu een duplicaat maken van je onderwerpbranch en deze vervolgens rebasen op de broncodedump die zich in tak “dump” bevindt:

git branch topic_duplicate topic
git rebase --onto dump master topic_duplicate

Je wijzigingen worden nu opnieuw toegepast in branch topic_duplicate op basis van het startpunt van “dump”, maar alleen de commits die zijn gebeurd sinds “master”. Dus uw wijzigingen sinds master worden nu opnieuw toegepast bovenop “dump” maar het resultaat komt terecht in “topic_duplicate”.

Je zou dan “dump” kunnen vervangen door “topic_duplicate” door te doen:

git branch -f dump topic_duplicate
git branch -D topic_duplicate

Of met

git branch -M topic_duplicate dump

Of gewoon door de dump weg te gooien

git branch -D dump

Misschien kun je ook gewoon de kers op de taart nemen nadat je de huidige “topic_duplicate” hebt gewist.

Wat ik probeer te zeggen is dat als je de huidige “duplicaat” branch wilt updaten op basis van een andere voorouder, je eerst de eerder “cherrypicked” commits moet verwijderen door een git reset --hard <last-commit-to-retain>of git branch -f topic_duplicate <last-commit-to-retain>en dan de andere commits kopiëren (van de hoofdonderwerp branch) door rebasen of cherry-picking.

Rebasen werkt alleen op een branch die al commits heeft, dus je moet je topic branch dupliceren elke keer dat je dat wilt doen.

CherryPicking is veel eenvoudiger:

git cherry-pick master..topic

Dus de volledige reeks zal naar beneden komen:

git reset --hard <latest-commit-to-keep>
git cherry-pick master..topic

Wanneer uw onderwerp-dubbele tak is uitgecheckt. Dat zou voorheen-cherry-geplukte commits uit het huidige duplicaat verwijderen en gewoon alle wijzigingen opnieuw toepassen die plaatsvinden in “onderwerp” bovenop uw huidige “dump” (verschillende voorouder). Het lijkt een redelijk handige manier om uw ontwikkeling te baseren op de “echte” stroomopwaartse master tijdens het gebruik van een andere “downstream” -master om te controleren of uw lokale wijzigingen daar ook nog steeds van toepassing zijn. Als alternatief zou je gewoon een diff kunnen genereren en vervolgens buiten een git-bronboom toepassen. Maar op deze manier kunt u een up-to-date gewijzigde (patched) -versie bijhouden die is gebaseerd op de versie van uw distributie, terwijl uw daadwerkelijke ontwikkeling is tegen de echte upstream-master.

Dus om te demonstreren:

  • Reset maakt uw filiaalpunt naar een andere commit (–Hard controleert ook de vorige commit, – Soft houdt toegevoegd bestanden in de index (die zou worden gepleegd als u zich opnieuw committeert) en de standaard (- gemixt ) Bekijk niet de vorige commit (het afvegen van uw lokale wijzigingen), maar het zal de index wissen (er is nog niets toegevoegd voor commit)
  • Je kunt gewoon een tak dwingen om te wijzen op een andere commit
  • U kunt dit doen terwijl u zich meteen uitcheckt die zich ook verzenden
  • Rebasing werkt op commits die aanwezig zijn in uw huidige tak
  • Cherry-Picking betekent om te kopiëren van een andere tak

Ik hoop dat dit iemand helpt. Ik wilde dit herschrijven, maar ik kan het nu niet beheren. Groeten.

Other episodes