Git

Git Rebase vejledning

Git Rebase vejledning

Begyndere af Git advares mod rebase-kommandoen. Og det med rette. Med alle de nye ting at lære er begyndere sandsynligvis bedre at beherske de grundlæggende begreber, før de går ned i kompliceringerne ved rebasing. Men hvis du forstår det grundlæggende ved at fusionere grene, kan det hjælpe dig med at løse nogle komplicerede udviklingspuslespil, når det rigtige tidspunkt kommer, at vide, hvordan man rebase.

Git Rebase: Definitioner

I henhold til git-dokumentationen vil rebase-kommandoen genanvende begår oven på en anden basistip. Denne definition kan være lidt skræmmende. Det er lettere at forklare rebase som en procedure, der føjer ændringerne af den aktuelle gren til halen af ​​en anden gren. Lad os gennemgå et eksempel for at få en bedre idé om, hvad der sker.

Eksempel på git rebasing

I dette eksempel opretter vi først en test case med 'master' og 'feature' gren. Så foretager vi en standardfusion. Dernæst vil vi genskabe testsagen og udføre ombinding og fletning.

1. Oprettelse af mester- og funktionsgrene

Her er det scenarie, vi opretter:

A - B - C (master) \ E - F (funktion) 

I ovenstående eksempel tager vi følgende vej:

  1. Forpligt A: vi tilføjer en.txt-fil i 'master'-grenen
  1. Forpligt B: vi tilføjer b.txt-fil i 'master'-grenen
  1. På dette tidspunkt opretter vi filialens 'funktion', hvilket betyder, at den har en.txt og b.txt
  1. Forpligt C: vi tilføjer c.txt-fil i 'master'-grenen
  1. Vi går til 'funktionsgrenen'
  1. Forpligt E: vi ændrer a.txt i 'funktion' gren
  1. Forpligt F: vi ændrer b.txt i 'funktions' gren

Du kan oprette en mappe og køre følgende kode inde i mappen for at oprette ovenstående situation:

git init touch a.txt git add -A git commit -m "Commit A: tilføjet a.txt "berør b.txt git add -A git commit -m "Commit B: tilføjet b.txt "git gren funktion touch c.txt git add -A git commit -m "Commit C: tilføjet c.txt "git status git checkout funktion echo aaa> a.txt git add -A git commit -m "Commit E: modificeret a.txt "ekko bbb> b.txt git add -A git commit -m "Commit F: modificeret b.txt " 

2. Enkel fletning

Lad os bruge logkommandoen til at kontrollere begge grene.

Resultater for 'master':

$ git checkout master Skiftet til gren 'master' $ git log --oneline 2bbde47 Forpligtelse C: tilføjet c.txt b430ab5 Forpligtelse B: tilføjet b.txt 6f30e95 Forpligtelse A: tilføjet a.txt $ ls a.txt b.txt c.txt 

Resultater for 'feature':

$ git checkout-funktion Skiftet til filialfunktion $ git-log - online 0286690 Forpligtelse F: ændret b.txt 7c5c85e Forpligt E: ændret a.txt b430ab5 Forpligtelse B: tilføjet b.txt 6f30e95 Forpligtelse A: tilføjet a.txt $ ls a.txt b.txt 

Bemærk, hvordan funktionsgrenen ikke har Commit C

Lad os nu køre filtfunktionsfilial med 'master' -filial. Du bliver bedt om at indtaste en kommentar. I kommentaren tilføj "Commit G:" i begyndelsen for at gøre det lettere at spore.

$ git checkout master Skiftet til filial 'master' $ git merge-funktion Fletning foretaget af den 'rekursive' strategi. -en.txt | 1 + b.txt | 1 + 2 filer ændret, 2 indsættelser (+) 

Resultater for 'master':

 $ git checkout master Allerede på 'master' $ git log --oneline d086ff9 Commit G: Flet filialfunktion '0286690 Commit F: modificeret b.txt 7c5c85e Forpligt E: ændret a.txt 2bbde47 Forpligt C: tilføjet c.txt b430ab5 Forpligtelse B: tilføjet b.txt 6f30e95 Forpligtelse A: tilføjet a.txt $ ls a.txt b.txt c.txt 

Resultater for 'feature':

$ git checkout-funktion Skiftet til filialfunktion $ git-log - online 0286690 Forpligtelse F: ændret b.txt 7c5c85e Forpligt E: ændret a.txt b430ab5 Forpligtelse B: tilføjet b.txt 6f30e95 Forpligtelse A: tilføjet a.txt $ ls a.txt b.txt 

I 'master' -grenen vil du bemærke, at der er en ny forpligtelse G, der har flettet ændringerne fra 'feature' -grenen. Grundlæggende har følgende handling fundet sted:

