Git Diff Uitgelegd: Een Volledige Gids met Voorbeelden

Git-diff is jouw venster naar de veranderingen die plaatsvinden in jouw code repository. In de kern is het een commando dat je de verschillen laat zien tussen verschillende staten van jouw bestanden – of dat nu het vergelijken is van jouw huidige werk met wat je al gestaged hebt of het vergelijken van veranderingen tussen branches en commits. Denk eraan als de manier van Git om de vraag te beantwoorden: “Wat is er veranderd?” Wanneer je git diff, Git analyseert de inhoud van bestanden regel voor regel, identificeert wat er is toegevoegd, verwijderd of gewijzigd, en presenteert deze informatie in een gestandaardiseerd formaat dat precies aangeeft wat er is gewijzigd en waar.

Git diff helpt ontwikkelaars de codekwaliteit te waarborgen door een duidelijk overzicht van wijzigingen te bieden voordat ze worden geüpload. Hier zullen we behandelen hoe je dit essentiële commando effectief kunt gebruiken, van basisvergelijkingen tot geavanceerde technieken die jouw ontwikkelingsworkflow en team samenwerking zullen verbeteren.

Vereisten

Om deze tutorial te volgen, moet je bekend zijn met deze Git-concepten:

  • Basis Git-workflow (init, add, commit)
  • Git-repositories en hun structuur
  • Branches en hoe ze werken
  • Commits en commitgeschiedenis
  • De staging area (index)

Als je deze concepten moet opfrissen, kunnen deze bronnen helpen:

Je hebt Git geïnstalleerd op je systeem nodig om de voorbeelden te volgen. Alle commando’s kunnen worden uitgevoerd in een terminal of opdrachtprompt.

Waarom Git Diff Essentieel is voor Ontwikkelaars

Elke ontwikkelaar moet weten wat er is veranderd in hun code, of ze nu alleen werken of in een team van honderden. Zonder git diff zou je moeten raden welke regels je hebt gewijzigd, waardoor probleemoplossing en samenwerking vrijwel onmogelijk zouden zijn.

Git diff is essentieel voor veranderingsbeheer en dient als de basis voor het bouwen van kwaliteitssoftware via effectieve beoordelingsprocessen. Bij het onderzoeken van veranderingen biedt git diff de context die nodig is om te begrijpen niet alleen wat er is veranderd, maar ook waarom die veranderingen van belang zijn.

Deze directe zichtbaarheid in de code-evolutie helpt teams om standaarden te handhaven en te voorkomen dat bugs de productie bereiken.

Naarmate projecten complexer worden, wordt git diff echt onmisbaar om verschillende belangrijke redenen:

  • Verificatie van veranderingen: Bevestig precies wat je gaat committen, om het per ongeluk toevoegen van debugcode of niet-gerelateerde veranderingen te voorkomen
  • Kennisoverdracht: Begrijp wat teamgenoten hebben gedaan zonder hele bestanden te lezen
  • Conflictoplossing: Identificeer precies waar en hoe wijzigingen conflicteren tijdens samenvoegingen
  • Historische analyse: Spoor op wanneer specifieke wijzigingen zijn geïntroduceerd om bugs op te sporen of de evolutie van functies te begrijpen
  • Gerichte code-beoordelingen: Richt de aandacht op de delen van de code die daadwerkelijk zijn gewijzigd, bespaar tijd en verbeter de kwaliteit van de beoordeling

Om git-diff effectief te gebruiken, is het noodzakelijk om de onderliggende architectuur te begrijpen die deze vergelijkingen mogelijk maakt – het “Drie-Boom” model van Git.

De Drie-Boom Architectuur van Git

Om git-diff te begrijpen, moet je eerst het fundamentele “drie-boom” architectuur van Git begrijpen. Ondanks de naam zijn dit geen werkelijke bomen in het bestandssysteem, maar eerder drie afzonderlijke toestanden waarin jouw code bestaat.

Denk aan deze staten als drie verschillende versies van je project die Git simultaan bijhoudt: de Werkdirectory (je daadwerkelijke bestanden), het Staging Gebied (of index, waar wijzigingen worden voorbereid om te committen), en de Repository (de gecommitte geschiedenis van je project opgeslagen in de .git map).

Bron: Hashnode

De Werkdirectory bevat de bestanden die je actief aan het bewerken bent – hier schrijf je code, maak je wijzigingen, en test je je werk. Het Staging Gebied fungeert als een voorbereidingszone waar je selecteert welke wijzigingen opgenomen moeten worden in je volgende commit. Je kunt het zien als een laadperron waar pakketten (je wijzigingen) georganiseerd worden voordat ze verzonden worden.

Tenslotte slaat de Repository de volledige geschiedenis van je project op als een reeks commits, snapshots van je code op specifieke momenten in de tijd, aan elkaar gekoppeld om een historische keten te vormen.

Git diff werkt door deze drie toestanden met elkaar te vergelijken in verschillende combinaties. Wanneer je git diff uitvoert zonder argumenten, vergelijkt het je Werkmap met de Staging Area, en toont het de wijzigingen die je hebt gemaakt maar nog niet hebt gestaged.

Het gebruik van git diff --staged vergelijkt de Staging Area met de laatste commit, en toont wat in je volgende commit zal worden opgenomen.

En git diff HEAD vergelijkt je werkmap rechtstreeks met de laatste commit, waarbij alle niet-gecommiteerde wijzigingen worden weergegeven ongeacht de staging-status.

Deze vergelijkingspunten vormen de basis voor alle diff-operaties in Git:

  • Werkmap ↔ Staging Area: Welke wijzigingen heb ik gemaakt maar nog niet gestaged? (git diff)
  • Staging Area ↔ Repository: Welke wijzigingen heb ik klaargezet die vervolgens zullen worden toegevoegd? (git diff --staged)
  • Werkmap ↔ Repository: Wat is het totale verschil tussen mijn werkbestanden en de laatste commit? (git diff HEAD)
  • Tussen Commits: Hoe heeft de code zich ontwikkeld tussen specifieke punten in de geschiedenis? (git diff commit1-hash commit2-hash)

Het begrijpen van deze architectuur geeft je het mentale model dat nodig is om git diff effectief te gebruiken om precies te bepalen wat er is veranderd, waar en wanneer in je codebase.

Met dit architecturale inzicht op zijn plaats, kunnen we nu verkennen hoe we git diff commando’s in de praktijk kunnen gebruiken om inzicht te krijgen in de evolutie van je code over deze drie staten.

Basishandleiding Git Diff Gebruik

Laten we een voorbeeld van een gegevensanalyseproject maken om git diff in actie te demonstreren. We zullen een kleine repository opzetten met Python-scripts, CSV-gegevens en tekstbestanden die we gedurende deze zelfstudie kunnen aanpassen.

# Maak en initialiseer ons project mkdir data-analysis-project cd data-analysis-project git init # Maak initiële bestanden echo "# Data Analysis Project\nA sample project to demonstrate git diff functionality." > README.md echo "import pandas as pd\n\ndef load_data(filename):\n return pd.read_csv(filename)\n\ndef analyze_data(data):\n return data.describe()" > analysis.py echo "id,name,value\n1,alpha,10\n2,beta,20\n3,gamma,30" > data.csv echo "DEBUG=False\nDATABASE_PATH=./data/" > config.txt echo "def normalize_data(data):\n return (data - data.min()) / (data.max() - data.min())" > utils.py # Maak onze eerste commit git add . git commit -m "Initial commit with basic project structure" # Controleer de directorystructuur > tree . ├── README.md ├── analysis.py ├── config.txt ├── data.csv └── utils.py

Ons project heeft nu vijf bestanden onder versiebeheer, waardoor we een basis hebben om verschillende diff-scenario’s te demonstreren. Naarmate we vorderen, zullen we deze bestanden aanpassen om te laten zien hoe git diff veranderingen onthult in verschillende contexten.

Begrip van de resultaten van git diff

Wanneer je een git diff-opdracht uitvoert, volgt de output een gestandaardiseerd formaat dat is ontworpen om duidelijk aan te geven wat er is veranderd. Laten we ons analysis.py-bestand aanpassen om een diff in actie te zien:

