In plaats van een inleiding
Hallo! Vandaag gaan we het hebben over een versiebeheersysteem, namelijk Git.
Git-basis
Git is een gedistribueerd versiebeheersysteem voor onze code. Waarom hebben we het nodig? Gedistribueerde teams hebben een soort systeem nodig om hun werk te beheren. Het is nodig om veranderingen bij te houden die zich in de loop van de tijd voordoen. Dat wil zeggen, we moeten stap voor stap kunnen zien welke bestanden zijn gewijzigd en hoe. Dit is vooral belangrijk wanneer u onderzoekt wat er is veranderd in de context van een enkele taak, waardoor het mogelijk wordt om de wijzigingen ongedaan te maken.Git installeren
Laten we Java op uw computer installeren.Installeren op Windows
Zoals gewoonlijk moet u een exe-bestand downloaden en uitvoeren. Alles is hier eenvoudig: klik op de eerste Google-link , voer de installatie uit en dat is alles. Om dit te doen, gebruiken we de bash-console van Windows. Op Windows moet je Git Bash uitvoeren. Zo ziet het eruit in het menu Start:

Installeren op Linux
Gewoonlijk maakt Git deel uit van Linux-distributies en is het al geïnstalleerd, omdat het een tool is die oorspronkelijk is geschreven voor de ontwikkeling van de Linux-kernel. Maar er zijn situaties waarin dat niet zo is. Om dit te controleren, moet je een terminal openen en schrijven: git --version. Krijg je een verstaanbaar antwoord, dan hoef je niets te installeren. Open een terminal en installeer Git op Ubuntu . Ik werk aan Ubuntu, dus ik kan je vertellen wat je ervoor moet schrijven: sudo apt-get install git.Installeren op macOS
Ook hier moet je eerst controleren of Git er al is. Als je het niet hebt, kun je het het gemakkelijkst downloaden door hier de nieuwste versie te downloaden . Als Xcode is geïnstalleerd, wordt Git zeker automatisch geïnstalleerd.Git-instellingen
Git heeft gebruikersinstellingen voor de gebruiker die werk zal inleveren. Dit is logisch en noodzakelijk, omdat Git deze informatie gebruikt voor het veld Auteur wanneer een commit wordt gemaakt. Stel een gebruikersnaam en wachtwoord in voor al uw projecten door de volgende opdrachten uit te voeren:
git config --global user.name "Ivan Ivanov"
git config --global user.email ivan.ivanov@gmail.com
Als u de auteur voor een specifiek project moet wijzigen, kunt u "--global" verwijderen. Dit levert ons het volgende op:
git config user.name "Ivan Ivanov"
git config user.email ivan.ivanov@gmail.com
Een stukje theorie...
Om in het onderwerp te duiken, moeten we u kennis laten maken met een paar nieuwe woorden en acties...- git-opslagplaats
- verbinden
- tak
- samenvoegen
- conflicten
- trekken
- duw
- hoe sommige bestanden te negeren (.gitignore)
Statussen in Git
Git heeft verschillende standbeelden die begrepen en onthouden moeten worden:- niet gevolgd
- gewijzigd
- geënsceneerd
- betrokken
Hoe moet je dit begrijpen?
Dit zijn statussen die van toepassing zijn op de bestanden die onze code bevatten:- Een bestand dat is aangemaakt maar nog niet is toegevoegd aan de repository heeft de status "untracked".
- Wanneer we wijzigingen aanbrengen in bestanden die al aan de Git-repository zijn toegevoegd, is hun status "gewijzigd".
- Onder de bestanden die we hebben gewijzigd, selecteren we de bestanden die we nodig hebben, en deze klassen worden gewijzigd in de status "geënsceneerd".
- Er wordt een commit gemaakt van voorbereide bestanden in de geënsceneerde staat en gaat naar de Git-repository. Daarna zijn er geen bestanden meer met de status "staged". Maar er kunnen nog steeds bestanden zijn waarvan de status "gewijzigd" is.

Wat is een verbintenis?
Een commit is de belangrijkste gebeurtenis als het gaat om versiebeheer. Het bevat alle wijzigingen die zijn aangebracht sinds het begin van de commit. Commits zijn aan elkaar gekoppeld als een enkelvoudig gekoppelde lijst. Meer specifiek: er is een eerste commit. Wanneer de tweede commit is gemaakt, weet deze wat er na de eerste komt. En op deze manier kan informatie worden gevolgd. Een commit heeft ook zijn eigen informatie, zogenaamde metadata:- de unieke identificatie van de commit, die kan worden gebruikt om deze te vinden
- de naam van de auteur van de commit, die deze heeft gemaakt
- de datum waarop de commit is gemaakt
- een opmerking die beschrijft wat er tijdens de commit is gedaan

