Začátečníci Gitu jsou varováni před příkazem rebase. A oprávněně. Se všemi novými věcmi, které je třeba se naučit, je začátečníkům pravděpodobně lépe zvládnout základní pojmy, než se ponoří do složitosti rebasingu. Pokud však rozumíte základům slučování větví, pak znalost rebase vám může pomoci vyřešit některé složité vývojové hádanky, až přijde správný čas.
Git Rebase: Definice
Podle dokumentace git příkaz rebase znovu použije potvrzení nad jiným základním hrotem. Tato definice může být trochu skličující. Je snazší vysvětlit rebase jako postup, který přidává změny aktuální větve na konec jiné větve. Projdeme si příklad, abychom získali lepší představu o tom, co se stane.
Příklad Git Rebasing
V tomto příkladu nejprve vytvoříme testovací případ s větví „hlavní“ a „funkce“. Pak provedeme standardní sloučení. Dále vytvoříme testovací případ a provedeme rebase a sloučení.
1. Vytváření hlavních a větví funkcí
Zde je scénář, který vytvoříme:
A - B - C (hlavní) \ E - F (funkce)
Ve výše uvedeném příkladu se vydáme následující cestou:
- Commit A: přidáme a.Soubor txt ve větvi „master“
- Commit B: přidáme b.Soubor txt ve větvi „master“
- V této fázi vytvoříme větev „feature“, což znamená, že bude mít.txt a b.txt
- Commit C: přidáme c.Soubor txt ve větvi „master“
- Přejdeme do větve „funkce“
- Commit E: upravíme a.txt ve větvi „feature“
- Commit F: upravíme b.txt ve větvi „feature“
Můžete vytvořit složku a spustit následující kód uvnitř složky k vytvoření výše uvedené situace:
git init touch a.txt git add -A git commit -m "Commit A: přidáno a.txt "dotek b.txt git add -A git commit -m "Commit B: přidáno b.txt "git branch feature touch c.txt git add -A git commit -m "Commit C: přidáno c.txt "git status git checkout funkce echo aaa> a.txt git add -A git commit -m "Commit E: změněno a.txt "echo bbb> b.txt git add -A git commit -m "Commit F: změněno b.txt "
2. Jednoduché sloučení
Pomocí příkazu log zkontrolujeme obě větve.
Výsledky pro 'master':
$ git checkout master Přepnuto na větev 'master' $ git log - online 2bbde47 Commit C: přidáno c.txt b430ab5 Commit B: přidáno b.txt 6f30e95 Potvrdit A: přidáno a.txt $ ls a.txt b.txt c.txt
Výsledky pro 'feature':
$ git funkce pokladny Přepnuto na větev 'funkce' $ git log - online 0286690 Commit F: upravené b.txt 7c5c85e Commit E: změněno a.txt b430ab5 Commit B: přidáno b.txt 6f30e95 Potvrdit A: přidáno a.txt $ ls a.txt b.txt
Všimněte si, že větev funkcí nemá Commit C
Nyní pojďme spustit sloučení větve 'feature' s větví 'master'. Budete požádáni o zadání komentáře. Do komentáře na začátek přidejte „Commit G:“, aby bylo sledování snazší.
$ git checkout master Přepnuto na větev 'master' $ git funkce sloučení Sloučení provedené 'rekurzivní' strategií. A.txt | 1 + b.txt | 1 + 2 soubory změněny, 2 vložení (+)
Výsledky pro 'master':
$ git checkout master Již na 'master' $ git log - online d086ff9 Commit G: sloučit větev 'feature' 0286690 Commit F: změněno b.txt 7c5c85e Commit E: změněno a.txt 2bbde47 Commit C: přidáno c.txt b430ab5 Commit B: přidáno b.txt 6f30e95 Potvrdit A: přidáno a.txt $ ls a.txt b.txt c.txt
Výsledky pro 'feature':
$ git funkce pokladny Přepnuto na větev 'funkce' $ git log - online 0286690 Commit F: upravené b.txt 7c5c85e Commit E: změněno a.txt b430ab5 Commit B: přidáno b.txt 6f30e95 Potvrdit A: přidáno a.txt $ ls a.txt b.txt
Ve větvi „hlavní“ si všimnete, že existuje nová revize G, která sloučila změny z větve „funkce“. V zásadě došlo k následující akci:
A - B - C - G (hlavní) \ / E - F (funkce)
V Commit G byly všechny změny z větve 'feature' přeneseny do větve master. Samotná větev „funkce“ však zůstala nedotčena kvůli procesu sloučení. Všimněte si hash každého potvrzení. Po sloučení má potvrzení E (7c5c85e) a F (0286690) stejný hash na větvi 'feature' a 'master'.
3. Sloučení s rebasingem
Zopakujme krok 1, abychom znovu vytvořili větve „hlavní“ a „funkce“.
Výsledky pro 'master':
$ git checkout master Přepnuto na větev 'master' $ git log - online 7f573d8 Commit C: přidáno c.txt 795da3c Commit B: přidáno b.txt 0f4ed5b Commit A: přidáno a.txt $ ls a.txt b.txt c.txt
Výsledky pro 'feature':
Funkce $ git checkout Přepnuto na větev „funkce“ $ git log - online 8ed0c4e Commit F: upravené b.txt 6e12b57 Commit E: změněno a.txt 795da3c Commit B: přidáno b.txt 0f4ed5b Commit A: přidáno a.txt $ ls a.txt b.txt
Pojďme rebase z 'funkce' větev.
Funkce $ git checkout Přepnuto na větev „feature“ $ git rebase master Nejprve převiňte hlavu, aby se vaše práce přehrála navíc… Použití: Potvrdit E: upraveno a.txt Použití: Potvrdit F: změněno b.txt
Poté sloučte 'funkci' do 'hlavní'.
$ git checkout master Přepnuto na větev 'master' $ git slučovací funkce Aktualizace 7f573d8… 9efa1a3 Rychlý posun vpřed.txt | 1 + b.txt | 1 + 2 soubory změněny, 2 vložení (+)
Výsledky pro 'hlavní' větev:
$ git checkout master Již na 'master' $ git log - online 9efa1a3 Commit F: upravené b.txt 8710174 Commit E: změněno a.txt 7f573d8 Commit C: přidáno c.txt 795da3c Commit B: přidáno b.txt 0f4ed5b Commit A: přidáno a.txt $ ls a.txt b.txt c.txt
Výsledky pro větev 'feature':
$ git checkout feature Přepnuto na větev 'feature' $ git log - online 9efa1a3 Commit F: upravené b.txt 8710174 Commit E: změněno a.txt 7f573d8 Commit C: přidáno c.txt 795da3c Commit B: přidáno b.txt 0f4ed5b Commit A: přidáno a.txt $ ls a.txt b.txt c.txt
Všimněte si, že po rebase a sloučení jsou obě větve stejné. Také hashe pro E a F se změnily v obou větvích. V zásadě se ve scénáři rebase stalo toto:
A - B - C \ E '- F' (funkce, hlavní)
Proto zde není žádný nový závazek. Závazky E a F byly přepočítány a přidrženy na konci větve „master“.
Rebasing je užitečný nástroj, pokud chcete vyčistit historii své práce. Existuje však nebezpečí, které způsobilo zrod zlatého pravidla.
Zlaté pravidlo rebasingu
Zlaté pravidlo rebasingu je:
Nikdy nevyměňujte veřejné pobočky za nové.
Jak vidíte z výše uvedeného příkladu, rebasing přepočítá revize. Když se z veřejného úložiště větví více lidí, rebasing může vytvořit situace, kdy vývojáři, kteří vytvořili nové pobočky, narazí na velmi komplikované situace sloučení. Je tedy dobrý nápad nikdy rebragovat veřejné pobočky, které jsou sdílené.
Závěrem:
Rebasing je jedinečná vlastnost Gitu. Používejte jej však opatrně.
Více informací:
Zde je několik odkazů pro další studium:
Dokumentace Git Rebase
Atlassian Merging vs Rebasing
Reference:
- https: // www.atlassian.com / git / tutoriály / merging-vs-rebasing
- Řízení verzí pomocí Git - 07 - Rebase [https: // www.Youtube.com / hodinky?v = cSf8cO0WB4o]
- https: // git-scm.com / docs / git-rebase
- Co je to Git rebase? [https: // www.Youtube.com / hodinky?v = TymF3DpidJ8]
- https: // střední.freecodecamp.org / git-rebase-and-the-golden-rule-explains-70715eccc372