# Update analysis.py met een nieuwe functie echo "import pandas as pd\n\ndef load_data(filename):\n return pd.read_csv(filename)\n\ndef analyze_data(data):\n return data.describe()\n\ndef visualize_data(data):\n return data.plot(kind='bar')" > analysis.py

Laten we nu de resulterende git diff bekijken:

git diff

Je ziet een output die vergelijkbaar is met het volgende:

Notitie: Om de git-diff-output te verlaten, druk op “q” op je terminal.

Laten we deze output nu nader bekijken:

  1. De header (diff --git a/analysis.py b/analysis.py) toont welk bestand wordt vergeleken, dat is analysis.py
  2. Het bestandsmetadata (index db0e049..a7a7ab0 100644) toont interne Git-identificatoren voor de voor- en na versies
  3. De bestandsmarkeringen (--- a/analyse.py en +++ b/analyse.py) geven de “voor” en “na” bestanden aan
  4. De hunkkop (@@ -5,3 +5,6 @@) toont welke regels zijn beïnvloed. Deze notatie kan worden geïnterpreteerd als:
  • -5,3 betekent dat er vanaf regel 5 in het originele bestand 3 regels worden getoond in het verschil
  • +5,6 betekent dat er vanaf regel 5 in het aangepaste bestand 6 regels worden getoond in het verschil
  • Het verschil tussen deze getallen geeft aan dat er 3 regels zijn toegevoegd

5. De inhoud verandert met regels die beginnen met + tonen toevoegingen

In grotere bestanden groepeert git diff wijzigingen in “hunks” – secties van het bestand die veranderingen bevatten. Elke hunk heeft zijn eigen kop met regelnummers om u te helpen de wijzigingen in het bestand te lokaliseren.

Vergelijking van werkmap en staging gebied

Het uitvoeren van git diff zonder argumenten vergelijkt uw Werkmap (de huidige staat van bestanden) met het Staging Gebied (wijzigingen klaar om te worden gecommit). Dit is handig om te controleren wat u heeft gewijzigd maar nog niet hebt voorbereid voor uw volgende commit.

Laten we meerdere bestanden aanpassen om te demonstreren:

# Werk README.md bij echo "# Data Analysis Project\nA sample project to demonstrate git diff functionality.\n\n## Installation\nRun \pip install -r requirements.txt" > README.md # Werk data.csv bij echo "id,name,value\n1,alpha,10\n2,beta,20\n3,gamma,30\n4,delta,40" > data.csv

Latenn we nu alleen de wijzigingen in README.md stagen:

git add README.md

Het uitvoeren van git diff nu toont alleen de niet-geëigende wijzigingen in data.csv en het analysis.py bestand hierboven:

Dit helpt je te focussen op wat je nog niet hebt geëigend. Als je wilt zien wat je al hebt geëigend:

git diff --staged # or git diff --cached (they're synonyms)

Dit toont de wijzigingen in README.md die zijn geëigend en klaar om te committen. Deze workflow is cruciaal voor het maken van schone, logische commits. Je kunt delen van je werk die samen logisch zijn, geëigen, de geëigende diff bekijken om te verifiëren dat het een samenhangende eenheid van verandering is, en het vervolgens committen.

Vergelijken van de staging area en de laatste commit

De git diff --staged opdracht vergelijkt uw Staging Area met uw laatste commit. Dit laat u precies zien wat er zal worden opgenomen in uw volgende commit als u nu git commit uitvoert.

Laten we onze wijzigingen in data.csv opslaan en bekijken wat er is opgeslagen:

git add data.csv git diff --staged

De output zal nu wijzigingen laten zien aan zowel README.md als data.csv, omdat beide zijn opgeslagen. Deze beoordelingsstap is cruciaal voordat u een commit doet – het fungeert als uw laatste verdedigingslinie tegen het per ongeluk commiten van wijzigingen.

