webentwicklung-frage-antwort-db.com.de

Git-Verzweigung: Master vs. Origin / Master vs. Remotes / Origin / Master

Ich denke, ich bin auf dem richtigen Weg, um die grundlegenden Konzepte von Git zu verstehen.

Ich habe bereits ein Remote-Repository eingerichtet und geklont. Ich habe auch ein serverseitiges leeres Repository erstellt und mein lokales Repository damit verknüpft.

Mein Problem ist, dass ich den Unterschied nicht verstehe zwischen:

  • Origin/Master vs. Fernbedienungen/Origin/Master

Soweit ich verstanden habe, ist master ein lokaler Zweig und remotes/Origin/master ein entfernter Zweig.

Aber was genau ist Origin/Master?

182
John Rumpel

Nehmen Sie einen Klon eines Remote-Repositorys und führen Sie git branch -a Aus (um alle Zweige anzuzeigen, die git kennt). Es wird wahrscheinlich ungefähr so ​​aussehen:

* master
  remotes/Origin/HEAD -> Origin/master
  remotes/Origin/master

Hier ist master eine Verzweigung im lokalen Repository. remotes/Origin/master Ist ein Zweig mit dem Namen master auf der Fernbedienung mit dem Namen Origin. Sie können dies entweder als Origin/master Bezeichnen, wie in:

git diff Origin/master..master

Sie können es auch als remotes/Origin/master Bezeichnen:

git diff remotes/Origin/master..master

Dies sind nur zwei verschiedene Arten, auf dasselbe zu verweisen (im Übrigen bedeuten diese beiden Befehle "zeige mir die Änderungen zwischen dem entfernten Zweig master und meinem Zweig master").

remotes/Origin/HEAD Ist der default branch Für die Fernbedienung mit dem Namen Origin. So können Sie einfach Origin anstelle von Origin/master Sagen.

204
larsks

Kurze Antwort für Dummies wie mich (gestohlen von Torek):

  • Origin/master ist "wo der Master dort war, als ich das letzte Mal nachgesehen habe"
  • Master ist "wo der Master hier ist, basierend auf dem, was ich getan habe"
102
ErichBSchulz

Technisch gesehen gibt es überhaupt keine "entfernten" Dinge1 In Ihrem Git-Repo gibt es nur lokale Namen, die sollten den Namen auf einem anderen, anderen Repo entsprechen. Die mit dem Namen Origin/whatever Stimmen anfangs mit denen auf dem Repo überein, von dem Sie geklont haben:

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

erstellt eine lokale Kopie des anderen Repos. Unterwegs werden alle dort vorhandenen Zweige und die zugehörigen Commits notiert und unter den Namen refs/remotes/Origin/ In Ihr lokales Repo gesteckt.

Abhängig davon, wie lange Sie brauchen, bis Sie git fetch Oder ein gleichwertiges Update "meiner Kopie von some.where.out.there" durchführen, können sie ihre Zweige ändern, neue erstellen und einige löschen. Wenn Sie Ihren git fetch (Oder git pull, Der wirklich Abruf plus Zusammenführung ist) ausführen, erstellt Ihr Repo Kopien seiner neuen Arbeit und ändert alle refs/remotes/Origin/<name> - Einträge nach Bedarf. Es ist dieser Moment des fetching, der alles zusammenpasst (naja, das und der anfängliche Klon, und einige Fälle von Pushing auch - im Grunde immer, wenn Git die Chance hat, das zu überprüfen - aber siehe unten ).

Bei Git ist es normalerweise so, dass Sie sich auf Ihren eigenen refs/heads/<name> Als nur <name> Und auf die entfernten als Origin/<name> Beziehen, und alles funktioniert nur, weil klar ist, welcher welcher ist. Es ist manchmal möglich, eigene Filialnamen zu erstellen, die es nicht offensichtlich machen. :-) Gib Git einfach den kürzesten Namen, der es offensichtlich macht, und es wird von dort aus gehen: Origin/master Ist "wo der Master das letzte Mal dort war, als ich nachgesehen habe", und master ist "wo Der Meister ist hier, basierend auf dem, was ich getan habe ". Führen Sie git fetch Aus, um Git bei Bedarf zu aktualisieren.


Vorsichtsmaßnahme: In Git-Versionen älter als 1.8.4 werden in git fetch Einige Modi nicht aktualisiert (genauer gesagt, Modi, in denen keine Remote-Tracking-Zweige aktualisiert werden). Ausführen von git fetch Origin Oder git fetch --all Oder sogar nur git fetch, macht update. Ausführen von git fetch Origin masternicht. Leider wird dieser Modus "Nicht aktualisieren" durch gewöhnliche git pull Ausgelöst. (Dies ist hauptsächlich nur eine kleine Störung und wurde in Git 1.8.4 und höher behoben.)


1Nun, es gibt eine Sache, die genannt eine "Fernbedienung" ist. Aber das ist auch lokal! Der Name Origin ist das, was Git "eine Fernbedienung" nennt. Es ist im Grunde nur ein kurzer Name für die URL, die Sie beim Klonen verwendet haben. Hierher kommt auch das Origin in Origin/master. Der Name Origin/master Wird als Fernverfolgungszweig bezeichnet, der manchmal zu "Fernverfolgungszweig" abgekürzt wird, insbesondere in älteren oder informelleren Dokumentationen.

37
torek

Ich würde versuchen, die Antwort von @ ErichBSchulz für Anfänger einfacher zu machen:

  • Origin/master ist der Status des Master-Zweigs im Remote-Repository
  • master ist der Status des Master-Zweigs im lokalen Repository
7
MKJ

Eine Klarstellung (und ein Punkt, der mich verwirrte):

"remotes/Origin/HEAD ist der Standardzweig" ist nicht wirklich korrekt.

remotes/Origin/master war der Standardzweig im Remote-Repository (zuletzt überprüft). HEAD ist kein Zweig, sondern zeigt nur auf einen Zweig.

Stellen Sie sich HEAD als Ihren Arbeitsbereich vor. Wenn Sie sich das so vorstellen, dann ist 'git checkout branchname' sinnvoll, wenn Sie Ihre Arbeitsbereichsdateien so ändern, dass sie denen eines bestimmten Zweigs entsprechen. Sie " checkout "Verzweigen Sie Dateien in Ihren Arbeitsbereich. HEAD für alle praktischen Zwecke ist das, was für Sie in Ihrem Arbeitsbereich sichtbar ist.

4
rick
  1. Origin - Dies ist ein benutzerdefinierter und am häufigsten verwendeter Name, der auf remote verweist.

$ git remote add Origin https://github.com/git/git.git --- Sie werden diesen Befehl ausführen, um Ihr Github-Projekt mit Origin zu verknüpfen. Hier ist Origin benutzerdefiniert Sie können es mit $ git remote rename old-name new-name Umbenennen.


  1. master - Der Standardzweigname in Git ist master. Für Remote- und lokale Computer.

  1. Origin/Master - Dies ist nur ein Zeiger auf den Master-Zweig in Remote Repo. Denken Sie daran, ich sagte, Origin zeigt auf Remote.

$ git fetch Origin - Lädt Objekte und Referenzen vom Remote-Repository auf Ihren lokalen Computer herunter [Origin/Master]. Dies bedeutet, dass dies keine Auswirkungen auf Ihre lokale Hauptniederlassung hat, es sei denn, Sie führen sie mit $ git merge Origin/master Zusammen. Denken Sie daran, den richtigen Zweig zu überprüfen, in dem Sie zusammenführen müssen, bevor Sie diesen Befehl ausführen

Hinweis: Abgerufener Inhalt wird als Remote-Zweig dargestellt. Mit Fetch können Sie Änderungen überprüfen, bevor Sie sie in Ihre Kopie des Projekts integrieren. So zeigen Sie Änderungen zwischen Ihrer und der Fernbedienung an $git diff master..Origin/master

4
Gnanasekar S

Ich denke, diese Git-Slash-Notation lässt sich am besten in Ihrem .git - Ordner nachvollziehen.


Hier ist zum Beispiel ein etwas abgekürzter Baum meiner .git-Datei für die LibreOffice-Quellbasis.

In LinuxSudo apt-get install tree Ist es nützlich, dies anzuzeigen.
In Windows Ich denke, der Befehl tree funktioniert möglicherweise noch.

Scrollen Sie nach unten und sehen Sie sich die Referenzen unten an:

$ tree  
.  
├── branches  
├── config  
├── description  
├── FETCH_HEAD  
├── gitk.cache  
├── HEAD  
├── hooks  
│   ├── applypatch-msg.sample  
    ...
├── index  
├── info  
│   └── exclude  
├── logs  
│   ├── HEAD  
│   └── refs  
│       ├── heads  
│       │   ├── master  
│       │   └── remotes  
│       │       └── Origin  
│       └── remotes  
│           └── Origin  
│               ├── distro  
│               │   ├── cib  
│               │   │   └── libreoffice-6-0  
│               │   ├── collabora  
│               │   │   └── cp-6.0  
│               │   └── lhm  
│               │       └── libreoffice-5-2+backports  
│               ├── HEAD  
│               ├── libreoffice-6-2  
│               ├── master  
│               └── private  
│                   └── mst  
│                       └── sw_redlinehide_4a  
├── objects  
│   ├── info  
│   └── pack  
│       ├── pack-b80087dc57e2b3315f449ca0f1aaa91987bf0c5e.idx  
│       ├── pack-b80087dc57e2b3315f449ca0f1aaa91987bf0c5e.pack  
│       ├── pack-eb4e6808029e712d8d9c2671accbbd98aaeb9a04.idx  
│       └── pack-eb4e6808029e712d8d9c2671accbbd98aaeb9a04.pack  
├── ORIG_HEAD  
├── packed-refs  
└── refs  
    ├── heads  
    │   ├── master  
    │   └── remotes  
    │       └── Origin  
    ├── remotes  
    │   └── Origin  
    │       ├── distro  
    │       │   ├── cib  
    │       │   │   └── libreoffice-6-0  
    │       │   ├── collabora  
    │       │   │   └── cp-6.0  
    │       │   └── lhm  
    │       │       └── libreoffice-5-2+backports  
    │       ├── HEAD  
    │       ├── libreoffice-6-2  
    │       ├── master  
    │       └── private  
    │           └── mst  
    │               └── sw_redlinehide_4a  
    └── tags  
        └── libreoffice-6-2-branch-point  

32 directories, 45 files

Es wäre vielleicht weniger verwirrend gewesen, wenn es so ausgelegt wäre, aber es war nicht so:

repositories (i.e. independent trees)
├──local
│  └──master
│
└──Origin1
│  └──master
└──Origin2
   └──master

Wir haben drei grundlegende Arten von Referenzen: Köpfe, Fernbedienungen und Tags.

  • .git/refs/ Köpfe hält unseren lokalen Meister.

  • .git/refs/ Fernbedienungen kann eine Reihe von Fernbedienungen aufnehmen, obwohl wir im Moment nur Origin darin haben.

  • .git/refs/ tags (wird an anderer Stelle besprochen).

Origin also ist unsere einzige ferne. Es gilt Origin/Master.


