Het handhaven van een reeks "veilige" revisies van een project is de kernfunctie van elk versiecontrolesysteem. Git bereikt dit door op te nemen snapshots van een project. Nadat u een momentopname hebt gemaakt, kunt u teruggaan en oude versies bekijken, herstellen en experimenteren zonder de angst om bestaande functionaliteit te vernietigen.
Gebruikers van SVN en CVS moeten opmerken dat dit fundamenteel verschilt van de implementatie van hun systeem. Beide programma's registreren diff's voor elk bestand - een incrementeel record van de wijzigingen in een project. Git's snapshots daarentegen zijn precies dat-snapshots. Elke commit bevat de volledige versie van elk bestand dat het bevat. Dit maakt Git ongelooflijk snel omdat de status van een bestand niet hoeft te worden gegenereerd elke keer dat het wordt aangevraagd:
Dit hoofdstuk introduceert de basisworkflow voor het maken van snapshots met behulp van de werkdirectory, het staginggebied en de gecommitteerde geschiedenis. Dit zijn de kerncomponenten van op Git gebaseerde revisieregeling.
Het verzamelgebied van Git geeft je een plek om een commit te organiseren voordat je het aan de projectgeschiedenis toevoegt. regie is het proces van het verplaatsen van wijzigingen van de werkmap naar de gefaseerde momentopname.
Het geeft je de mogelijkheid om te kiezen en te kiezen verwant verandert van de werkdirectory, in plaats van alles in één keer te doen. Dit betekent dat je kunt creëren logisch snapshots over chronologisch degenen. Dit is een zegen voor ontwikkelaars omdat het hen codeeractiviteiten laat loskoppelen van activiteiten voor versiebeheer. Wanneer u functies schrijft, kunt u vergeten te stoppen om ze vast te leggen in geïsoleerde delen. Als u klaar bent met uw coderingssessie, kunt u vervolgens via het podium wijzigingen in zoveel commits als u wilt splitsen.
Gebruik de volgende opdracht om nieuwe of gewijzigde bestanden uit de werkdirectory toe te voegen aan het verzamelgebied:
git add
Om een bestand uit een project te verwijderen, moet u het toevoegen aan het verzamelgebied, net zoals een nieuw of aangepast bestand. De volgende opdracht voert de verwijdering uit en stopt met het volgen van het bestand, maar het zal het bestand niet uit de werkdirectory verwijderen:
git rm --cached
Het bekijken van de status van je repository is een van de meest voorkomende acties in Git. Met de volgende opdracht wordt de status van de werkdirectory en het staginggebied uitgevoerd:
git status
Dit zal resulteren in een bericht dat op het volgende lijkt (bepaalde gedeelten kunnen worden weggelaten, afhankelijk van de status van uw repository):
# Op branchmaster # Veranderingen die moeten worden vastgelegd: # # nieuw bestand: foobar.txt # # Veranderingen niet geënsceneerd voor commit: # # modified: foo.txt # # Niet-trackbestanden: # # bar.txt
Het eerste gedeelte, "Aan te passen wijzigingen", is uw gefaseerde momentopname. Als je zou rennen Git commit
op dit moment zouden alleen deze bestanden worden toegevoegd aan de projectgeschiedenis. Het volgende gedeelte geeft een lijst weer bijgehouden bestanden die niet worden opgenomen in de volgende commit. Ten slotte bevat "Niet-traceerde bestanden" bestanden in uw werkdirectory die niet aan de repository zijn toegevoegd.
Als u meer gedetailleerde informatie nodig hebt over de wijzigingen in uw werkdirectory of staging gebied, kunt u een diff genereren met de volgende opdracht:
git diff
Dit levert een diff van elke unstaged verandering in uw werkmap. Je kunt ook een diff van alles genereren geënsceneerd verandert met de --gecached
vlag:
git diff --cached
Merk op dat de projectgeschiedenis buiten het bereik valt van git status
. Voor het weergeven van toegewijde snapshots heeft u dit nodig git log
.
git status
Commits vertegenwoordigen elke opgeslagen versie van een project, waardoor ze de atomaire eenheid van op Git gebaseerd versiebeheer zijn. Elke commit bevat een momentopname van het project, uw gebruikersinformatie, de datum, een commit-bericht en een SHA-1 controlesom van de volledige inhoud:
commit b650e3bd831aba05fa62d6f6d064e7ca02b5ee1b Auteur: johnDatum: wo Jan 11 00:45:10 2012 -0600 Sommigen committen bericht
Deze checksum fungeert als een unieke ID van een commit, en het betekent ook dat een commit zal doen nooit gecorrumpeerd of onbedoeld veranderd zijn zonder dat Git hiervan op de hoogte is.
Omdat het staging-gedeelte al de gewenste changeset bevat, vereist commit geen betrokkenheid van de werkdirectory.
Voer de volgende stappen uit om de gefaseerde momentopname te maken en toe te voegen aan de geschiedenis van de huidige vertakking:
Git commit
Je krijgt een teksteditor te zien en wordt gevraagd om een "commit-bericht". Commit-berichten moeten de volgende vorm hebben:
Git gebruikt de eerste regel voor het formatteren van loguitvoer, e-mailen van patches, enz., Dus het zou kort moeten zijn, terwijl het nog steeds de hele changeset beschrijft. Als u de samenvattingsregel niet kunt vinden, betekent dit waarschijnlijk dat uw commit te veel niet-gerelateerde wijzigingen bevat. Je zou terug moeten gaan en ze opsplitsen in verschillende commits. De samenvatting moet worden gevolgd door een lege regel en een gedetailleerde beschrijving van de wijzigingen (bijvoorbeeld waarom u de wijzigingen hebt aangebracht, met welk ticketnummer deze overeenstemt).
Net als de status van een repository is het bekijken van de geschiedenis een van de meest voorkomende taken in Git-versiebeheer. U kunt de commits van de huidige branch weergeven met:
git log
We hebben nu de enige twee tools die we nodig hebben om elk onderdeel van een Git-repository te inspecteren.
git status
vs. git log
Dit geeft ons ook een natuurlijke groepering van commando's:
git add
, git rm
, git status
Git commit
, git log
Git biedt een overvloed aan opmaakopties voor git log
, een paar hiervan zijn hier opgenomen. Als u elke commit op één regel wilt weergeven, gebruikt u:
git log - online
Of gebruik de volgende opties om de geschiedenis van een afzonderlijk bestand te targeten in plaats van de volledige repository:
git log - online
Het filteren van de uitvoer van het logbestand is ook erg handig als uw geschiedenis verder dan één scherm vol commits groeit. U kunt het volgende gebruiken om commits in te tonen
maar niet in
Beide argumenten kunnen een commit-ID, een filiaalnaam of een tag zijn:
git log...
Ten slotte kunt u een diffstaat van de wijzigingen in elke commit weergeven. Dit is handig om te zien welke bestanden door een bepaalde commit zijn beïnvloed.
git log --stat
Voor het visualiseren van de geschiedenis, wilt u misschien ook naar de gitk
commando, wat eigenlijk een apart programma is dat is gericht op het tekenen van branches. Rennen Git help gitk
voor details.
Tags zijn eenvoudige wegwijzers naar commits en ze zijn ongelooflijk handig voor het markeren van belangrijke revisies zoals openbare releases. De git tag
commando kan worden gebruikt om een nieuwe tag te maken:
git tag -a v1.0 -m "Stabiele release"
De -een
optie vertelt Git om een te maken geannoteerde tag, waarmee u een bericht kunt opnemen (opgegeven met -m
).
Als u dezelfde opdracht uitvoert zonder argumenten, worden uw bestaande tags weergegeven:
git tag
Deze les vertegenwoordigt een hoofdstuk van Git Kortbij, een gratis eBoek van het team van Syncfusion.