Een veelvoorkomende workflow zou er als volgt uit kunnen zien:

  1. Maak wijzigingen in meerdere bestanden
  2. Voer git diff uit om alle wijzigingen te bekijken
  3. Gebruik git add <bestand> selectief om logische groepen wijzigingen toe te voegen
  4. Voer git diff --staged uit om te controleren wat er zal worden geüpload
  5. Commiteer de toegevoegde wijzigingen met git commit -m "Jouw bericht"
  6. Herhaal voor andere logische groepen wijzigingen

Deze methodische aanpak helpt bij het behouden van een schone, betekenisvolle commitgeschiedenis die het gemakkelijker maakt om te begrijpen hoe je project zich heeft ontwikkeld en om aan te wijzen waar problemen geïntroduceerd zouden kunnen zijn. Naarmate je meer ervaring opdoet, zullen deze diff-commando’s tweede natuur worden, dienend als je constante metgezellen in het ontwikkelingsproces.

Laten we onze commits maken voordat we verder gaan naar de volgende fase:

# data.csv en README.md moeten worden gecommit git commit -m "Modify data.csv and README.md files" # Stage en commit analysis.py git add analysis.py git diff --staged # Review the changes one more time git commit -m "Add a new function to analysis.py"

Intermediaire Git-diftechnieken

Nu we de basis van git diff begrijpen, laten we krachtigere technieken verkennen die je vermogen om wijzigingen in je projecten bij te houden en te analyseren zullen verbeteren. We zullen blijven werken aan ons data-analyseproject om deze tussentijdse concepten te demonstreren.

Vergelijken tussen verschillende referenties

Git is gebouwd rond het concept van referenties – pointers naar specifieke staten van je code. Deze referenties omvatten branches, commits en tags. Het git diff-commando kan elk twee van deze referenties vergelijken om te tonen wat er tussen hen veranderd is.

Laten we een nieuwe branch maken voor het ontwikkelen van een functie en wat wijzigingen aanbrengen:

# Maak een nieuwe branch aan en schakel hier naar over git checkout -b feature/advanced-analytics # Pas het analysis.py bestand aan met een nieuwe functie echo "import pandas as pd import numpy as np def load_data(filename): return pd.read_csv(filename) def analyze_data(data): return data.describe() def visualize_data(data): return data.plot(kind='bar') def perform_advanced_analysis(data): """Performs advanced statistical analysis on the dataset""" results = {} results['correlation'] = data.corr() results['skew'] = data.skew() return results" > analysis.py # Commit de wijzigingen git add analysis.py git commit -m "Add advanced analysis function"

Nu kunnen we onze feature branch vergelijken met de main branch:

git diff main feature/advanced-analytics

Deze opdracht toont alle verschillen tussen de twee branches – elk bestand dat is gewijzigd, toegevoegd of verwijderd. Je ziet de wijzigingen die we hebben aangebracht in analysis.py, inclusief onze nieuwe imports en functie (druk meerdere keren op enter omdat de volledige diff wordt afgekapt in de terminal).

Om te vergelijken met een specifieke commit, kun je de commit-hash gebruiken:

git log --oneline # Find the commit hash you want to compare with

git diff 7b3105e # Replace 7b3105e with the actual commit hash you want to compare

Deze vergelijkingsmogelijkheid is onmisbaar wanneer:

  • Je je voorbereidt op codebeoordelingen door alle wijzigingen in een feature branch te zien
  • Controleren welke wijzigingen een branch van een collega zou introduceren voordat je samenvoegt
  • Begrijpen hoe je codebase is geëvolueerd tussen releases of versies

Specifieke bestanden vergelijken

Wanneer je werkt met grote repositories, wil je vaak focussen op wijzigingen in specifieke bestanden of mappen in plaats van alle verschillen te zien. Git diff maakt dit eenvoudig door je in staat te stellen paden te specificeren.

Laten we wijzigingen aanbrengen in meerdere bestanden:

# Update config.txt echo "DEBUG=True DATABASE_PATH=./data/ LOG_LEVEL=INFO" > config.txt # Update utils.py echo "def normalize_data(data): return (data - data.min()) / (data.max() - data.min()) def clean_data(data): return data.dropna()" > utils.py

