Przejdź do zawartości

Git/Branch

Z Wikibooks, biblioteki wolnych podręczników.
< Git
Gałęzie


Wyświetlanie drzewa w konsoli :

git log --graph --oneline --all


Operowanie gałęziami, proste przypadki

[edytuj]

Według konwencji, lokalny aktualny katalog roboczy w gicie jest nazywany "master". To jest po prostu nazwa gałęzi, którą git tworzy, kiedy zaczniesz puste repozytorium. Możesz ją usunąć jeśli nie podoba Ci się nazwa.

Jeśli tworzysz swoje repozytorium przez klonowanie czyjegoś repozytorium, zdalna gałąź "master" jest kopiowana na lokalną gałąź nazwaną "origin". Możesz mieć swoją własną gałąź "master", która nie jest przywiązana do zdalnego repozytorium.

Istnieje zawsze aktualna głowica, zwana HEAD. (Aktualnie jest to link symboliczny, .git/HEAD, do pliku takiego jak refs/heads/master.) Git wymaga aby to zawsze wskazywało do katalogu refs/heads.

Pomniejsze szczegóły techniczne

[edytuj]
  1. HEAD zwykł być Uniksowym symlinkiem, i nadal może być tak postrzegany, ale aby obsługiwać systemy firmy Microsoft, to jest teraz tym co jest nazywane "symboliczna referencja" lub symref i jest prostym plikiem zawierającym "ref: refs/heads/master". Git traktuje to tak jak symlink. Istnieje pomocnik git-update-ref, który je zapisuje.
  2. Podczas gdy HEAD musi wskazywać na refs/heads, legalnym jest wskazywanie na nieistniejący plik. To właśnie się dzieje przed pierwszym zatwierdzeniem w całkowicie nowym repozytorium.

Kiedy wykonujesz "git commit", nowy obiekt zatwierdzenia jest tworzony ze starym HEAD jako przodkiem, a nowe zatwierdzenie jest zapisywane do aktualnej głowicy (wskazywanej przez HEAD).

Trzy użycia "git checkout"

[edytuj]

Git checkout może zrobić trzy oddzielne rzeczy:

Przełączenie na inną głowicę

[edytuj]
git checkout [-f|-m] <galąź>

To czyni <gałąź> nową GŁOWICĄ, i kopiuje jej stan do indeksu i katalogu roboczego.

Jeśli plik ma nie zapisane zmiany w katalogu roboczym, to stara się zachować je. To jest pojedyncza próba i wymaga aby zmienione pliki nie zostały zmienione pomiędzy starymi i nowymi GŁOWICAMI. W takim wypadku, wersja katalogu roboczego pozostaje nie tknięta.

Bardziej agresywną opcją jest -m, która będzie próbowała zrobić 3-kierunkowe (międzyplikowe) scalenie. To może się nie udać, zostawiając niescalone pliki w indeksie.

Alternatywą jest użycie -f, co nadpisze niezapisane zmiany w katalogu roboczym. Ta opcja może być użyta bez określenia opcji <gałąź> (domyślnie GŁOWICA) aby cofnąć lokalne zmiany.

Cofnięcie zmiany dla małej liczby plików

[edytuj]
git checkout [<wersja>] [--] <ścieżki>

skopiuje wersję <ścieżki> z indeksu do katalogu roboczego. Jeśli jest podana <wersja>, index dla tych ścieżek będzie uaktualniony z danej wersji przed kopiowaniem z indeksu do drzewa roboczego.

Inaczej niż z wersją bez określenia <ścieżki>, to NIE uaktualni GŁOWICY, nawet gdy <ścieżki> to ".".

Stworzenie gałęzi

[edytuj]
git checkout [-f|-m] -b <gałąź> [wersja]

stworzy i przełączy do nowej gałęzi o podanej nazwie. To jest odpowiednik do

git branch <gałąź> [<wersja>]
git checkout [-f|-m] <gałąź>

Jeśli <wersja> jest pominięta, domyślnie jest GŁOWICA, a w takim wypadku żadne pliki katalogu roboczego nie będą zmienione.

To jest typowy sposób wypuszczenia wersji, która nie posiada istniejącej głowicy wskazującej na nią.

Kasowanie gałęzi

[edytuj]

"git branch -d <głowica>" jest bezpieczne. Kasuje podaną <głowicę>, ale najpierw sprawdza, czy zatwierdzenie jest osiągalne w inny sposób. To znaczy scaliłeś gdzieś gałąź lub nigdy nie robiłeś edycji na tej gałęzi.

To dobry sposób na stworzenie "tematycznej gałęzi" kiedy pracujesz nad czymś większym niż jednolinijkowiec, ale powinno się usuwać je gdy skończysz. Nadal pozostaje w historii.

Brudna robota z głowicami: git reset

[edytuj]

Jeśli potrzebujesz nadpisać aktualną GŁOWICĘ z pewnego powodu, narzędzie aby to zrobić to "git reset". Istnieją trzy poziomy resetu:

git reset --soft <głowica>

To nadpisuje aktualną GŁOWICĘ zawartością <głowica>.

Jeśli pominiesz <głowica>, domyślnie jest GŁOWICA, więc niczego nie zrobi.

git reset [<głowica>]
git reset --mixed [<głowica>]

To nadpisuje aktualną GŁOWICĘ i kopiuje ją do indeksu, cofając jakiekolwiek polecenia git-update-index, które mogłeś wykonać.

Jeśli pominiesz <głowica>, domyślnie jest GŁOWICA, więc nie będzie zmiany w aktualnej gałęzi, ale wszystkie indeksy zostaną cofnięte.

git reset --hard [<głowica>]

To robi wszystko wspomniane wyżej oraz uaktualnia katalog roboczy. Wyrzuca wszystkie twoje edycje w-toku i daje ci czystą kopię. To jest zwykle używane bez określenia <głowica>, a w takim wypadku aktualna GŁOWICA jest użyta.