A - B - C - G (master) \ / E - F (funktion) 

I Commit G er alle ændringer fra 'feature' gren bragt ind i mastergrenen. Men selve 'funktions'-filialen har været uberørt på grund af fusionsprocessen. Læg mærke til hash for hver forpligtelse. Efter fusionen har E (7c5c85e) og F (0286690) commit den samme hash på 'feature' og 'master' gren.


3. Fusionerer med rebasing

Lad os gentage trin 1 for at oprette grenene 'master' og 'feature' igen.

Resultater for 'master':

$ git checkout master Skiftet til gren 'master' $ git log --oneline 7f573d8 Forpligtelse C: tilføjet c.txt 795da3c Forpligtelse B: tilføjet b.txt 0f4ed5b Forpligt A: tilføjet a.txt $ ls a.txt b.txt c.txt 

Resultater for 'feature':

$ git checkout-funktion Skiftet til filialfunktion $ git-log --oneline 8ed0c4e Forpligtelse F: ændret b.txt 6e12b57 Commit E: ændret a.txt 795da3c Forpligtelse B: tilføjet b.txt 0f4ed5b Forpligt A: tilføjet a.txt $ ls a.txt b.txt 

Lad os basere fra 'funktionsgrenen'.

$ git checkout-funktion Skiftet til gren 'feature' $ git rebase master Først spoler du hovedet tilbage for at afspille dit arbejde oven på det ... Anvender: Commit E: ændret en.txt Anvendelse: Forpligt F: ændret b.txt 

Flet derefter 'funktion' til 'master'.

$ git checkout master Skiftet til filial 'master' $ git merge-funktion Opdatering 7f573d8 ... 9efa1a3 Spol fremad.txt | 1 + b.txt | 1 + 2 filer ændret, 2 indsættelser (+) 

Resultater for 'mester' gren:

$ git checkout master Allerede på 'master' $ git log --oneline 9efa1a3 Commit F: modificeret b.txt 8710174 Commit E: modificeret a.txt 7f573d8 Forpligt C: tilføjet c.txt 795da3c Forpligtelse B: tilføjet b.txt 0f4ed5b Forpligt A: tilføjet a.txt $ ls a.txt b.txt c.txt 

Resultater for 'feature' gren:

$ git checkout-funktion Skiftet til filialfunktion $ git-log --oneline 9efa1a3 Forpligt F: ændret b.txt 8710174 Commit E: modificeret a.txt 7f573d8 Forpligt C: tilføjet c.txt 795da3c Forpligtelse B: tilføjet b.txt 0f4ed5b Forpligt A: tilføjet a.txt $ ls a.txt b.txt c.txt 

Bemærk, at begge grene er ens efter rebase og fletning. Også hash for E og F har ændret sig i begge grene. Grundlæggende er dette i rebasescenariet, hvad der skete:

A - B - C \ E '- F' (funktion, master) 

Derfor er der ingen ny forpligtelse. E- og F-forpligtelserne er blevet genberegnet og fastgjort til slutningen af ​​'master' -grenen.

Rebasing er et nyttigt værktøj, når du vil rydde op i dit arbejdshistorik. Der er dog en fare, der har født den gyldne regel.


Den gyldne regel om rebasing

Den gyldne regel for rebasing er:

Sæt aldrig en offentlig afdeling tilbage.

Som du kan se fra eksemplet ovenfor, genberegner forpligtelser på ny. Når flere personer forgrener sig fra et offentligt arkiv, kan rebasing skabe situationer, hvor udviklere, der har oprettet nye grene, vil løbe ind i meget komplicerede sammenlægningssituationer. Så det er en god ide aldrig at omlægge offentlige grene, der deles.

Afslutningsvis:

Rebasing er et unikt træk ved Git. Men brug det med forsigtighed.

Mere information:

Her er nogle links til videre undersøgelse:

Git Rebase-dokumentation
Atlassian Fletning vs Rebasing

Referencer:

Bedste apps til Gamepad Mapping til Linux
Hvis du kan lide at spille spil på Linux med en gamepad i stedet for et typisk tastatur- og musesystem, er der nogle nyttige apps til dig. Mange pc-sp...
Nyttige værktøjer til Linux-spillere
Hvis du kan lide at spille spil på Linux, er chancerne for, at du måske har brugt apps og hjælpeprogrammer som Wine, Lutris og OBS Studio for at forbe...
HD Remastered-spil til Linux, der aldrig tidligere havde haft en Linux-udgivelse
Mange spiludviklere og udgivere kommer med HD-remaster af gamle spil for at forlænge franchisens levetid. Venligst fans, der anmoder om kompatibilitet...