Om wijzigingen alleen in het config-bestand te zien:

git diff config.txt

Of om een specifiek bestand tussen branches te vergelijken:

# Vergelijk het analysis.py bestand tussen main en feature/advanced-analytics branches git diff main feature/advanced-analytics -- analysis.py

De -- in het bovenstaande commando helpt Git onderscheid te maken tussen verwijzingen en bestandspaden. Dit is bijzonder nuttig wanneer:

  • Je werkt in repositories met veel bestanden, maar je richt je op specifieke onderdelen (wat vaak het geval zal zijn)
  • Je bekijkt hoe configuratie is veranderd over branches heen
  • Je alleen de meest kritieke bestanden wilt bekijken in een grote set veranderingen

Contextuele diff-opties

Git diff biedt verschillende opties om aan te passen hoe verschillen worden weergegeven, waardoor het gemakkelijker wordt om te focussen op betekenisvolle veranderingen.

Bijvoorbeeld, bij het omgaan met wijzigingen in code-opmaak kunnen verschillen in witruimte belangrijke semantische wijzigingen verbergen. Laten we dit demonstreren met een opmaakwijziging:

# Maak een wijziging in de witruimte in analysis.py sed -i '' 's/ return/ return/g' analysis.py # Reduce indentation

Nu, wanneer we vergelijken met de standaard git diff, tonen de wijzigingen in witruimte (let op hoe de return-statements niet zijn uitgelijnd):

git diff analysis.py # OUT: --- a/analysis.py +++ b/analysis.py @@ -2,17 +2,17 @@ import pandas as pd import numpy as np def load_data(filename): - return pd.read_csv(filename) + return pd.read_csv(filename) def analyze_data(data): - return data.describe() + return data.describe() def visualize_data(data): - return data.plot(kind='bar') + return data.plot(kind='bar') def perform_advanced_analysis(data): Performs advanced statistical analysis on the dataset results = {} results['correlation'] = data.corr() results['skew'] = data.skew() - return results + return results

Maar we kunnen wijzigingen in witruimte negeren (dit toont geen wijzigingen omdat we alleen witruimte hebben verwijderd):

git diff -w analysis.py # or --ignore-all-space

Een andere handige optie is het controleren van contextregels – de ongewijzigde regels rondom modificaties getoond:

git diff -U1 analysis.py # Show only 1 line of context (default is 3) git diff -U5 analysis.py # Show 5 lines of context

Deze contextuele opties zijn met name waardevol wanneer:

  • Code wordt beoordeeld die is doorgegaan met geautomatiseerde opmaak
  • De focus ligt op functionele wijzigingen in plaats van opmaakwijzigingen
  • Meer context nodig is om een bepaalde wijziging te begrijpen
  • Er wordt gewerkt met grote bestanden waarbij de standaardcontext te veel uitvoer zou genereren

Door deze tussenliggende technieken onder de knie te krijgen, heb je veel meer controle over hoe je wijzigingen in je codebase beoordeelt en begrijpt, waardoor je ontwikkelworkflow efficiënter wordt en je codebeoordelingen effectiever.

Laten we de laatste wijzigingen committen voordat we verder gaan met geavanceerde toepassingen van git diff:

git add . git commit -m "Modify analysis.py, config.txt, and utils.py"

Geavanceerde Git Diff-toepassingen

Voortbouwend op ons begrip van de tussenliggende technieken van git diff, laten we enkele geavanceerde toepassingen verkennen die je Git-vaardigheden naar een hoger niveau zullen tillen. Deze geavanceerde technieken zijn bijzonder nuttig bij het werken aan complexe codebases of bij het samenwerken met grotere teams.

Het gebruik van externe diff-tools

Hoewel de ingebouwde diff van Git krachtig is, biedt soms een visuele diff-tool betere duidelijkheid, vooral bij complexe wijzigingen. Git stelt je in staat externe tools te configureren om je diff-ervaring te verbeteren.

Laten we een populaire visuele diff-tool instellen. We zullen VSCode als voorbeeld gebruiken, maar een soortgelijke configuratie werkt voor tools zoals Beyond Compare, Meld of KDiff3:

# Configureer Git om VSCode als de diff-tool te gebruiken (projectspecifiek) git config diff.tool vscode git config difftool.vscode.cmd "code --wait --diff \$LOCAL \$REMOTE" # Om andere populaire tools te gebruiken, zou je kunnen gebruiken: # Voor Beyond Compare (projectspecifiek): git config diff.tool bc3 git config difftool.bc3.path "/path/to/beyond/compare" # Installatieopdrachten: # Voor Beyond Compare: # Op macOS: brew install --cask beyond-compare # Op Ubuntu: sudo apt-get install beyond-compare # Op Windows: Download van https://www.scootersoftware.com/download.php # Opmerking: Om deze instellingen wereldwijd toe te passen in plaats van alleen voor het huidige project, # voeg de --global vlag toe aan elke opdracht, bijvoorbeeld: # git config --global diff.tool vscode

Voortaan in plaats van git diff, kun je gebruiken:

git difftool main feature/advanced-analytics

Dit opent uw geconfigureerde visuele diff-tool om de wijzigingen weer te geven. Zo ziet Beyond Compare eruit:

Visuele diff-tools bieden verschillende voordelen:

  1. Zij-aan-zij vergelijking waardoor het makkelijker is om de context te zien
  2. Syntax-highlighting die overeenkomt met uw editorvoorkeuren
  3. Geavanceerde navigatie tussen wijzigingen
  4. Mogelijkheid om bestanden direct te bewerken tijdens het bekijken van verschillen

Bij het bekijken van grote wijzigingen of bestanden met complexe structuren (zoals geneste JSON of XML), kunnen visuele diff-tools de begripsvorming en efficiëntie aanzienlijk verbeteren.

Specifieke diff-opdrachten

Git biedt gespecialiseerde diff-opdrachten die u meer gedetailleerde controle geven voor specifieke gevallen. Laten we enkele van deze krachtige opdrachten verkennen:

git diff-tree bekijkt verschillen tussen boomobjecten (mappen):

# Haal de hash van de laatste twee commits op LAST_COMMIT=$(git rev-parse HEAD) PREV_COMMIT=$(git rev-parse HEAD~1) # Toon de wijzigingen in de laatste commit git diff-tree --patch $PREV_COMMIT $LAST_COMMIT

git diff-index vergelijkt de werkmap met de index (staging area) of een boom:

# Vergelijk werkmap met de index git diff-index --patch HEAD

git diff-index is bijzonder nuttig voor scripting en automatisering. Het stelt je in staat om programmatisch te controleren welke wijzigingen zouden worden opgenomen in je volgende commit, waardoor het waardevol is voor pre-commit hooks en validatiescripts.

Bijvoorbeeld, je zou het kunnen gebruiken in een CI/CD-pijplijn om te controleren of bepaalde bestanden niet zijn gewijzigd of om ervoor te zorgen dat configuratiewijzigingen specifieke patronen volgen voordat commits worden toegestaan.

git diff-files toont verschillen tussen bestanden in de werkdirectory en de index:

# Controleer verschillen voor specifieke bestanden git diff-files --patch config.txt

Deze gespecialiseerde commando’s zijn bijzonder nuttig voor:

  • Het creëren van aangepaste Git-workflows en scripts
  • Debuggen van problemen met de interne werking van Git
  • Gerichte analyse van de repositorystatus uitvoeren
  • Automatiseringstools bouwen die communiceren met Git

Codegeschiedenis analyseren

Een van de krachtigste toepassingen van git diff is het analyseren van hoe code in de loop der tijd is geëvolueerd, wat cruciaal kan zijn voor debugging of het begrijpen van de ontwikkeling van functies.

Laten we een specifieke commit bekijken met behulp van de speciale ^! notatie:

# Haal de hash op van onze geavanceerde analytics commit ANALYTICS_COMMIT=$(git log --oneline | grep "advanced analysis" | cut -d ' ' -f 1) # Toon alleen wijzigingen geïntroduceerd in die specifieke commit git diff $ANALYTICS_COMMIT^!

