Een git commit verwijderen

Als je met Git werkt, zul je merken dat commits soms moeten worden verwijderd omdat ze een bug hebben geïntroduceerd of moeten worden herwerkt.

Als dat zo is de laatste commit is dit heel eenvoudig. Voer gewoon uit:

git reset HEAD^

Dit zal de laatste commit laten verschijnen, maar laat al je wijzigingen aan de bestanden intact.

Als je meer dan alleen de laatste commit wilt verwijderen, zijn er twee methoden die je kunt gebruiken. De eerste is het gebruik van rebase, hierdoor kun je een of meer opeenvolgende commits verwijderen, de andere is cherry-pick, waardoor je niet-opeenvolgende commits kunt verwijderen.

Voorbeeld git log

Getal Hash Commit Message Auteur
1 2c6a45b (HEAD) Openbare methode toevoegen om toegang te krijgen tot beschermde methode Tom
2 ae45fab Updates voor database-interface Aannemer 1
3 77b9b82 Database-interface verbeteren Aannemer 2
4 3c9093c Ontwikkeltak samengevoegd in master Tom
5 b3d92c5 Nieuwe Event CMS-module toevoegen Paul
6 7feddbb CMS-klasse en bestanden toevoegen Tom
7 a809379 Project aan Git toevoegen Tom

Rebase gebruiken

Met behulp van de git log hierboven willen we de volgende commits verwijderen; 2 & 3 (ae45fab & 77b9b82). Omdat het opeenvolgende commits zijn, kunnen we rebase gebruiken.

git rebase --onto <branch name>~<first commit number to remove> <branch name>~<first commit to be kept> <branch name>

bijv. Om commits te verwijderen 2 & 3 hierboven

git rebase --onto repair~3 repair~1 repair

Cherry Pick gebruiken

Stap 1: Vind de commit voor de commit je wilt git log

Stap 2: Checkout die commit git checkout <commit hash>

Stap 3 : Maak een nieuwe branch met je huidige checkout commit git checkout -b <new branch>

Stap 4: Nu moet je de commit toevoegen na de verwijderde commit git cherry-pick <commit hash>

Stap 5: Herhaal nu stap 4 voor alle andere commits die je wilt behouden.

Stap 6: Zodra alle commits zijn toegevoegd aan je nieuwe branch en toegewijd. Controleer of alles in de juiste staat is en werkt zoals bedoeld. Controleer nogmaals of alles is vastgelegd: git status

Stap 7: Schakel over naar je kapotte branch git checkout <broken branch>

Stap 8: Voer nu een harde reset uit op de kapotte branch naar de commit voorafgaand aan degene die je wilt verwijderen git reset --hard <commit hash>

Stap 9: Merge je vaste branch in deze branch git merge <branch name>

Stap 10: Push de samengevoegde wijzigingen terug naar de oorsprong. WAARSCHUWING: hiermee wordt de externe opslagplaats overschreven! git push --force origin <branch name>

U kunt het proces uitvoeren zonder een nieuwe branch te maken door stap 2 & 3 te vervangen door stap 8 en vervolgens stap 7 niet uitvoeren & 9.

Voorbeeld

Stel dat we commits 2 willen verwijderen & 4 uit de repo.

  1. git checkout b3d92c5 Bekijk de laatste bruikbare commit.
  2. git checkout -b repair Maak een nieuwe branch aan om aan te werken.
  3. git cherry-pick 77b9b82 Doorloop commit 3.
  4. git cherry-pick 2c6a45b Doorloop commit 1.
  5. git checkout master Checkout master.
  6. git reset --hard b3d92c5 Zet master terug naar de laatste bruikbare commit.
  7. git merge repair Merge onze nieuwe branch op master.
  8. git push --hard origin master Push master naar de externe repo.

Laatste opmerking

Git rebase & cherrypick zijn gevaarlijk maar krachtig oplossingen die alleen als laatste mogen worden gebruikt optie en alleen worden uitgevoerd door iemand die weet wat ze doen. Pas op dat beide oplossingen nadelige effecten kunnen hebben op andere gebruikers die aan dezelfde repository / branch werken.

Denk er ten slotte aan voorzichtig te zijn en veel geluk!

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *