Delen via


Inzichten in de vereenvoudiging van de Git-geschiedenis

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Vereenvoudiging van Git-geschiedenis kan een verwarrend beest zijn. 99% van de tijd dat je niet eens weet dat het bestaat, maar af en toe springt het uit de donkere hoeken van Git en bijt je. In dit artikel verkennen we wat vereenvoudiging van de geschiedenis is en hoe dit verwarring kan veroorzaken bij het bekijken van de bestandsgeschiedenis.

Laten we beginnen met een veelvoorkomend scenario:

  1. U pusht een wijziging naar een bestand en voegt de wijziging vervolgens samen in de hoofdmap.
  2. Sommige collega's voegen ook hun vertakkingen samen naar het hoofd.
  3. U komt later terug en u ziet dat uw wijzigingen ontbreken.
  4. Op zoek naar de schuldige, ga je kijken naar de bestandsgeschiedenis en let op... worden uw wijzigingen niet eens vermeld!?

Git-doorvoergeschiedenis is een structuur. Soms is de chronologische geschiedenis niet hetzelfde als de werkelijke bestandsstructuurgeschiedenis. Deze situatie treedt meestal op wanneer een doorvoerbewerking een bestand terug zet naar de oorspronkelijke staat. In dat geval worden in de standaardgeschiedenisweergave niet alle wijzigingen weergegeven, omdat het bestand technisch gezien niet is gewijzigd. In dit scenario realiseert Git zich dat het de geschiedenis kan vereenvoudigen en dat de 'wijzigingen' die u waarschijnlijk zoekt, uit het logboek worden verwijderd.

Tenzij je het al eerder tegengekomen hebt, kan je gefrustreerd raken.

Vereenvoudiging van geschiedenis: Standaard ingeschakeld

Standaard wordt de logboekopdracht voor een bestand uitgevoerd: git log file.txt de geschiedenis wordt automatisch vereenvoudigd, waardoor sommige doorvoeringen mogelijk worden verborgen uit de uitvoer. Zie de git log man-pagina voor meer informatie.

Wat aan de verwarring toevoegt, is dat er geen vereenvoudiging van de geschiedenis optreedt als u gewoon uitvoertgit log, omdat u alle wijzigingen bekijkt, er niets is om te vereenvoudigen.

Als u de vereenvoudiging van de geschiedenis wilt uitschakelen, moet u de opdrachtregelschakelaar --full-historygebruiken.

Een voorbeeld van de vereenvoudiging van de geschiedenis

Om beter te begrijpen hoe vereenvoudiging werkt, maken we ons eigen voorbeeld van de vereenvoudiging van de geschiedenis. Laten we eerst eens kijken naar een diagram van de geschiedenis die we gaan maken:

Git-vertakkingen

Zoals u kunt zien, gaan we het volgende doen:

  1. Maak een bestand .
  2. Voeg een regel toe aan dat bestand in een vertakking (dieren).
  3. Voeg een andere regel toe aan dat bestand in een andere vertakking (fruit).
  4. Voeg takdieren weer samen in de hoofdmap.
  5. Voeg vertakkingsvruchten weer samen in de hoofdmap en kies de volledige kopie van het bestand uit de fruittak.
  6. Controleer de geschiedenis van het bestand.

Git vereenvoudigt de geschiedenis voor ons. Stap 5 is de sleutel hier. We negeerden alle wijzigingen van de dierenvertakking . Git ziet dat ons bestand in feite niet is gewijzigd tussen stap 1 en stap 5, en dat er dus slechts twee geschiedenisvermeldingen worden weergegeven.

Eerst maken we het bestand en voegen we het toe aan onze opslagplaats:

> cd sample
> git init
> echo "some content" > test.txt
> git add test.txt
> git commit -m "Initial commit"

Nu besluiten we de tekst 'ezels' toe te voegen aan het bestand in een dierenvertakking:

> git checkout -b animals
> echo "donkeys" >> test.txt
> git commit -am "We have added an animal"

Terwijl we experimenteren, besluiten we misschien dat we in plaats daarvan met fruit in ons bestand willen gaan, dus maken we een andere vertakking en voegen we de tekst 'bananen' toe aan het einde van het bestand:

> git checkout main -b fruit
> echo "bananas" >> test.txt
> git commit -am "We have added a fruit"

