I stedet for en introduksjon
Hallo! I dag skal vi snakke om et versjonskontrollsystem, nemlig Git.
Grunnleggende om Git
Git er et distribuert versjonskontrollsystem for koden vår. Hvorfor trenger vi det? Distribuerte team trenger et slags system for å administrere arbeidet sitt. Det er nødvendig å spore endringer som skjer over tid. Det vil si at vi må kunne se trinn for trinn hvilke filer som har endret seg og hvordan. Dette er spesielt viktig når du undersøker hva som endret seg i sammenheng med en enkelt oppgave, noe som gjør det mulig å tilbakestille endringene.Installerer Git
La oss installere Java på datamaskinen din.Installerer på Windows
Som vanlig må du laste ned og kjøre en exe-fil. Alt er enkelt her: klikk på den første Google-lenken , utfør installasjonen, og det er det. For å gjøre dette bruker vi bash-konsollen levert av Windows. På Windows må du kjøre Git Bash. Slik ser det ut i Start-menyen:

Installerer på Linux
Vanligvis er Git en del av Linux-distribusjoner og er allerede installert, siden det er et verktøy som opprinnelig ble skrevet for Linux-kjerneutvikling. Men det er situasjoner når det ikke er det. For å sjekke, må du åpne en terminal og skrive: git --version. Hvis du får et forståelig svar, trenger du ingenting å installere. Åpne en terminal og installer Git på Ubuntu . Jeg jobber med Ubuntu, så jeg kan fortelle deg hva du skal skrive for det: sudo apt-get install git.Installerer på macOS
Også her må du først sjekke om Git allerede er der. Hvis du ikke har det, så er den enkleste måten å få det på å laste ned den nyeste versjonen her . Hvis Xcode er installert, vil Git definitivt bli installert automatisk.Git-innstillinger
Git har brukerinnstillinger for brukeren som skal sende inn arbeid. Dette gir mening og er nødvendig, fordi Git tar denne informasjonen for Author-feltet når en commit opprettes. Sett opp et brukernavn og passord for alle prosjektene dine ved å kjøre følgende kommandoer:
git config --global user.name "Ivan Ivanov"
git config --global user.email ivan.ivanov@gmail.com
Hvis du trenger å endre forfatteren for et spesifikt prosjekt, kan du fjerne "--global". Dette vil gi oss følgende:
git config user.name "Ivan Ivanov"
git config user.email ivan.ivanov@gmail.com
Litt teori...
For å dykke inn i emnet bør vi introdusere deg for noen få nye ord og handlinger...- git repository
- begå
- gren
- slå sammen
- konflikter
- dra
- trykk
- hvordan ignorere noen filer (.gitignore)
Statuser i Git
Git har flere statuer som må forstås og huskes:- usporet
- modifisert
- iscenesatt
- engasjert
Hvordan skal du forstå dette?
Dette er statuser som gjelder for filene som inneholder koden vår:- En fil som er opprettet, men som ennå ikke er lagt til i depotet, har statusen "usporet".
- Når vi gjør endringer i filer som allerede er lagt til i Git-depotet, blir statusen deres "modifisert".
- Blant filene vi har endret, velger vi de vi trenger, og disse klassene blir endret til "iscenesatt" status.
- En commit opprettes fra forberedte filer i trinnvis tilstand og går inn i Git-depotet. Etter det er det ingen filer med "iscenesatt" status. Men det kan fortsatt være filer hvis status er "endret".

Hva er en forpliktelse?
En commit er hovedbegivenheten når det kommer til versjonskontroll. Den inneholder alle endringene som er gjort siden forpliktelsen startet. Forpliktelser er koblet sammen som en enkeltlenket liste. Mer spesifikt: Det er en første forpliktelse. Når den andre forpliktelsen er opprettet, vet den hva som kommer etter den første. Og på denne måten kan informasjon spores. En commit har også sin egen informasjon, såkalte metadata:- forpliktelsens unike identifikator, som kan brukes til å finne den
- navnet på forpliktelsens forfatter, som opprettet den
- datoen forpliktelsen ble opprettet
- en kommentar som beskriver hva som ble gjort under forpliktelsen

