Začiatočníci Gitu sú varovaní pred príkazom rebase. A oprávnene. Vďaka všetkým novým veciam, ktoré sa treba naučiť, je pre začiatočníkov pravdepodobne lepšie ovládať základné pojmy, než sa ponoriť do zložitostí rebasingu. Ak však rozumiete základom zlučovania pobočiek, potom vám bude vedieť, ako rebázovať, pomôcť vyriešiť niektoré zložité vývojové hádanky, keď príde vhodný čas.
Git Rebase: Definície
Podľa dokumentácie git príkaz rebase znovu použije potvrdenie nad iným základným hrotom. Táto definícia môže byť trochu odstrašujúca. Je jednoduchšie vysvetliť rebase ako postup, ktorý pridáva zmeny aktuálnej vetvy na koniec inej vetvy. Poďme si prejsť príkladom, aby sme mali lepšiu predstavu o tom, čo sa stane.
Príklad Git Rebasing
V tomto príklade najskôr vytvoríme testovací prípad s vetvou „master“ a „feature“. Potom urobíme štandardné zlúčenie. Ďalej znova vytvoríme testovací prípad a vykonáme rebase a zlúčenie.
1. Vytváranie hlavných a hlavných vetiev
Tu je scenár, ktorý vytvoríme:
A - B - C (hlavný) \ E - F (funkcia)
Vo vyššie uvedenom príklade sa uberáme nasledujúcou cestou:
- Commit A: pridáme a.súbor txt vo vetve „hlavný“
- Commit B: pridáme b.súbor txt vo vetve „hlavný“
- V tejto fáze vytvoríme vetvu „funkcia“, čo znamená, že bude mať.txt a b.TXT
- Commit C: pridáme c.súbor txt vo vetve „hlavný“
- Prejdeme do pobočky „feature“
- Odovzdať E: upravíme a.txt vo vetve „feature“
- Odovzdať F: upravíme b.txt vo vetve „feature“
Môžete vytvoriť priečinok a spustiť nasledujúci kód v priečinku, ktorý vytvorí vyššie uvedenú situáciu:
git init dotyk a.txt git add -A git commit -m "Commit A: pridané a.txt „dotyk b.txt git add -A git commit -m "Commit B: pridané b.txt "dotyk gitovej vetvy c.txt git add -A git commit -m "Commit C: pridané c.txt "git status git checkout funkcia echo aaa> a.txt git add -A git commit -m "Commit E: upravené a.txt "echo bbb> b.txt git add -A git commit -m "Commit F: upravené b.TXT"
2. Jednoduché zlúčenie
Pomocou príkazu log skontrolujeme obe vetvy.
Výsledky pre 'master':
$ git checkout master Prepnuté na vetvu 'master' $ git log - online 2bbde47 Commit C: pridané c.txt b430ab5 Commit B: pridané b.txt 6f30e95 Commit A: pridané a.txt $ ls a.txt b.txt c.TXT
Výsledky pre 'feature':
Funkcia pokladnice $ git Prepnutá na vetvu 'funkcia' $ git log - online 0286690 Commit F: upravené b.txt 7c5c85e Potvrdiť E: upravené a.txt b430ab5 Commit B: pridané b.txt 6f30e95 Commit A: pridané a.txt $ ls a.txt b.TXT
Všimnite si, ako vetva funkcií nemá Commit C
Teraz spustíme zlúčenie vetvy „feature“ s vetvou „master“. Zobrazí sa výzva na zadanie komentára. Do komentára pridajte na začiatok text „Commit G:“, ktorý uľahčí sledovanie.
$ git checkout master Prepnuté na vetvu 'master' $ git funkcia zlúčenia Zlúčenie vykonané 'rekurzívnou' stratégiou. a.txt | 1 + b.txt | 1 + 2 súbory zmenené, 2 vloženia (+)
Výsledky pre 'master':
$ git checkout master Už na 'master' $ git log - online d086ff9 Commit G: Zlúčiť vetvu 'feature' 0286690 Commit F: upravené b.txt 7c5c85e Potvrdiť E: upravené a.txt 2bbde47 Commit C: pridané c.txt b430ab5 Commit B: pridané b.txt 6f30e95 Commit A: pridané a.txt $ ls a.txt b.txt c.TXT
Výsledky pre 'feature':
Funkcia pokladne $ git Prepnutá na „funkciu“ pobočky $ git log - online 0286690 Commit F: upravené b.txt 7c5c85e Potvrdiť E: upravené a.txt b430ab5 Commit B: pridané b.txt 6f30e95 Commit A: pridané a.txt $ ls a.txt b.TXT
V pobočke „master“ si všimnete, že existuje nový príkaz G, ktorý zlúčil zmeny z vetvy „feature“. V zásade sa uskutočnili tieto kroky:
A - B - C - G (hlavný) \ / E - F (funkcia)
Vo Commit G boli všetky zmeny z vetvy 'feature' vykonané do hlavnej vetvy. Samotná vetva „funkcie“ však zostala nedotknutá kvôli procesu zlúčenia. Všimnite si hash každého potvrdenia. Po zlúčení má potvrdenie E (7c5c85e) a F (0286690) rovnaký hash na vetve „feature“ a „master“.
3. Zlúčenie s rebazingom
Zopakujme krok 1, aby sme znovu vytvorili vetvy „hlavná“ a „vlastnosť“.
Výsledky pre 'master':
$ git checkout master Prepnuté na vetvu 'master' $ git log - online 7f573d8 Commit C: pridané c.txt 795da3c Commit B: pridané b.txt 0f4ed5b Commit A: pridané a.txt $ ls a.txt b.txt c.TXT
Výsledky pre 'feature':
Funkcia pokladne $ git Prepnutá na „funkciu“ pobočky $ git log - online 8ed0c4e Commit F: upravené b.txt 6e12b57 Commit E: upravené a.txt 795da3c Commit B: pridané b.txt 0f4ed5b Commit A: pridané a.txt $ ls a.txt b.TXT
Poďme rebázovať z vetvy „funkcia“.
Funkcia pokladne $ git Prepnutá na „funkciu“ pobočky $ git rebase master Najskôr previnutím hlavy prehrajte svoju prácu navrchu ... Aplikácia: Potvrdiť E: upravená a.Aplikácia txt: Commit F: upravené b.TXT
Potom zlúčte „funkciu“ do „hlavnej“.
$ git checkout master Prepnuté na vetvu 'master' $ git zlúčenie funkcia Aktualizuje sa 7f573d8… 9efa1a3 Rýchly posun vpred.txt | 1 + b.txt | 1 + 2 súbory zmenené, 2 vloženia (+)
Výsledky pre „hlavný“ obor:
$ git checkout master Už na 'master' $ git log - online 9efa1a3 Commit F: upravené b.txt 8710174 Commit E: upravené a.txt 7f573d8 Potvrdiť C: pridané c.txt 795da3c Commit B: pridané b.txt 0f4ed5b Commit A: pridané a.txt $ ls a.txt b.txt c.TXT
Výsledky pre vetvu 'feature':
Funkcia pokladnice $ git Prepnutá na vetvu 'funkcia' $ git log - online 9efa1a3 Commit F: upravené b.txt 8710174 Commit E: upravené a.txt 7f573d8 Potvrdiť C: pridané c.txt 795da3c Commit B: pridané b.txt 0f4ed5b Commit A: pridané a.txt $ ls a.txt b.txt c.TXT
Všimnite si, že po rebase a zlúčení sú obe vetvy rovnaké. V obidvoch vetvách sa zmenili aj hashe pre E a F. V zásade sa v scenári rebase stalo toto:
A - B - C \ E '- F' (funkcia, hlavný)
Preto neexistuje žiadny nový záväzok. Záväzky E a F boli prepočítané a zablokované na koniec „hlavnej“ vetvy.
Rebasing je užitočný nástroj, keď chcete vyčistiť históriu svojej práce. Existuje však nebezpečenstvo, ktoré viedlo k vzniku zlatého pravidla.
Zlaté pravidlo rebazingu
Zlaté pravidlo rebasingu je:
Nikdy nevymieňajte postavenie verejnej pobočky.
Ako môžete vidieť z vyššie uvedeného príkladu, rebasing prepočíta záväzky. Keď z verejného úložiska odbočuje viac ľudí, rebasing môže vytvoriť situácie, keď vývojári, ktorí vytvorili nové pobočky, narazia na veľmi komplikované situácie pri zlučovaní. Je preto dobrý nápad nikdy nepremiestňovať verejné pobočky, ktoré sú zdieľané.
Na záver:
Rebasing je jedinečná vlastnosť Gitu. Používajte ho však opatrne.
Viac informácií:
Tu je niekoľko odkazov na ďalšie štúdium:
Dokumentácia Git Rebase
Atlassian Merging vs Rebasing
Referencie:
- https: // www.atlassian.com / git / tutoriály / merging-vs-rebasing
- Ovládanie verzií pomocou Git - 07 - Rebase [https: // www.YouTube.com / hodinky?v = cSf8cO0WB4o]
- https: // git-scm.com / docs / git-rebase
- Čo je to Git rebase? [https: // www.YouTube.com / hodinky?v = TymF3DpidJ8]
- https: // stredná.freecodecamp.org / git-rebase-a-zlaté pravidlo-vysvetlené-70715eccc372