Wat is een filiaal?
Een branch is een pointer naar een bepaalde commit. Omdat een commit weet welke commit eraan voorafgaat, als een branch naar een commit verwijst, zijn al die eerdere commits ook daarop van toepassing. Dienovereenkomstig zouden we kunnen zeggen dat je zoveel branches kunt hebben als je wilt die naar dezelfde commit verwijzen. Het werk gebeurt in branches, dus wanneer een nieuwe commit wordt gemaakt, verplaatst de branch zijn pointer naar de meer recente commit.Aan de slag met Git
U kunt zowel alleen met een lokale repository als met een externe repository werken. Om de vereiste commando's te oefenen, kunt u zich beperken tot de lokale repository. Het slaat alleen alle projectinformatie lokaal op in de .git-map. Als we het hebben over de externe repository, dan wordt alle informatie ergens op de externe server opgeslagen: alleen een kopie van het project wordt lokaal opgeslagen. Wijzigingen in uw lokale kopie kunnen worden gepusht (git push) naar de externe repository. In onze discussie hier en hieronder hebben we het over werken met Git in de console. U kunt natuurlijk een soort GUI-gebaseerde oplossing gebruiken (bijvoorbeeld IntelliJ IDEA), maar eerst moet u uitzoeken welke opdrachten worden uitgevoerd en wat ze betekenen.Werken met Git in een lokale repository
Vervolgens stel ik voor dat u meegaat en alle stappen uitvoert die ik deed toen u het artikel las. Dit zal uw begrip en beheersing van de stof verbeteren. Nou, eet smakelijk! :) Om een lokale repository te maken, moet je schrijven:
git init

git status

- git add -A — voeg alle bestanden toe aan de status "staged".
- git toevoegen. — voeg alle bestanden uit deze map en alle submappen toe. In wezen is dit hetzelfde als de vorige
- git add <bestandsnaam> — voegt een specifiek bestand toe. Hier kunt u reguliere expressies gebruiken om bestanden volgens een bepaald patroon toe te voegen. Bijvoorbeeld git add *.java: Dit betekent dat je alleen bestanden met de java-extensie wilt toevoegen.
git add *.txt
Om de status te controleren gebruiken we het reeds bekende commando:
git status

git commit -m "all txt files were added to the project"

git log

git status

git status

git diff

git add test_resource.txt
git commit -m "added hello word! to test_resource.txt"
Om alle commits te bekijken, schrijf je:
git log

git add GitTest.java
git commit -m "added GitTest.java"
git status

Werken met .gitignore
Het is duidelijk dat we alleen de broncode willen behouden, en niets anders, in de repository. Dus wat kan er nog meer zijn? Minimaal gecompileerde klassen en/of bestanden gegenereerd door ontwikkelomgevingen. Om Git te vertellen ze te negeren, moeten we een speciaal bestand maken. Doe dit: maak een bestand aan met de naam .gitignore in de hoofdmap van het project. Elke regel in dit bestand vertegenwoordigt een te negeren patroon. In dit voorbeeld ziet het .gitignore-bestand er als volgt uit:
```
*.class
target/
*.iml
.idea/
```
Laten we kijken:
- De eerste regel is om alle bestanden met de extensie .class te negeren
- De tweede regel is om de map "target" en alles wat deze bevat te negeren
- De derde regel is om alle bestanden met de extensie .iml te negeren
- De vierde regel is om de map .idea te negeren
git status


git add .gitignore
git commit -m "added .gitignore file"
En nu het moment van de waarheid: we hebben een gecompileerde klasse GitTest.class die "untracked" is, die we niet wilden toevoegen aan de Git-repository. Nu zouden we de effecten van het .gitignore-bestand moeten zien:
git status

Werken met takken en zo
Natuurlijk is werken in slechts één branche onhandig voor solitaire ontwikkelaars, en het is onmogelijk als er meer dan één persoon in een team zit. Daarom hebben we vestigingen. Zoals ik al eerder zei, is een branch slechts een verplaatsbare pointer naar commits. In dit deel gaan we in op het werken in verschillende branches: hoe veranderingen van de ene branch in de andere kunnen worden samengevoegd, welke conflicten er kunnen ontstaan, en nog veel meer. Om een lijst te zien van alle branches in de repository en te begrijpen in welke je bent, moet je schrijven:
git branch -a