Hva er en gren?
En gren er en pekepinn til en forpliktelse. Fordi en commit vet hvilken commit som går foran den, når en gren peker på en commit, gjelder alle de tidligere commitene også for den. Følgelig kan vi si at du kan ha så mange grener du vil som peker på samme commit. Arbeid skjer i grener, så når en ny commit opprettes, flytter grenen pekeren til den nyere commit.Komme i gang med Git
Du kan jobbe med et lokalt depot alene så vel som med et eksternt. For å praktisere de nødvendige kommandoene kan du begrense deg til det lokale depotet. Den lagrer kun all prosjektets informasjon lokalt i .git-mappen. Hvis vi snakker om det eksterne depotet, så er all informasjonen lagret et sted på den eksterne serveren: bare en kopi av prosjektet lagres lokalt. Endringer som er gjort i din lokale kopi kan skyves (git push) til det eksterne depotet. I diskusjonen vår her og nedenfor snakker vi om å jobbe med Git i konsollen. Selvfølgelig kan du bruke en slags GUI-basert løsning (for eksempel IntelliJ IDEA), men først bør du finne ut hvilke kommandoer som blir utført og hva de betyr.Arbeide med Git i et lokalt depot
Deretter foreslår jeg at du følger med og utfører alle trinnene jeg gjorde mens du leste artikkelen. Dette vil forbedre din forståelse og mestring av materialet. Vel, god appetitt! :) For å opprette et lokalt depot, må du skrive:
git init

git status

- git add -A — legg til alle filene til "iscenesatt" status
- git legg til. - legg til alle filer fra denne mappen og alle undermapper. I hovedsak er dette det samme som den forrige
- git add <filnavn> – legger til en spesifikk fil. Her kan du bruke regulære uttrykk for å legge til filer etter et eller annet mønster. For eksempel git add *.java: Dette betyr at du bare vil legge til filer med java-utvidelsen.
git add *.txt
For å sjekke statusen bruker vi kommandoen som allerede er kjent for oss:
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"
For å se på alle forpliktelser, skriv:
git log

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

Arbeider med .gitignore
Det er klart at vi bare ønsker å beholde kildekoden alene, og ingenting annet, i depotet. Så hva annet kan det være? Som et minimum, kompilerte klasser og/eller filer generert av utviklingsmiljøer. For å fortelle Git å ignorere dem, må vi lage en spesiell fil. Gjør dette: lag en fil kalt .gitignore i roten av prosjektet. Hver linje i denne filen representerer et mønster som skal ignoreres. I dette eksemplet vil .gitignore-filen se slik ut:
```
*.class
target/
*.iml
.idea/
```
La oss ta en titt:
- Den første linjen er å ignorere alle filer med filtypen .class
- Den andre linjen er å ignorere "mål"-mappen og alt den inneholder
- Den tredje linjen er å ignorere alle filer med filtypen .iml
- Den fjerde linjen er å ignorere .idea-mappen
git status


git add .gitignore
git commit -m "added .gitignore file"
Og nå sannhetens øyeblikk: vi har en kompilert klasse GitTest.class som er "usporet", som vi ikke ønsket å legge til Git-depotet. Nå bør vi se effekten av .gitignore-filen:
git status

Jobber med grener og slikt
Naturligvis er det upraktisk å jobbe i én gren for ensomme utviklere, og det er umulig når det er mer enn én person på et team. Det er derfor vi har filialer. Som jeg sa tidligere, er en gren bare en bevegelig pekepinn til forpliktelser. I denne delen skal vi utforske arbeid i forskjellige grener: hvordan slå sammen endringer fra en gren til en annen, hvilke konflikter som kan oppstå og mye mer. For å se en liste over alle grenene i depotet og forstå hvilken du er i, må du skrive:
git branch -a