Als u tevreden bent met onze wijzigingen, besluiten we om onze dierenvertakking weer samen te voegen in het hoofd:

> git checkout main
> git merge animals

Laten we nu het logboek voor ons test.txt bestand bekijken:

> git log test.txt
    
    commit 6b33d99b996c430a60c9552b79245d1aa8320339
        Date:   Mon Feb 15 10:45:33 2016 -0500

        We have added an animal

    commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
        Date:   Mon Feb 15 10:44:18 2016 -0500

        Initial commit

Tot nu toe zo goed, toch? Niets ziet er gewoon uit in onze logboekuitvoer. Laten we nu zeggen dat we van gedachten veranderden en besloten om onze fruittak samen te voegen:

>git merge fruit
    
    Auto-merging test.txt
    CONFLICT (content): Merge conflict in test.txt
    Automatic merge failed; fix conflicts and then commit the result.

Een samenvoegingsconflict. Na enige overweging besluiten we het hele test.txt bestand van onze fruittak te gebruiken. Normaal gesproken gebruikt u een teksteditor of hulpprogramma voor samenvoegen, maar we maken gewoon het hele bestand opnieuw, omdat dit slechts twee regels is:

> echo "some content" > test.txt
> echo "bananas" >> test.txt
> git commit -am "Fixed merge conflict"

Laten we nu eens kijken naar de geschiedenis van ons test.txt bestand:

> git log test.txt
    
    commit fdd4dfd816c4efebc5bdb240f49e934e299db581
        Date:   Mon Feb 15 10:51:06 2016 -0500

        We have added a fruit

    commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
        Date:   Mon Feb 15 10:44:18 2016 -0500

        Initial commit

We zien geen wijzigingen van ons eerste experiment in het logboek, en we zien onze samenvoeging ook niet. Zijn ze er nog? Zijn de wijzigingen volledig door Git verwijderd?

> git log --full-history test.txt

Zoals u kunt zien, hoewel het logboek zonder de full-history vlag is vereenvoudigd, heeft Git al onze wijzigingen bewaard:

> commit 5d0bb77a24e265dc154654fb3b5be331b53bf977
    Merge: 6b33d99 fdd4dfd
        Date:   Mon Feb 15 10:59:34 2016 -0500

        Fixed merge conflict

    commit fdd4dfd816c4efebc5bdb240f49e934e299db581
        Date:   Mon Feb 15 10:51:06 2016 -0500

        We have added a fruit

    commit 6b33d99b996c430a60c9552b79245d1aa8320339
        Date:   Mon Feb 15 10:45:33 2016 -0500

        We have added an animal

    commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
        Date:   Mon Feb 15 10:44:18 2016 -0500

        Initial commit

Samenvatting van vereenvoudiging van Git-geschiedenis

Het belangrijkste van de vereenvoudiging van de geschiedenis is dat u het meestal nooit zult merken. Maar wanneer een samenvoegingsconflict fout gaat en u wilt weten wat er is gebeurd, kunt u de git-logboekgeschiedenis bekijken en zich afvragen waar uw wijzigingen zijn gegaan.

In plaats van in paniek te raken, weet je dat:

  • Geschiedenis vereenvoudigen voor bestanden is standaard ingeschakeld
  • Met de --full-history vlag krijgt u een uitgebreidere bestandsgeschiedenis

Update: Sinds ik dit artikel heb geschreven, heeft Azure DevOps Services een aantal geweldige weergaveopties voor geschiedenis op internet geïntroduceerd. Wat dit betekent, is dat als u niet door de opdrachtregel wilt lopen, u gewoon het bestand kunt ophalen waarvoor u de geschiedenis wilt bekijken in onze verkenner. U krijgt het onderstaande geschiedenisfilter te zien, waar u eenvoudige of niet-eenvoudige geschiedenisweergaven kunt opgeven:

Git-filters

c) 2016 Microsoft Corporation. Alle rechten voorbehouden. Dit document wordt 'as-is' opgegeven. Informatie en weergaven die in dit document worden uitgedrukt, met inbegrip van URL's en andere internetwebsiteverwijzingen, kunnen zonder kennisgeving worden gewijzigd. U gebruikt deze op eigen risico.

Aan dit document kunt u geen enkel wettelijk recht ontlenen op enige intellectuele eigendom van een Microsoft-product. U mag dit document kopiëren en gebruiken voor uw eigen referentiedoeleinden.