De ^! syntaxis is een verkorte notatie om een commit te vergelijken met zijn ouder, precies tonend wat er veranderd is in die commit.

Om te traceren hoe een specifiek bestand in de loop van de tijd is geëvolueerd:

# Analyseer hoe analysis.py is veranderd in de laatste 3 commits git log -p -3 analysis.py

Bij het opsporen van een bug, kunt u git diff gebruiken met git bisect:

# Voeg een bug toe om een regressie te simuleren echo "import pandas as pd import numpy as np def load_data(filename): # Bug: per ongeluk None retourneren in plaats van de data pd.read_csv(filename) return None def analyze_data(data): return data.describe() def visualize_data(data): return data.plot(kind='bar') def perform_advanced_analysis(data): results = {} results['correlation'] = data.corr() results['skew'] = data.skew() return results" > analysis.py git add analysis.py git commit -m "Update analysis.py with a hidden bug" # Gebruik nu git bisect om te vinden wanneer de bug is geïntroduceerd git bisect start git bisect bad # Mark current commit as containing the bug git bisect good main # Mark the main branch as working correctly # Git zal commits voor u uitzoeken om te testen # Eenmaal gevonden, kunt u de exacte wijziging bekijken die de bug heeft geïntroduceerd git diff HEAD^!

Git bisect is een krachtig debugtool dat een binair zoekalgoritme uitvoert door uw commitgeschiedenis om te vinden welke commit een bug heeft geïntroduceerd. Gecombineerd met git diff, creëert het een efficiënte workflow:

1. Start het bisection proces met git bisect start

2. Markeer de huidige commit als slecht (met de bug) met git bisect bad

3. Markeer een bekende goede commit (waar de bug niet bestaat) met git bisect good <commit-hash>

4. Git controleert automatisch een commit in het midden van je geschiedenis voor jou om te testen.

5. Na het testen van de huidige commit, vertel git het resultaat:

  • Als de bug bestaat in deze commit: git bisect bad
  • Als de bug niet bestaat in deze commit: git bisect good

6. Git zal doorgaan met het controleren van verschillende commits op basis van jouw feedback (na elk git bisect slecht/goed commando), waarbij de zoekopdracht telkens wordt verkleind. Herhaal het testen en markeren proces totdat git de eerste slechte commit identificeert.

7. Zodra git de problematische commit heeft gevonden, zal het een bericht weergeven waarin wordt aangegeven welke commit de bug heeft geïntroduceerd.

8. Onderzoek precies wat er is gewijzigd in de geïdentificeerde commit met: git diff HEAD^!

9. Dit commando laat je precies zien welke code is gewijzigd in de commit die de bug heeft geïntroduceerd, zodat je je debuginspanningen kunt richten op die specifieke wijzigingen.

10. Verlaat de bisection op elk moment met: git bisect reset Hiermee keert u terug naar de branch waarop u zich bevond voordat u met het bisection-proces begon.

11. U kunt ook het bisection-proces automatiseren met: git bisect run <test-script> Waarbij een commando is dat 0 retourneert voor goede commits en een ander getal voor slechte commits.

Deze workflow vermindert aanzienlijk de tijd die nodig is voor debugging, vooral in grote codebases met veel commits tussen werkende en defecte toestanden.

Deze technieken voor geschiedenisanalyse zijn van onschatbare waarde voor:

  • Het vinden van wanneer en waarom een bug is geïntroduceerd
  • Het begrijpen van de evolutie van een functie of component
  • Het controleren van wijzigingen voor beveiligingsreviews
  • Het documenteren van het besluitvormingsproces achter code wijzigingen

Door deze geavanceerde git diff toepassingen te beheersen, kunt u de geschiedenis van uw project nauwkeurig doorlopen, problemen efficiënter oplossen en diepere inzichten krijgen in de evolutie van uw codebase.

Git Diff Commando Referentie

Git diff biedt een breed scala aan opties om de uitvoer en het gedrag aan te passen voor specifieke situaties. Hier is een uitgebreide referentie van de meest gebruikte parameters om uw differentiële analyse te verbeteren:

Basisvergelijkingsopties

  • git diff – Vergelijk de werkmap met het staging gebied
  • git diff --staged (of --cached) – Vergelijk het staging gebied met de laatste commit
  • git diff HEAD – Vergelijk de werkmap met de laatste commit
  • git diff <commit> – Vergelijk de werkmap met een specifieke commit
  • git diff <commit1> <commit2> – Vergelijk twee specifieke commits
  • git diff <branch1> <branch2> – Vergelijk twee branches

Pad beperken

  • git diff -- <path> – Beperk de vergelijking tot een specifiek bestand of map
  • git diff --stat – Toon een samenvatting van wijzigingen (gewijzigde bestanden, invoegingen, verwijderingen), een zeer nuttige optie voor grote verschillen
  • git diff --name-only – Toon alleen de namen van gewijzigde bestanden
  • git diff --name-status – Toon namen en status (toegevoegd, gewijzigd, verwijderd) van gewijzigde bestanden

Weergavebesturing

  • git diff -w (of –ignore-all-space) – Negeer wijzigingen in witruimte
  • git diff --ignore-space-change – Negeer wijzigingen in de hoeveelheid witruimte
  • git diff --color-words – Toon verschillen op woordniveau met kleur
  • git diff --word-diff – Toon verschillen op woordniveau in een ander formaat
  • git diff -U<n> – Toon n regels context (standaard is 3)
  • git diff --no-prefix – Toon geen a/ en b/ voorvoegsels in diff-uitvoer

Content filtering

  • git diff --binary – Toon wijzigingen in binaire bestanden
  • git diff -S<string> – Zoek naar wijzigingen die de opgegeven string toevoegen of verwijderen
  • git diff -G<regex> – Zoek naar wijzigingen die overeenkomen met het opgegeven regex-patroon
  • git diff --pickaxe-all – Bij gebruik van -S of -G, toon alle wijzigingen in het bestand, niet alleen overeenkomende

Opmaakopties

  • git diff --patch-with-stat – Toon patch en statistieken samenvatting
  • git diff --compact-summary – Toon statistieken samenvatting in een compacte indeling
  • git diff --numstat – Toon statistieken in een machinevriendelijke indeling
  • git diff --summary – Toon creatie-/verwijdersamenvatting

Deze opties kunnen worden gecombineerd om krachtige, gerichte vergelijkingen te maken. Bijvoorbeeld, om woordniveau veranderingen in een specifiek bestand te zien terwijl spaties worden genegeerd:

git diff --color-words -w -- analysis.py

Of om alle plaatsen te vinden waar een specifieke functie mogelijk is toegevoegd of verwijderd:

git diff -S"def perform_advanced_analysis" main feature/advanced-analytics

Het begrijpen van deze opties helpt je om door ruis heen te snijden en je precies te focussen op de veranderingen die er toe doen, waardoor je code review en analyse workflows efficiënter worden. Of je nu bugs aan het opsporen bent, je voorbereidt op een pull-verzoek, of gewoon probeert te begrijpen wat er veranderd is, de juiste git diff optie kan je taak aanzienlijk gemakkelijker maken.

Conclusie

In dit artikel hebben we git diff verkend als een veelzijdige opdracht voor het bekijken van codeveranderingen. We hebben het vergelijken van werkbestanden met staged changes behandeld, het onderzoeken van verschillen tussen branches en commits, en het gebruik van gespecialiseerde opdrachten voor diepere inzichten. Het opnemen van git diff in je workflow helpt bij het maken van schonere commits, het vroegtijdig opsporen van problemen en het vergemakkelijken van betere code reviews.

Of je nu alleen werkt of in een team, het beheersen van git diff tilt je op van simpelweg code schrijven naar het begrijpen hoe je codebase zich in de loop van de tijd ontwikkelt.

Om je Git-expertise verder op te bouwen, bekijk deze waardevolle bronnen:

Deze bronnen zullen je helpen voort te bouwen op wat je hebt geleerd over git diff en je beheersing van versiebeheer naar een hoger niveau te tillen.

Source:
https://www.datacamp.com/tutorial/git-diff-guide