Rozgałęzienia Git: master vs. origin / master vs. remotes/ origin/master

Myślę, że jestem na dobrej drodze, aby zrozumieć podstawowe pojęcia Gita.

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 lokalną gałęzią, a remotes/origin/master jest odległą gałęzią.

Ale czym dokładnie jest origin / master ?

Author: Mogsdad, 2012-05-14

6 answers

Weź klon Zdalnego repozytorium i uruchom git branch -a (aby pokazać wszystkie gałęzie, o których git wie). Prawdopodobnie będzie to wyglądało mniej więcej tak:

* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

Tutaj, master jest gałęzią w lokalnym repozytorium. remotes/origin/master jest gałęzią o nazwie {[4] } na zdalnym o nazwie origin. Można to nazwać albo origin/master, jak w:

git diff origin/master..master

Możesz również odnieść się do niego jako remotes/origin/master:

git diff remotes/origin/master..master

Są to tylko dwa różne sposoby odwoływania się do tej samej rzeczy (nawiasem mówiąc, oba te polecenia oznacza " Pokaż mi zmiany pomiędzy odległą gałęzią master i moją gałęzią master).

remotes/origin/HEAD jest default branch dla pilota o nazwie origin. To pozwala po prostu powiedzieć origin zamiast origin/master.

 185
Author: larsks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-14 17:56:41

Krótka odpowiedź dla manekinów takich jak ja (skradzionych z Torek):

  • pochodzenie / master jest "gdzie mistrz był tam ostatni raz, kiedy sprawdzałem"
  • mistrz jest "gdzie mistrz jest tutaj w oparciu o to, co robiłem"
 90
Author: ErichBSchulz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-17 05:48:08

Technicznie rzecz biorąc, nie ma żadnych "zdalnych" rzeczy w ogóle1 w Twoim Git repo, są tylko lokalne nazwy, które powinny odpowiadać nazwom na innym, innym repo. Te o nazwie origin/whatever będą początkowo pasować do tych z repo, które sklonowałeś-od:

git clone ssh://some.where.out.there/some/path/to/repo # or git://some.where...

Tworzy lokalną kopię innego repo. Po drodze notuje wszystkie gałęzie, które tam były, oraz commity, do których się odnoszą, i umieszcza je w Twoim lokalnym repo pod nazwami refs/remotes/origin/.

W zależności od tego, jak długo przejdziesz przed git fetch lub równoważny do aktualizacji " moja kopia tego, co jest niektóre.gdzieWynocha.tam", mogą zmieniać swoje gałęzie, tworzyć nowe i usuwać niektóre. Kiedy wykonasz swoją git fetch (lub git pull, która jest naprawdę fetch plus merge), Twój repo zrobi kopie swojej nowej pracy i zmieni wszystkie wpisy refs/remotes/origin/<name> w razie potrzeby. To ten moment fetching sprawia, że wszystko się zgadza (cóż, to, i początkowy klon, i niektóre przypadki pushing również-w zasadzie zawsze, gdy Git ma szansę sprawdzić-ale patrz zastrzeżenie poniżej).

Git zwykle odnosi się do swoich refs/heads/<name> jako po prostu <name>, a te odległe jako origin/<name>, i to wszystko działa, ponieważ jest oczywiste, który z nich jest który. Czasami możliwe jest tworzenie własnych nazw gałęzi, które sprawiają, że nie jest to oczywiste, ale nie martw się tym, dopóki do tego nie dojdzie. :- ) Po prostu daj Gitowi najkrótszą nazwę, która sprawia, że jest to oczywiste, i będzie od tego: origin/master jest "gdzie mistrz był tam ostatni raz sprawdzałem", i master jest "gdzie mistrz jest tutaj na podstawie tego, co robiłem". Uruchom git fetch, aby zaktualizować Git na "where master is over there" w razie potrzeby.


Zastrzeżenie: w wersjach Git starszych niż 1.8.4, git fetch posiada kilka trybów, które nie aktualizują" where master is over there " (dokładniej, tryby, które nie aktualizują żadnych gałęzi zdalnego śledzenia). Running git fetch origin, or git fetch --all, or even just git fetch, czy aktualizuje. Bieganie git fetch origin master Nie . Niestety, ten tryb "nie aktualizuje" jest wyzwalany przez zwykłe git pull. (Jest to głównie drobna irytacja i jest naprawiona w Git 1.8.4 i późniejszych.)


1Cóż, jest jedna rzecz, która nazywa się "pilotem". Ale to też lokalne! Nazwa origin jest rzeczą, którą Git nazywa "pilotem". Jest to w zasadzie tylko krótka nazwa adresu URL, którego użyłeś podczas klonowania. Stąd też pochodzi origin W origin/master. Nazwa origin/master nazywa się remote-tracking branch , który czasami jest skracany do "remote branch", szczególnie w starszej lub bardziej nieformalnej dokumentacji.

 34
Author: torek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-17 20:26:36

Jedno wyjaśnienie (i punkt, który mnie zdezorientował):

"remotes / origin / HEAD jest domyślną gałęzią" nie jest naprawdę poprawne.

Remotes / origin / master był domyślną gałęzią w zdalnym repozytorium(ostatnio sprawdzałeś). Głowa nie jest gałęzią, tylko wskazuje na gałąź.

Myśl o głowie jako o swoim obszarze roboczym. Jeśli myślisz o tym w ten sposób, to 'Git checkout branchname' ma sens w odniesieniu do zmiany plików obszaru roboczego na pliki konkretnej gałęzi. Ty" kasa " rozgałęziasz pliki do swojego obszaru roboczego. Głowa do wszystkich praktycznych celów jest tym, co jest widoczne dla Ciebie w obszarze roboczym.

 4
Author: rick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-06 15:04:09
  1. origin - jest to nazwa zwyczajowa i najczęściej wskazywana na remote.

$ git remote add origin https://github.com/git/git.git --- uruchomisz to polecenie, aby połączyć swój projekt github z origin. Tutaj origin jest zdefiniowane przez użytkownika. Możesz zmienić nazwę przez $ git remote rename old-name new-name


  1. master - domyślna nazwa gałęzi w Git to master. Zarówno dla komputera zdalnego, jak i lokalnego.

  1. origin / master - jest to tylko wskaźnik do referowania gałęzi master w zdalnym repo. Pamiętaj, że mówiłem, że źródło wskazuje na pilota.

$ git fetch origin - pobiera obiekty i refy ze zdalnego repozytorium na komputer lokalny [origin/master]. Oznacza to, że nie wpłynie to na lokalną gałąź master, chyba że połączysz ją za pomocą $ git merge origin/master. Pamiętaj, aby sprawdzić poprawną gałąź, do której chcesz się połączyć przed uruchomieniem tego polecenia

Uwaga: pobrana zawartość jest reprezentowana jako zdalna gałąź. Fetch daje Ci możliwość przejrzenia zmian przed ich zintegrowaniem z Twoją kopią projekt. Aby pokazać zmiany między Twoim a zdalnym $git diff master..origin/master

 4
Author: Gnanasekar S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-13 22:36:45

Postaram się aby odpowiedź @ErichBSchulz była prostsza dla początkujących:

  • origin / master jest stanem gałęzi master w zdalnym repozytorium
  • master jest stanem gałęzi master w lokalnym repozytorium
 4
Author: MKJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-22 11:50:47