Vraag Verwijder commits van een filiaal in Git


Ik zou graag willen weten hoe een commit te verwijderen.

Door delete, Ik bedoel het is alsof ik die commit niet heb gemaakt, en wanneer ik in de toekomst een push doe, zullen mijn veranderingen niet naar de remote branch duwen.

Ik lees git help, en ik denk dat de opdracht die ik moet gebruiken is git reset --hard HEAD. Is dit correct?


2574
2017-08-27 03:39


oorsprong


antwoorden:


Voorzichtig:  git reset --hard  ZAL UW VERANDERINGEN IN HET WERKBESTAND VERWIJDEREN. Zorg dat je plaats alle lokale wijzigingen die u wilt behouden voordat u deze opdracht uitvoert.

Ervan uitgaande dat je op die commit zit, zal dit commando het wackt ...

git reset --hard HEAD~1

De HEAD~1 betekent de commit voor het hoofd.

Of u kunt kijken naar de uitvoer van git log, zoek de commit-id van de commit waarvan u een back-up wilt maken en doe dit:

git reset --hard <sha1-commit-id>

Als je het al hebt gepusht, moet je een force push doen om er vanaf te komen ...

git push origin HEAD --force

Echter, als anderen het misschien hebben getrokken, kun je beter een nieuw filiaal beginnen. Omdat wanneer ze trekken, het het gewoon in hun werk zal samenvoegen, en je krijgt het weer omhoog gedrukt.

Als je al hebt gepusht, is het misschien beter om te gebruiken git revert, om een ​​'spiegelbeeld'-commit te maken die de wijzigingen ongedaan zal maken. Beide commits staan ​​echter in het logboek.


TER INFO -- git reset --hard HEAD is geweldig als je WORK IN PROGRESS wilt verwijderen. Het zal u terugzetten naar de meest recente commit en alle wijzigingen in uw werkboom en index wissen.


Ten slotte, als je een commit moet vinden die je hebt "verwijderd", is deze meestal aanwezig in git reflog tenzij je garbage jouw repository hebt verzameld.


3305
2017-08-27 03:44



Als je de commit nog niet ergens hebt gepusht, kun je gebruiken git rebase -i om die commit te verwijderen. Zoek eerst uit hoever die commit terug is (ongeveer). Dan doen:

git rebase -i HEAD~N

De ~N betekent rebase de laatste N commits (N moet een nummer zijn, bijvoorbeeld HEAD~10). Vervolgens kunt u het bestand dat Git presenteert, bewerken om de overtredende commit te verwijderen. Bij het opslaan van dat bestand zal Git vervolgens de volgende commits herschrijven alsof degene die je hebt verwijderd niet bestond.

Het Git-boek heeft een goede sectie over rebasen met foto's en voorbeelden.

Wees hier echter voorzichtig mee, want als je iets verandert dat jij bent hebben ergens anders naartoe geduwd, is er een andere aanpak nodig, tenzij je van plan bent om een ​​push-force uit te voeren.


603
2017-08-27 03:51



Een andere mogelijkheid is een van mijn persoonlijke favoriete opdrachten:

git rebase -i <commit>~1

Hiermee wordt de rebase gestart in de interactieve modus -i op het punt net voor de commit die je wilt meppen. De redacteur start sindsdien alle commits op. Verwijder de regel met de commit die u wilt verwijderen en sla het bestand op. Rebase zal de rest van het werk doen, alleen die commit verwijderen, en alle anderen opnieuw in het logboek afspelen.


416
2017-08-27 03:49



Ik voeg dit antwoord toe omdat ik niet begrijp waarom iemand die net heeft geprobeerd om werk te maken, al dat werk zou willen verwijderen vanwege een fout met Git!

Als je je werk wilt behouden en gewoon dat commitcommando 'ongedaan' wilt maken (je bent betrapt voordat je pusht om te repo):

git reset --soft HEAD~1

Gebruik geen --hard vlag tenzij je je huidige werk sinds de laatste commit wilt vernietigen.


281
2017-10-15 18:17



Als u geen wijzigingen hebt gepubliceerd, om de laatste commit te verwijderen, kunt u het doen

