Git - Kapitola 6. Pokročilá správa větví
Načítání jednotlivých větví / Git fetch a fast-forward / Jak přinutit git k načtení non-fast-forward aktualizací / Konfigurace vzdálených větví
Obsah
- Načítání jednotlivých větví
- Git fetch a fast-forward
- Jak přinutit git k načtení non-fast-forward aktualizací
- Konfigurace vzdálených větví
Načítání jednotlivých větví
Namísto používání příkazu git-remote(1), se také můžete rozhodnout aktualizovat pouze jednu větev naráz, a ukládat ji pod libovolným lokálním jménem:
$ git fetch origin todo:my-todo-work
První argument, "origin", gitu pouze říká že má načítat z repozitáře ze kterého jste původně klonovali. Druhý argument gitu říká že ze vzdáleného repositáře má být načtena větev "todo", a lokálně má být uložena pod názvem refs/heads/my-todo-work.
Větve můžete načítat také z jiných repositářů; takže
$ git fetch git://example.com/proj.git master:example-master
vytvoří novou větev nazvanou "example-master" a uloží do ní větev nazvanou "master" z repositáře na daném URL. Pokud již máte větev nazvanou example-master, pokusí se git provést fast-forward na commit na který ukazuje master větev na example.com'. Poněkud detailněji:
Git fetch a fast-forward
V předchozím příkladě, při aktualizaci existující větve, "git fetch" před úpravou lokální větve tak aby ukazovala na nový commit ověřuje zda poslední commit ve vzdálené větvi je potomkem posledního commitu ve vaší kopii dané větve. Git tento proces nazývá fast forward.
Fast forward vypadá asi takto:
o--o--o--o <-- old head of the branch
\
o--o--o <-- new head of the branch
V některých případech je možné že nový vrchol ve skutečnosti není potomkem starého vrcholu. Například si mohl uvědomit že udělal vážnou chybu, a rozhodne se provést krok zpět, což ve výsledku dá něco takovéhoto:
o--o--o--o--a--b <-- old head of the branch
\
o--o--o <-- new head of the branch
V tomto případě příkaz "git fetch" selže a vypíše varování.
I za těchto okolností můžete přinutit git k aktualizaci na nový vrchol, jak je popsáno v následujícím odstavci. Uvědomte si ale že v této situaci může dojít ke ztrátě commitů označených jako "a" a "b", pokud jste ovšem na ně nevytvořili vlastní přímý odkaz.
Jak přinutit git k načtení non-fast-forward aktualizací
Pokud git fetch selže protože nový vrchol větve není potomkem starého vrcholu, můžete ho k aktualizaci donutit příkazem:
$ git fetch git://example.com/proj.git +master:refs/remotes/example/master
Všimněte si přidání znaku "+". Alternativně můžete použít přepínač "-f" k vynucení aktualizací všech načtených větví, například:
$ git fetch -f origin
Buďte si vědomi že commity na které ukazovala stará verze example/master mohou být ztraceni, jak jsme viděli v předchozím odstavci.
Konfigurace vzdálených větví
Výše jsme viděli že "origin" je pouze zkratka užívaná k odkazu na repositář ze kterého jste původně klonovali. Tato informace je ukládána v konfiguračních proměnných gitu, které si můžete zobrazit pomocí příkazu git-config(1):
$ git config -l core.repositoryformatversion=0 core.filemode=true core.logallrefupdates=true remote.origin.url=git://git.kernel.org/pub/scm/git/git.git remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* branch.master.remote=origin branch.master.merge=refs/heads/master
Pokud existují další repositáře které často používáte, můžete vytvořit podobné konfigurační volby a ušetřit si psaní na klávasnici; například po zadání
$ git config remote.example.url git://example.com/proj.git
budou následující dva příkazy dělat to samé:
$ git fetch git://example.com/proj.git master:refs/remotes/example/master $ git fetch example master:refs/remotes/example/master
Ještě lépe, pokud zadáte další volbu:
$ git config remote.example.fetch master:refs/remotes/example/master
potom všechny následující příkazy budou dělat to samé:
$ git fetch git://example.com/proj.git master:refs/remotes/example/master $ git fetch example master:refs/remotes/example/master $ git fetch example
Můžete také přidat znak "+" a tím vynutit aktualizaci pokaždé:
$ git config remote.example.fetch +master:ref/remotes/example/master
Nedělejte to pokud si nejste jisti že vám nebude vadit že se po "git fetch" z example/master mohou ztratit commity.
Uvědomte si také že výše uvedená konfigurace může být provedena přímou editací souboru .git/config namísto používání příkazu git-config(1).
Další detaily o konfiguračních volbách zmíněných výše najdete v manuálové stránce k příkazu git-config(1).