Wir stellen fest, dass wir 2 [~ # ~] Köpfe [~ # ~] haben (Zeiger auf aktuelle Zweige), einen lokalen und einen entfernten:

$ cat .git/HEAD                        #         local:  HEAD -> master
ref: refs/heads/master

$ cat .git/refs/remotes/Origin/HEAD    # remote Origin:  HEAD -> master
ref: refs/remotes/Origin/master

Wenn Sie Ihre Zweige auflisten:

$ git branch -a
* master
  remotes/Origin/HEAD -> Origin/master
  remotes/Origin/aoo/aw080
  remotes/Origin/aoo/trunk
  remotes/Origin/distro/capgemini/cg-4.1
  remotes/Origin/distro/cib/libreoffice-5-0
  remotes/Origin/distro/cib/libreoffice-5-1
  remotes/Origin/distro/cib/libreoffice-5-2
  ...
  • Der erste aufgelistete Zweig ( master) ist der einzige, der kein entfernter Zweig ist. In diesem Fall haben wir also eine lokale Niederlassung. Hier starten wir unsere eigene Arbeit für unsere eigenen neuen Niederlassungen und nachfolgenden Verpflichtungen.

Als nächstes haben Sie möglicherweise viele Fernverfolgungszweige, und wir tun dies hier. Sie wissen, dass es sich um Fernverfolgungszweige handelt, da ihnen das Präfix ' remotes/' vorangestellt ist. Die hier gezeigten sind für die Fernbedienung mit dem Namen Origin.

  • Die zweite Zeile ist also Origin's aktueller Zweig Zeiger. Remotes/Origin: HEAD --points to -> master. Dies zeigt, dass der aktuelle Zweig im Remote-Repository der Zweig mit dem Namen master, (ist. Nicht zu verwechseln mit unserem lokalen Zweig namens master).

  • Die restlichen Zweige befinden sich nicht in Ihrem .git/refs/-Baum, sondern in .git/packed-refs.

Wenn wir git fetch laden wir Änderungen aus dem Remote-Repository in unser Remote-Tracking-Repository herunter.

Wenn wir git merge die Änderungen in diesem lokalen Remoteverfolgungs-Repository in unserer aktiven lokalen Filiale oder unseren Filialen zusammenführen, in diesem Fall in unserer Master-Filiale.

(Wenn wir git pull machen wir beide Schritte in einer Operation.)


Interessant ist auch, dass diese local und remote UUIDs für master derzeit auf denselben Knoten verweisen (auch bekannt als 'commit') ):

$ cat refs/heads/master                   # local         master
1ca409292272632f443733450313de5a82c54a9c

$ cat refs/remotes/Origin/master          # remote Origin master
1ca409292272632f443733450313de5a82c54a9c

Unser lokaler Master zeigt also auf den gleichen Ort wie der Origin-Master der Fernbedienung:

[local] master = [remote] Origin master

Schließlich halte ich es auch für nützlich, einen Blick auf .git/packed-refs Zu werfen.

$ cat packed-refs 
# pack-refs with: peeled fully-peeled 
3c1d4742e649fe9c8aed8c2817fe3e1f3364f298 refs/remotes/Origin/aoo/aw080
e87c8b7922e9a73e0abb7f9a7a47c9ac3374a826 refs/remotes/Origin/aoo/trunk
b70fdffb041c12f124dcc0822b61bf3450e53137 refs/remotes/Origin/distro/capgemini/cg-4.1
5dbc3f1754809b9489faaf380b1a4bdbcfbb6205 refs/remotes/Origin/distro/cib/libreoffice-5-0
cfdbc96ca47d68d6785fd21829a8d61f49d6e591 refs/remotes/Origin/distro/cib/libreoffice-5-1
5189c8c47461ef09739086e55512fc6a10245273 refs/remotes/Origin/distro/cib/libreoffice-5-2
3bee5917569ca8e6ee3b086458f5b1a917b88ca1 refs/remotes/Origin/distro/cib/libreoffice-5-3
92fbe703f9ca480d3a2b8610d87e991c729edf77 refs/remotes/Origin/distro/cib/libreoffice-5-4
05c0a5df66cc69d75280f05b804cf82f3387d42b refs/remotes/Origin/distro/cib/libreoffice-6-0
7fe193e759b24b90852e6e327115b77114d7b119 refs/remotes/Origin/distro/cib/libreoffice-6-1
8187f7aa413e7ef7b377eea2b057d336bf256867 refs/remotes/Origin/distro/collabora/cd-5.3
7a6b608591e21ef61dc05cff9fc58da531035755 refs/remotes/Origin/distro/collabora/cd-5.3-3.1
....

Zweifellos bleiben mehr Fragen als Antworten, aber ich denke, es kann Ihnen helfen, Ihre eigenen Fragen zu beantworten, was was ist.

1
Elliptical view