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).

Komentáře

K tomuto článku zatím žádné komentáře neexistují (nebo čekají na schválení).

Nový komentář

Všechny komentáře podléhají schválení - mezi odesláním komentáře a jeho zobrazením na této stránce tedy může být prodleva. Vyplníte-li e-mailovou adresu, budete o schválení či neschválení komentáře informováni.

V titulku ani v textu nejsou povoleny HTML tagy - budou automaticky odstraněny. Odstavec ukončíte prázdným řádkem.

(nepovinné)