Git fork synchronizace
Letos jsem se nějak rozjel v kontribucích na GitHubu a už po několikáté jsem musel řešit (vzpomínat), jak synchronizovat forknuté repo.
Proč je synchronizace potřeba?
V případě, že se jedná o jednorázovou kontribuci, není potřeba synchronizaci řešit. Postup je většinou následující:
- Fork původní repozitory.
- Klon forknuté repozitory.
- Lokální změny a push do forknuté repozitory.
- Pull request do původní repozitory.
- (Případně) Opakování kroků 3-4.
- Akceptace pull requestu.
- Dobrý pocit. 😀 😎
Pokud se ale vaše kontribuce opakuje, už je potřeba synchronizaci řešit, protože pokud jste si pro přispívání nevybrali mrtvý (anebo hodně stabilní) projekt, tak na původním repo probíhá aktivní vývoj a během doby, kdy probíhal proces vývoje a akceptace vašeho prvního pull requestu, už tam nejspíš někdo nakomitoval další změny.
Jak vypadá proces synchronizace ?
V následujícím obrázku přibyly k popsanému postupu dva kroky: 5. fetch a 6. push. To je právě ona synchronizace.
V obrázku pak už chybí další, cyklicky se opakující kroky, tj. pro druhý pull request by ještě přibyl krok 7. pull request, pro třetí pull request by to byly kroky 8. fetch + 9. push + 10. pull request atd.
Jak se to dělá v Gitu?
Hlavní důvod, proč píšu tenhle článek je, abych měl zdokumentovanou sadu následujících příkazů.
Předpokládám, že fork už máme udělaný. Pro potřeby tohoto příkladu použiju jako původní repozitory gruntwork-io/terratest, kterou mám forknutou jako sw-samuraj/terratest.
(Všechny následující příkazy si můžete bez obav pouštět u sebe lokálně. Pouze pokud byste chtěli zkusit i push_, tak si samozřejmě musíte udělat svůj vlastní_ fork_.)_
Nyní si uděláme klon forknuté repo:
git clone git@github.com:sw-samuraj/terratest.git
a vypíšeme si výchozí seznam remote repozitory:
$ git remote -v
origin git@github.com:sw-samuraj/terratest.git (fetch)
origin git@github.com:sw-samuraj/terratest.git (push)
Přidání původního repozitory
Původní repozitory – většinou nazývanou upstream
– přidáme příkazem:
$ git remote add upstream git@github.com:gruntwork-io/terratest.git
Opět si vypíšeme seznam remote repozitory a vidíme, že máme dvě:
origin
je náš nový fork.upstream
je původní repozitory,
$ git remote -v
origin git@github.com:sw-samuraj/terratest.git (fetch)
origin git@github.com:sw-samuraj/terratest.git (push)
upstream git@github.com:gruntwork-io/terratest.git (fetch)
upstream git@github.com:gruntwork-io/terratest.git (push)
Stažení změn z původního repozitory
Samotná synchronizace se skládá ze čtyřech kroků:
fetch
změn v původní repozitory (upstream
).checkout
lokálního branche, kam chceme změny zpropagovat.merge
danéhoupstream
branche.push
do forknuté (origin
) repozitory.
$ git fetch upstream
$ git checkout master
$ git merge upstream/master
$ git push
Je jen na vás, jestli vaše změny uděláte před, nebo po merge
z upstream
repozitory. Dobré pravidlo je, udělat synchronizaci před zahájením práce
na novém pull requestu.
A to je vše. Happy contributing!