Nybegynnere av Git blir advart mot rebasekommandoen. Og med rette. Med alle de nye tingene å lære, har nybegynnere sannsynligvis bedre å mestre de grunnleggende konseptene før de går inn. Imidlertid, hvis du forstår det grunnleggende om å slå sammen grener, kan det å vite hvordan du skal rebase hjelpe deg med å løse noen kompliserte utviklingspuzzles når riktig tid kommer.
Git Rebase: Definisjoner
I henhold til GIT -dokumentasjonen vil rebase -kommandoen søke på nytt på toppen av et annet basisspiss. Denne definisjonen kan være litt skremmende. Det er lettere å forklare rebase som en prosedyre som tilfører endringene av den nåværende grenen til halen til en annen gren. La oss gå gjennom et eksempel for å få en bedre ide om hva som skjer.
Git rebasing eksempel
I dette eksemplet vil vi først opprette en testsak med 'Master' og 'Feature' gren. Da vil vi gjøre en standard sammenslåing. Deretter vil vi gjenskape testsaken og utføre rebase og slå sammen.
1. Opprette master- og funksjonsgrener
Her er scenariet vi vil lage:
I eksemplet ovenfor tar vi følgende vei:
- Forplikte A: Vi legger til en.txt -fil i 'master' grenen
- Forpliktelse B: Vi legger til B.txt -fil i 'master' grenen
- På dette stadiet lager vi grenens 'funksjon' som betyr at den vil ha en.txt og b.tekst
- Forpliktelse C: Vi legger til C.txt -fil i 'master' grenen
- Vi går til 'funksjonen' grenen
- Forpliktelse E: Vi endrer en.txt i 'Feature' filial
- Forplikt deg: vi endrer B.txt i 'Feature' filial
Du kan opprette en mappe og kjøre følgende kode i mappen for å opprette situasjonen ovenfor:
git init
berør a.tekst
git add -a
git commit -m "forpliktelse a: lagt til en.tekst"
berøring b.tekst
git add -a
git commit -m "commit b: lagt til b.tekst"
Git Branch -funksjon
berøring c.tekst
git add -a
git commit -m "commit c: lagt til c.tekst"
git status
Git Checkout -funksjon
ekko aaa> a.tekst
git add -a
git forpliktelse -m "forpliktelse e: modifisert a.tekst"
ekko BBB> B.tekst
git add -a
git commit -m "commit f: modifisert b.tekst"
2. Enkel sammenslåing
La oss bruke loggkommandoen for å sjekke begge grenene.
Resultater for 'master':
$ git Checkout Master
Byttet til filial 'master'
$ git log --oneline
2BBDE47 Commit C: Lagt til C.tekst
B430AB5 forpliktelse B: Lagt til B.tekst
6F30E95 forplikte A: Lagt til en.tekst
$ ls
en.txt b.txt c.tekst
Resultater for 'funksjon':
$ git kassafunksjon
Byttet til gren 'funksjon'
$ git log --oneline
0286690 forpliktelse f: modifisert b.tekst
7c5c85e forpliktelse e: modifisert a.tekst
B430AB5 forpliktelse B: Lagt til B.tekst
6F30E95 forplikte A: Lagt til en.tekst
$ ls
en.txt b.tekst
Legg merke til hvordan funksjonsgrenen ikke har forpliktelse C
La oss nå løpe sammen "Feature 'Branch med' Master 'Branch. Du blir bedt om å legge inn en kommentar. I kommentaren, legg til “Cast g:” i begynnelsen for å gjøre det lettere å spore.
$ git Checkout Master
Byttet til filial 'master'
$ git fusjonsfunksjon
Fusjon laget av den "rekursive" strategien.
en.txt | 1 +
b.txt | 1 +
2 filer endret, 2 innsettinger (+)
Resultater for 'master':
$ git Checkout Master
Allerede på 'Master'
$ git log --oneline
D086FF9 Commit G: Merge Branch 'Feature'
0286690 forpliktelse f: modifisert b.tekst
7c5c85e forpliktelse e: modifisert a.tekst
2BBDE47 Commit C: Lagt til C.tekst
B430AB5 forpliktelse B: Lagt til B.tekst
6F30E95 forplikte A: Lagt til en.tekst
$ ls
en.txt b.txt c.tekst
Resultater for 'funksjon':
$ git kassafunksjon
Byttet til gren 'funksjon'
$ git log --oneline
0286690 forpliktelse f: modifisert b.tekst
7c5c85e forpliktelse e: modifisert a.tekst
B430AB5 forpliktelse B: Lagt til B.tekst
6F30E95 forplikte A: Lagt til en.tekst
$ ls
en.txt b.tekst
I 'master' grenen vil du merke at det er en ny forpliktelse G som har slått sammen endringene fra 'funksjonen' filial. I utgangspunktet har følgende handlinger funnet sted:
A - B - C - G (Master)
\ /
E - F (funksjon)
I Commit G har alle endringene fra 'Feature' -grenen blitt brakt inn i mastergrenen. Men selve "funksjonen" har holdt seg uberørt på grunn av sammenslåingsprosessen. Legg merke til hashen for hver forpliktelse. Etter sammenslåingen har E (7C5C85E) og F (0286690) forpliktelse den samme hasj på 'Feature' og 'Master' filial.
3. Slå sammen med ombasering
La oss gjenta trinn 1 for å lage 'master' og 'funksjon' grener igjen.
Resultater for 'master':
$ git Checkout Master
Byttet til filial 'master'
$ git log --oneline
7F573D8 Commit C: Lagt til C.tekst
795da3c forpliktelse b: lagt til b.tekst
0f4Ed5b forplikte a: Lagt til en.tekst
$ ls
en.txt b.txt c.tekst
Resultater for 'funksjon':
$ git kassafunksjon
Byttet til gren 'funksjon'
$ git log --oneline
8ed0c4e forpliktelse f: modifisert b.tekst
6e12b57 forpliktelse e: modifisert a.tekst
795da3c forpliktelse b: lagt til b.tekst
0f4Ed5b forplikte a: Lagt til en.tekst
$ ls
en.txt b.tekst
La oss rebase fra 'Feature' -grenen.
$ git kassafunksjon
Byttet til gren 'funksjon'
$ git rebase master
Først spolte hodet for å spille av arbeidet ditt på toppen av det ..
Bruker: forpliktelse e: modifisert a.tekst
Bruker: forplikte f: modifisert b.tekst
Deretter slå sammen 'funksjonen' til 'master'.
$ git Checkout Master
Byttet til filial 'master'
$ git fusjonsfunksjon
Oppdatering 7F573D8 ... 9EFA1A3
Spol fremover
en.txt | 1 +
b.txt | 1 +
2 filer endret, 2 innsettinger (+)
Resultater for 'Master' filial:
$ git Checkout Master
Allerede på 'Master'
$ git log --oneline
9efa1a3 forpliktelse f: modifisert b.tekst
8710174 forpliktelse e: modifisert a.tekst
7F573D8 Commit C: Lagt til C.tekst
795da3c forpliktelse b: lagt til b.tekst
0f4Ed5b forplikte a: Lagt til en.tekst
$ ls
en.txt b.txt c.tekst
Resultater for 'Feature' Branch:
$ git kassafunksjon
Byttet til gren 'funksjon'
$ git log --oneline
9efa1a3 forpliktelse f: modifisert b.tekst
8710174 forpliktelse e: modifisert a.tekst
7F573D8 Commit C: Lagt til C.tekst
795da3c forpliktelse b: lagt til b.tekst
0f4Ed5b forplikte a: Lagt til en.tekst
$ ls
en.txt b.txt c.tekst
Legg merke til at etter rebasen og fusjonen er begge grenene de samme. Også hasjene for E og F har endret seg i begge grener. I utgangspunktet, i Rebase -scenariet, er det dette som skjedde:
A - B - C
\
E ' - f' (funksjon, master)
Derfor er det ingen ny forpliktelse. E- og F -forpliktelsene er blitt beregnet på nytt og festet til slutten av 'master' grenen.
Rebasering er et nyttig verktøy når du vil rydde opp i historien til arbeidet ditt. Imidlertid er det en fare som har født den gylne regelen.
Golden Rule of Rebasing
Den gylne regelen for ombasering er:
Aldri rebase en offentlig gren.
Som du kan se fra eksemplet over, beregner det å beregne forpliktelsene på nytt. Når flere personer forgrener seg fra et offentlig depot, kan ombestilling skape situasjoner der utviklere som har skapt nye grener vil løpe inn i veldig kompliserte flettesituasjoner. Så det er en god idé å aldri rebase offentlige grener som deles.
For å konkludere:
Rebasering er et unikt trekk ved git. Men bruk det med forsiktighet.
Mer informasjon:
Her er noen lenker for videre studier:
- Git rebase -dokumentasjon
- Atlassian sammenslåing mot rebasering
- Hvordan du ser på forpliktelseshistorien til Git -depot
- Vis git -tre i terminalen
- https: // www.Atlassian.com/git/tutorials/fusjon-vs-rebasing
- https: // git-cm.com/docs/git-rebase