Git

Hoe Git Commits te squashen

Hoe Git Commits te squashen

Commitments in Git squashen om je geschiedenis schoon te houden

Als je met Git werkt, is het een goed idee om je vaak te committen, zodat je altijd terug kunt gaan naar de staat van de code als je het verprutst. Het is echter niet altijd een goed idee om al die mini-wijzigingen in de hoofdtak door te voeren. Het maakt de geschiedenis rommelig en moeilijk te volgen.

Git biedt een manier om een ​​aantal van je commits te pletten met behulp van het rebase-commando. Als je eenmaal lokaal je wijzigingen hebt aangebracht in een bepaald bestand of voor een bepaalde functie, kun je altijd de squashmethode gebruiken om de wijzigingen te combineren voordat je je commit aan de hoofdbranch. Dit zal anderen helpen uw wijzigingen beter te begrijpen.

Waarschuwing: hoewel je uit externe repositories kunt halen en commits samen kunt squashen, is het een slecht idee. Het kan conflicten en verwarring veroorzaken. Vermijd het wijzigen van de geschiedenis die al openbaar is. Houd je alleen aan het pletten van commits die lokaal zijn voor je werk.

Laten we een voorbeeldgeval doornemen.

Stel dat we twee bestanden hebben a.py en b.py. Laten we eerst het proces van het maken van de bestanden en het aanbrengen van de wijzigingen doornemen:

$ mkdir mijnproject
$ cd mijnproject/
$ git init
$ echo "print("hallo A")" > a.py
$ git add -A && git commit -m "A toegevoegd.pie"
$ echo "print("hallo B")" > b.py
$ git add -A && git commit -m "Toegevoegd b.pie"
$ echo "print("hallo BB")" > b.py
$ git add -A && git commit -m "b.py Wijziging 1"
$ echo "print("hallo BBB")" > b.py
$ git add -A && git commit -m "b.py Wijziging 2"

Als we de geschiedenis van commits controleren, zien we het volgende:

$ git log --oneline --graph --decorate
* dfc0295 (HEAD -> master) b.py Wijziging 2
* ce9e582 b.py Wijziging 1
* 7a62538 Toegevoegd door.py
* 952244a Toegevoegd a.py

Nadat we klaar zijn met ons werk, besluiten we om alle wijzigingen in de b.py in een enkele commit voor de duidelijkheid. We tellen dat er 3 commits zijn op b.py van het HOOFD. We geven de volgende opdracht:

git rebase -i HEAD~3

De -i optie vertelt Git om de interactieve modus te gebruiken.

Er zou een venster in je Git-teksteditor moeten verschijnen:

pick 7a62538 Toegevoegd door.py
kies ce9e582 b.py Wijziging 1
kies dfc0295 b.py Wijziging 2
 
# Rebase 952244a… dfc0295 naar 952244a (3 commando(s))
#
# Commando's:
# p, kies = gebruik commit
# r, reword = gebruik commit, maar bewerk het commit bericht
# e, edit = gebruik commit, maar stop om te wijzigen
# s, squash = gebruik commit, maar meld je aan bij de vorige commit
# f, fixup = zoals "squash", maar negeer het logbericht van deze commit
# x, exec = opdracht uitvoeren (de rest van de regel) met shell
#
# Deze regels kunnen worden bijbesteld; ze worden van boven naar beneden uitgevoerd.
#
# Als je hier een regel verwijdert, ZAL DIE COMMIT VERLOREN.
#
# Als u echter alles verwijdert, wordt de rebase afgebroken.
#
# Merk op dat lege commits worden uitgecommentarieerd
~

De commits worden chronologisch bovenaan weergegeven, van de vroegste tot de meest recente. Je kunt kiezen welke commit je wilt 'picken' en welke je wilt squashen. Voor de eenvoud kiezen we de eerste commit en pletten de rest erin. Dus we zullen de tekst als volgt aanpassen:

pick 7a62538 Toegevoegd door.py
squash ce9e582 b.py Wijziging 1
squash dfc0295 b.py Wijziging 2
 
# Rebase 952244a... dfc0295 naar 952244a (3 commando(s))
#
# Commando's:
# p, kies = gebruik commit
# r, reword = gebruik commit, maar bewerk het commit bericht
# e, edit = gebruik commit, maar stop om te wijzigen
# s, squash = gebruik commit, maar meld je aan bij de vorige commit
# f, fixup = zoals "squash", maar negeer het logbericht van deze commit
# x, exec = opdracht uitvoeren (de rest van de regel) met shell
#
# Deze regels kunnen worden bijbesteld; ze worden van boven naar beneden uitgevoerd.
#
# Als je hier een regel verwijdert, GAAT DEZE COMMIT VERLOREN.
#
# Als u echter alles verwijdert, wordt de rebase afgebroken.
#
# Merk op dat lege commits worden uitgecommentarieerd

Zodra u het tekstbestand opslaat en sluit, zou er een ander tekstvenster moeten verschijnen dat er als volgt uitziet:

# Dit is een combinatie van 3 commits.
# Het bericht van de eerste commit is:
Toegevoegd door.py
 
# Dit is het 2e commit-bericht:
 
b.py Wijziging 1
 
# Dit is het 3e commit-bericht:
 
b.py Wijziging 2
 
# Voer het commit-bericht in voor uw wijzigingen. Lijnen die beginnen
# met '#' wordt genegeerd en een leeg bericht breekt de vastlegging af.
#
# Datum:      vr 30 mrt 21:09:43 2018 -0700
#
# rebase in uitvoering; op 952244a
# Je bent momenteel een commit aan het bewerken terwijl je branch 'master' rebast op '952244a'.
#
# Door te voeren wijzigingen:
#       nieuw bestand:   b.py
#

Bewaar en sluit ook dit bestand. Je zou zoiets als dit moeten zien:

$ git rebase -i HEAD~3
[vrijstaand HOOFD 0798991] Toegevoegd door.py
Datum: vr 30 mrt 21:09:43 2018 -0700
1 bestand gewijzigd, 1 invoeging (+)
maakmodus 100644 b.py
Rebased en bijgewerkt refs/heads/master.

Als je nu de vastleggingsgeschiedenis bekijkt:

$ git log --oneline --graph --decorate
* 0798991 (HEAD -> master) Toegevoegd b.py
* 952244a Toegevoegd a.py

Alle verplichtingen voor b.py zijn geplet in één commit. U kunt controleren door te kijken naar de b.py-bestand:

$ kat b.py
print("hallo BBB")

Het heeft de inhoud van Modificatie 2.

Conclusie

De rebase is een krachtig commando. Het kan u helpen uw geschiedenis schoon te houden. Maar vermijd het om het te gebruiken voor reeds openbare commits, omdat het conflicten en verwarring kan veroorzaken. Gebruik het alleen voor uw eigen lokale repository.

Verdere studie:

Hoe een spel op Linux te ontwikkelen
Tien jaar geleden zouden niet veel Linux-gebruikers voorspellen dat hun favoriete besturingssysteem ooit een populair spelplatform voor commerciële vi...
Open source-poorten van commerciële game-engines
Gratis, open source en platformonafhankelijke game-engine-recreaties kunnen worden gebruikt om zowel oude als enkele van de vrij recente gametitels te...
Beste opdrachtregelspellen voor Linux
De opdrachtregel is niet alleen je grootste bondgenoot bij het gebruik van Linux, hij kan ook de bron van entertainment zijn omdat je hem kunt gebruik...