- maak een nieuwe branche op basis van degene waarin we ons bevinden (99% van de gevallen)
- maak een branch op basis van een specifieke commit (1% van de gevallen)
Laten we een branch maken op basis van een specifieke commit
We vertrouwen op de unieke identificatie van de commit. Om het te vinden, schrijven we:
git log

git checkout -b development 6c44e53d06228f888f2f454d3cb8c1c976dd73f8
Een branch wordt gemaakt met alleen de eerste twee commits van de master branch. Om dit te verifiëren, zorgen we er eerst voor dat we overschakelen naar een andere branch en kijken naar het aantal commits daar:
git status
git log

git branch -a

Laten we een branch maken op basis van de huidige
De tweede manier om een branch te maken, is door deze vanuit een andere te maken. Ik wil een branch maken op basis van de master branch. Eerst moet ik ernaar overschakelen en de volgende stap is het maken van een nieuwe. Laten we kijken:- git checkout master — schakel over naar de master branch
- git status — verifieer dat we ons daadwerkelijk in de master branch bevinden

git checkout -b feature/update-txt-files

Conflictoplossing
Voordat we onderzoeken wat een conflict is, moeten we het hebben over het samenvoegen van de ene tak in de andere. Deze afbeelding toont het proces van het samenvoegen van de ene tak in de andere:

git add *.txt
git commit -m "updated txt files"
git log

git checkout master
git merge feature/update-txt-files
git log

git branch -D feature/update-txt-files
Alles is tot nu toe duidelijk, ja? Laten we de situatie ingewikkelder maken: laten we nu zeggen dat u het txt-bestand opnieuw moet wijzigen. Maar nu zal dit bestand ook in de master branch worden gewijzigd. Met andere woorden, het zal parallel veranderen. Git zal niet kunnen achterhalen wat te doen als we onze nieuwe code willen samenvoegen in de master branch. Laten we gaan! We zullen een nieuwe branch maken op basis van master, wijzigingen aanbrengen in text_resource.txt en een commit maken voor dit werk:
git checkout -b feature/add-header
... we make changes to the file

git add *.txt
git commit -m "added header to txt"

git checkout master
… we updated test_resource.txt

git add test_resource.txt
git commit -m "added master header to txt"
En nu het meest interessante punt: we moeten wijzigingen van de feature/add-header branch samenvoegen tot master. We zitten in de master branch, dus we hoeven alleen maar te schrijven:
git merge feature/add-header
Maar het resultaat zal een conflict zijn in het bestand test_resource.txt: 

- De veranderingen op deze regel in de master branch zijn gevonden tussen "<<<<<<< HEAD" en "=======".
- De wijzigingen in de feature/add-header branch zijn gevonden tussen "=======" en ">>>>>>> feature/add-header".

git status

git add *.txt

git commit

Werken met externe opslagplaatsen
De laatste stap is om nog een paar commando's te bedenken die nodig zijn om met de externe repository te werken. Zoals ik al zei, een externe repository is een plaats waar de repository is opgeslagen en van waaruit u deze kunt klonen. Wat voor soort externe opslagplaatsen zijn er? Voorbeelden:-
GitHub is het grootste opslagplatform voor opslagplaatsen en gezamenlijke ontwikkeling. Ik heb het al beschreven in eerdere artikelen.
Volg mij op GitHub . Ik pronk daar vaak met mijn werk in de gebieden die ik studeer voor werk. -
GitLab is een webgebaseerde tool voor de DevOps- levenscyclus met open source . Het is een op Git gebaseerd systeem voor het beheren van coderepository's met een eigen wiki, bugvolgsysteem , CI/CD-pijplijn en andere functies.
Na het nieuws dat Microsoft GitHub had gekocht, dupliceerden sommige ontwikkelaars hun projecten in GitLab. -
BitBucket is een webservice voor projecthosting en gezamenlijke ontwikkeling op basis van de versiebeheersystemen Mercurial en Git. Ooit had het een groot voordeel ten opzichte van GitHub omdat het gratis privérepository's aanbood. Vorig jaar introduceerde GitHub deze mogelijkheid ook gratis voor iedereen.
-
Enzovoorts…
git clone https://github.com/romankh3/git-demo
Er is nu een volledige lokale kopie van het project. Om er zeker van te zijn dat de lokale kopie van het project de nieuwste is, moet u het project ophalen door te schrijven:
git pull


git add test_resource.txt
git commit -m "prepared txt for pushing"
De opdracht om dit naar de externe repository te pushen is:
git push

Handige link
- Officiële Git-documentatie . Ik raad het aan als referentie.
GO TO FULL VERSION