Myślę, że jestem na dobrej drodze, aby zrozumieć podstawowe pojęcia git.
Już skonfigurowałem i sklonowałem zdalne repozytorium. Utworzyłem również puste repozytorium po stronie serwera i połączyłem z nim moje lokalne repozytorium.
Mój problem polega na tym, że nie rozumiem różnicy między:
- origin / master vs. piloty / origin / master
O ile rozumiem, master jest gałęzią lokalną, a piloty / origin / master są zdalne.
Ale czym dokładnie jest pochodzenie / mistrz ?
git
git-remote
John Rumpel
źródło
źródło
.git/refs/origin/master
kiedykolwiek dryfować.git/refs/remotes/origin/master
? To się teraz dzieje i jestem wyrzucany.Odpowiedzi:
Weź klon zdalnego repozytorium i uruchom
git branch -a
(aby pokazać wszystkie gałęzie, o których git wie). Prawdopodobnie będzie wyglądać mniej więcej tak:Tutaj
master
jest gałąź w lokalnym repozytorium.remotes/origin/master
to gałąź nazwanamaster
na pilocie o nazwieorigin
. Możesz to nazwać alboorigin/master
, jak w:Możesz również nazywać to
remotes/origin/master
:To tylko dwa różne sposoby odwoływania się do tej samej rzeczy (nawiasem mówiąc, oba te polecenia oznaczają „pokaż mi zmiany między
master
gałęzią zdalną a mojąmaster
gałęzią).remotes/origin/HEAD
jestdefault branch
dla pilota o nazwieorigin
. To pozwala po prostu powiedziećorigin
zamiastorigin/master
.źródło
git branch -a
pokazanie zdalnej gałęziremotes/origin/master
jest częściowo spowodowane tym, że bazowy ref jest przechowywany w.git/refs/remotes/origin
(jeśli nie został spakowany). Moim zdaniem wyjściegit branch -a
może być znacznie wyraźniejsze, być może poprzez oddzielenie nazwy pilota od nazwy gałęzi czymś innym niż ukośnik.git branch -r
tylko pokazywanie gałęzi zdalnych spowoduje wyświetlenie gałęzi tylkoorigin/master
dlatego, żeremotes/
prefiks nie jest konieczny.git log
widzęcommit fa9sd8jasdf98 (HEAD -> master)
, co to znaczy? Co to jest HEAD w tym przypadku? Myślałem, że jestem obecnie „mistrzem” i zobowiązuję sięorigin/master
. Myślę, że coś pomieszałem, czy ktoś mógłby pomóc się uspokoić? EDYCJA AKTUALIZACJI: Wydaje mi się, że rozumiem, czy poprawne jest założenie, że HEAD wskazuje obecnie na gałąź master, co oznacza, że obecnie jestem w trakcie procesu master?Krótka odpowiedź dla manekinów takich jak ja (skradzionych z Torek):
źródło
Technicznie nie ma właściwie żadnych „remote” rzeczy w ogóle 1 w swoim repo Git, istnieją tylko lokalne nazwy, które powinny odpowiadać nazwom na innym, różnym repo. Te, które wymieniono,
origin/whatever
będą początkowo pasować do tych z repozytorium, które sklonowałeś:tworzy lokalną kopię drugiego repozytorium. Po drodze odnotowuje wszystkie gałęzie, które tam były, i zatwierdza te, do których się odwołuje, i umieszcza je w lokalnych repozytoriach pod nazwami
refs/remotes/origin/
.W zależności
git fetch
od tego, ile czasu upływa przed Tobą lub ekwiwalent, aby zaktualizować „moją kopię tego, co jest gdzieś.out.out.there”, mogą zmieniać swoje gałęzie, tworzyć nowe i usuwać niektóre. Kiedy zrobisz swojegit fetch
(lubgit pull
które jest naprawdę pobranie i scalenie), twoje repozytorium wykona kopie ich nowej pracy i zmieni wszystkierefs/remotes/origin/<name>
wpisy w razie potrzeby. To ten momentfetch
ing sprawia, że wszystko się zgadza (no cóż, to i początkowy klon, a także niektóre przypadkipush
ing - w zasadzie za każdym razem, gdy Git ma szansę sprawdzić - ale patrz zastrzeżenie poniżej).Git zwykle mówi, że używasz własnego
refs/heads/<name>
jako sprawiedliwego<name>
, a tych zdalnych jakoorigin/<name>
i wszystko działa, ponieważ jest oczywiste, który z nich jest który. Czasami możliwe jest utworzenie własnych nazw oddziałów, które sprawiają, że nie jest to oczywiste, ale nie martw się tym, dopóki to się nie stanie. :-) Wystarczy podać Git najkrótszą nazwę, która będzie oczywista, i zacznie się od tego:origin/master
jest „gdzie mistrz był tam, kiedy ostatnio sprawdzałem”, imaster
jest „gdzie mistrz jest tutaj, na podstawie tego, co robiłem” . Uruchom,git fetch
aby w razie potrzeby zaktualizować Gita „gdzie jest master”.Uwaga: w wersjach Gita starszych niż 1.8.4,
git fetch
ma kilka trybów, które nie aktualizują się „tam, gdzie jest master” (a dokładniej tryby, które nie aktualizują żadnych gałęzi zdalnego śledzenia). Uruchomionygit fetch origin
, lubgit fetch --all
, lub nawet po prostugit fetch
, robi aktualizację. Bieganiegit fetch origin master
nie . Niestety ten tryb „nie aktualizuje się” jest uruchamiany przez zwykłygit pull
. (Jest to głównie niewielka irytacja i zostało naprawione w Git 1.8.4 i nowszych).1 Cóż, jedna rzecz nazywa się „zdalną”. Ale to także lokalne! Nazywa się
origin
to, co Git nazywa „zdalnym”. Jest to po prostu krótka nazwa adresu URL użytego podczas klonowania. Jest to także wtedy, gdyorigin
worigin/master
pochodzi. Nazwaorigin/master
nazywa się gałęzią zdalnego śledzenia , która czasami zostaje skrócona do „gałęzi zdalnej”, szczególnie w starszej lub bardziej nieformalnej dokumentacji.źródło
origin/master
naklejkę nalocal
wykresie repozytorium, a nie naremote
jednym (szczerze polecam prezentację Jessiki Kerra „Git Happens” dla osób, które dopiero zaczynajągit
: vimeo.com/46010208 . głowie między 30:00 - 30: 19.)Spróbuję uprościć odpowiedź @ ErichBSchulz dla początkujących:
źródło
last time I've checked
traci ważną kwestię$ git remote add origin https://github.com/git/git.git
--- Uruchomisz to polecenie, aby połączyć swój projekt github z początkiem. Tutaj pochodzenie jest zdefiniowane przez użytkownika. Możesz zmienić nazwę przez$ git remote rename old-name new-name
$ git fetch origin
- Pobiera obiekty i referencje ze zdalnego repozytorium na komputer lokalny [origin / master]. Oznacza to, że nie wpłynie to na lokalny oddział główny, chyba że połączysz je za pomocą$ git merge origin/master
. Pamiętaj, aby sprawdzić poprawną gałąź, w której musisz scalić przed uruchomieniem tego poleceniaUwaga: Pobrana zawartość jest reprezentowana jako gałąź zdalna. Fetch daje Ci możliwość przejrzenia zmian przed zintegrowaniem ich z kopią projektu. Aby pokazać zmiany między twoim a zdalnym
$git diff master..origin/master
źródło
Jedno wyjaśnienie (i kwestia, która mnie pomyliła):
„piloty / pochodzenie / HEAD jest domyślną gałęzią” nie jest tak naprawdę poprawne.
pilot / origin / master był domyślną gałęzią w zdalnym repozytorium (ostatnim razem, gdy sprawdzałeś). HEAD nie jest gałęzią, tylko wskazuje na gałąź.
Pomyśl o HEAD jako o swoim miejscu pracy. Kiedy myślisz o tym w ten sposób, wówczas „git checkout branchname” ma sens w odniesieniu do zmiany plików obszaru roboczego na pliki określonej gałęzi. Pliki oddziałów „kasujesz” do swojego obszaru roboczego. GŁOWICA do wszystkich praktycznych celów jest widoczna dla Ciebie w miejscu pracy.
źródło
HEAD
jest „wskaźnikiem do gałęzi” (rzeczywisty plik w lokalnym repozytorium często zawiera ciąg znakówref: refs/heads/master
, na przykład ... chyba że jest „odłączony”, co jest zupełnie inną rzeczą). Jednak istnieje pewien rodzaj błędu w sposobieclone
interpretacji „zdalnej HEAD”: protokoły przesyłania nie mogą w ogóle wysłać pośredniej gałęzi, tylko surowy SHA-1, więc git ma kludge, który sprawia, że „działa głównie”. Jednak od czasu do czasu ktoś napotyka dziwną sprawę. Chciałbym, żeby git w ogóle nie stworzyłremotes/origin/HEAD
, zwłaszcza gdy wyjdzie źle ...Myślę, że ten zapis git slash najlepiej jest zrozumieć, zaglądając do twojego
.git
folderu.Na przykład, tutaj jest nieco skrócone drzewo mojego .git dla bazy źródłowej LibreOffice.
W Linuksie
sudo apt-get install tree
warto to zobaczyć.W systemie Windows myślę, że
tree
polecenie może nadal działać.Przewiń w dół i spójrz na referencje (aka „referencje”) u dołu:
Mogłoby być mniej mylące, gdyby było tak ułożone, ale nie było:
Mamy trzy podstawowe typy referencji: głowice , piloty i tagi .
.git / refs / heads posiada naszego lokalnego mistrza .
.git / referencje / piloty mogą zawierać wiele pilotów, chociaż w tej chwili mamy tylko ich źródło .
.git / refs / tags (omówiono gdzie indziej).
pochodzenie zatem naszym jedynym i jedynym odległym. Przechowuje pochodzenie / master .
Okazuje się, że mamy 2 GŁOWICE (wskaźniki do bieżących gałęzi), jeden lokalny i jeden zdalny:
Jeśli wymienisz swoje oddziały :
Następnie możesz mieć wiele oddziałów zdalnego śledzenia, a my robimy to tutaj. Wiesz, że są to oddziały zdalnego śledzenia, ponieważ są one poprzedzone znakiem „ piloty / ”. Te pokazane tutaj dotyczą zdalnego nazwanego źródła.
Tak więc druga linia jest bieżącym wskaźnikiem gałęzi pochodzenia . Piloty / pochodzenie: HEAD - wskazuje na -> master. To pokazuje, że w zdalnym repozytorium bieżąca gałąź jest ich gałęzią o nazwie master (nie mylić z naszą lokalną gałąź o nazwie master ).
Pozostałe gałęzie nie znajdują się w twoim .git / refs / tree, ale raczej je znajdziesz
.git/packed-refs
.Kiedy my pobierania pobieramy zmiany ze zdalnego repozytorium do naszego zdalnego repozytorium śledzącego.
Kiedy my się, łączymy zmiany w tym lokalnym, zdalnym repozytorium śledzenia z działającym oddziałem lokalnym lub oddziałami, w tym przypadku z naszym oddziałem głównym.
(Kiedy my ciągnąć , wykonujemy oba te dwa kroki w jednej operacji.)
Warto również zauważyć, że te lokalne i zdalne UUID dla mastera wskazują obecnie ten sam węzeł (inaczej „zatwierdzenie”):
Nasz lokalny master wskazuje więc to samo miejsce, co master origin pilota:
Wreszcie, myślę, że warto też na to spojrzeć
.git/packed-refs
Bez wątpienia pozostawia to więcej pytań niż odpowiedzi, ale myślę, że może pomóc Ci odpowiedzieć na własne pytania dotyczące tego, co jest.
źródło