- opprette en ny filial basert på den vi er i (99 % av tilfellene)
- opprette en filial basert på en spesifikk forpliktelse (1 % av tilfellene)
La oss lage en gren basert på en spesifikk forpliktelse
Vi vil stole på forpliktelsens unike identifikator. For å finne den skriver vi:
git log

git checkout -b development 6c44e53d06228f888f2f454d3cb8c1c976dd73f8
En gren opprettes med kun de to første commitene fra mastergrenen. For å bekrefte dette, sørger vi først for å bytte til en annen filial og ser på antall forpliktelser der:
git status
git log

git branch -a

La oss lage en gren basert på den nåværende
Den andre måten å lage en gren på er å lage den fra en annen. Jeg vil lage en gren basert på mastergrenen. Først må jeg bytte til det, og neste trinn er å lage en ny. La oss ta en titt:- git checkout master — bytt til mastergrenen
- git status — bekreft at vi faktisk er i mastergrenen

git checkout -b feature/update-txt-files

Konfliktløsning
Før vi utforsker hva en konflikt er, må vi snakke om å slå sammen en gren til en annen. Dette bildet viser prosessen med å slå sammen en gren til en annen:

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
Alt er klart så langt, ikke sant? La oss komplisere situasjonen: la oss nå si at du må endre txt-filen igjen. Men nå skal denne filen endres i mastergrenen også. Det vil med andre ord endre seg parallelt. Git vil ikke være i stand til å finne ut hva vi skal gjøre når vi ønsker å slå sammen vår nye kode inn i mastergrenen. La oss gå! Vi oppretter en ny gren basert på master, gjør endringer i text_resource.txt og oppretter en forpliktelse for dette arbeidet:
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"
Og nå det mest interessante poenget: vi må slå sammen endringer fra funksjonen/add-header-grenen til master. Vi er i mastergrenen, så vi trenger bare å skrive:
git merge feature/add-header
Men resultatet vil være en konflikt i test_resource.txt-filen: 

- Endringene som var på denne linjen i mastergrenen finnes mellom "<<<<<<< HEAD" og "=======".
- Endringene som var i grenen feature/add-header finnes mellom "=======" og ">>>>>>> feature/add-header.

git status

git add *.txt

git commit

Arbeider med eksterne depoter
Det siste trinnet er å finne ut noen flere kommandoer som er nødvendige for å fungere med det eksterne depotet. Som jeg sa, et eksternt depot er et sted hvor depotet er lagret og hvorfra du kan klone det. Hva slags eksterne depoter finnes det? Eksempler:-
GitHub er den største lagringsplattformen for repositories og samarbeidsutvikling. Jeg har allerede beskrevet det i tidligere artikler.
Følg meg på GitHub . Jeg viser ofte frem arbeidet mitt der i de områdene jeg studerer for arbeid. -
GitLab er et nettbasert verktøy for DevOps- livssyklusen med åpen kildekode . Det er et Git -basert system for å administrere kodelagre med sin egen wiki, feilsporingssystem , CI/CD-pipeline og andre funksjoner.
Etter nyheten om at Microsoft kjøpte GitHub, dupliserte noen utviklere prosjektene sine i GitLab. -
BitBucket er en webtjeneste for prosjektvert og samarbeidsutvikling basert på Mercurial og Git versjonskontrollsystemer. På et tidspunkt hadde den en stor fordel fremfor GitHub ved at den tilbød gratis private depoter. I fjor introduserte GitHub også denne muligheten for alle gratis.
-
Og så videre…
git clone https://github.com/romankh3/git-demo
Det finnes nå en komplett lokal kopi av prosjektet. For å være sikker på at den lokale kopien av prosjektet er den nyeste, må du trekke prosjektet ved å skrive:
git pull


git add test_resource.txt
git commit -m "prepared txt for pushing"
Kommandoen for å skyve dette til det eksterne depotet er:
git push

Nyttig link
- Offisiell Git-dokumentasjon . Jeg anbefaler det som referanse.
GO TO FULL VERSION