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.
-
git checkout b3d92c5
Bekijk de laatste bruikbare commit. -
git checkout -b repair
Maak een nieuwe branch aan om aan te werken. -
git cherry-pick 77b9b82
Doorloop commit 3. -
git cherry-pick 2c6a45b
Doorloop commit 1. -
git checkout master
Checkout master. -
git reset --hard b3d92c5
Zet master terug naar de laatste bruikbare commit. -
git merge repair
Merge onze nieuwe branch op master. -
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!