$ git reset --hard HEAD^

(merk op dat hiermee ook alle niet-gecommiteerde wijzigingen worden verwijderd; gebruik dit voorzichtig).

Als u al een to-be-delete commit hebt gepubliceerd, gebruik dan Ga terug

$ git revert HEAD

47
2017-08-27 10:47



Een volledige commit verwijderen

git rebase -p --onto SHA^ SHA

Vervang 'SHA' uiteraard door de referentie waarvan u zich wilt ontdoen. De "^" in die opdracht is letterlijk.

http://sethrobertson.github.io/GitFixUm/fixup.html


43
2017-08-31 19:36



git reset --hard commitId

git push <origin> <branch> --force

PS: CommitId verwijst naar degene waarnaar u wilt terugkeren


33
2017-10-16 09:51



Als je je laatste commit wilt repareren, kun je de commit ongedaan maken en de bestanden erin verwijderen, door te doen:

git reset HEAD~1

Dit zal je repository terugbrengen naar zijn staat voordat de git commando's toevoegt die de bestanden geënsceneerd hebben. Uw wijzigingen staan ​​in uw werkdirectory. HEAD ~ 1 verwijst naar de commit onder de huidige tip van de tak.

Als u N commits niet wilt toewijzen, maar de codewijzigingen in uw werkdirectory wilt behouden:

git reset HEAD~N

Als je je laatste commit wilt verwijderen en de codewijzigingen niet wilt behouden, kun je een "harde" reset uitvoeren.

git reset --hard HEAD~1

Evenzo, als u de laatste N commissies wilt verwijderen en de codewijzigingen niet wilt behouden:

git reset --hard HEAD~N

29
2018-05-31 07:19



Wijzig geschiedenis krachtig

Ervan uitgaande dat je niet alleen de laatste commit wilt verwijderen, maar je wilt specifieke commits van de laatste n commits verwijderen, ga dan met:

git rebase -i HEAD~<number of commits to go back>, dus git rebase -i HEAD~5 als je de laatste vijf commits wilt zien.

Wijzig vervolgens het woord in de teksteditor pick naar drop naast elke commit die je wilt verwijderen. Sla op en sluit de editor af. Voila!

Additief Wijzigingsgeschiedenis

Proberen git revert <commit hash>. terugkeren zal een maken nieuwe commit die de opgegeven commit ongedaan maakt.


20
2018-06-15 23:01



Stel dat we commissies 2 & 4 van de repo willen verwijderen.

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

Notitie: U moet beheerdersrechten hebben voor de repo omdat je gebruikt --hard en -f.

  • git checkout b3d92c5 Controleer de laatste bruikbare commit.
  • git checkout -b repair Maak een nieuwe vestiging om aan te werken.
  • git cherry-pick 77b9b82 Ren door commit 3.
  • git cherry-pick 2c6a45b Ren door commit 1.
  • git checkout master Afrekenen master.
  • git reset --hard b3d92c5 Stel de master opnieuw in als laatst bruikbare commit.
  • git merge repair Voeg onze nieuwe branch samen tot master.
  • git push -f origin master Duw de master naar de remote repo.

19
2017-09-05 07:19



git rebase -i HEAD~2

Hier is '2' het aantal commits dat u wilt rebasen.

'git rebase -i HEAD`

als je alle commits opnieuw wilt rebasen.

Dan kunt u een van deze opties kiezen.

p, pick = use commit

r, reword = use commit, but edit the commit message

e, edit = use commit, but stop for amending

s, squash = use commit, but meld into previous commit

f, fixup = like "squash", but discard this commit's log message

x, exec = run command (the rest of the line) using shell

d, drop = remove commit

Deze lijnen kunnen opnieuw worden besteld; ze worden van boven naar beneden uitgevoerd.  Als u hier een regel verwijdert, ZAL DAT COMMIT WORDEN VERLOREN.  Als u echter alles verwijdert, wordt de rebase afgebroken.  Merk op dat lege commits worden becommentarieerd

Je kunt eenvoudig die commit verwijderen met optie "d" of een regel verwijderen die je commit heeft.


14
2018-05-18 23:39