it-swarm.com.de

Was sind die Unterschiede zwischen lokalem Zweig, lokalem Verfolgungszweig, entferntem Zweig und entferntem Verfolgungszweig?

Ich habe gerade angefangen, Git zu verwenden, und bin zwischen verschiedenen Zweigen sehr durcheinander geraten. Kann mir jemand helfen, herauszufinden, was die folgenden Filialtypen sind?

  • lokale Niederlassungen
  • lokale Verfolgungszweige
  • abgelegene Niederlassungen
  • remote-Tracking-Zweige

Was ist der Unterschied zwischen ihnen? Und wie arbeiten sie miteinander?

Ein kurzer Demo-Code wird sehr hilfreich sein, denke ich.

134
eded

Ein lokaler Zweig ist ein Zweig, den nur Sie (der lokale Benutzer) sehen können. Es ist nur auf Ihrem lokalen Computer vorhanden.

git branch myNewBranch        # Create local branch named "myNewBranch"

Ein entfernter Zweig ist ein Zweig an einem entfernten Ort (in den meisten Fällen Origin). Sie können den neu erstellten lokalen Zweig myNewBranch auf Origin verschieben. Jetzt können andere Benutzer es verfolgen.

git Push -u Origin myNewBranch   # Pushes your newly created local branch "myNewBranch"
                                 # to the remote "Origin".
                                 # So now a new branch named "myNewBranch" is
                                 # created on the remote machine named "Origin"

Ein Fernverfolgungszweig ist eine lokale Kopie eines Fernzweigs. Wenn myNewBranch mit dem obigen Befehl auf Origin verschoben wird, wird auf Ihrem Computer ein Remote-Verfolgungszweig mit dem Namen Origin/myNewBranch erstellt. Dieser Remote-Tracking-Zweig verfolgt den Remote-Zweig myNewBranch auf Origin. Sie können Ihren Fernverfolgungszweig aktualisieren, um mit dem Fernverfolgungszweig synchron zu sein, indem Sie git fetch oder git pull verwenden.

git pull Origin myNewBranch      # Pulls new commits from branch "myNewBranch" 
                                 # on remote "Origin" into remote tracking
                                 # branch on your machine "Origin/myNewBranch".
                                 # Here "Origin/myNewBranch" is your copy of
                                 # "myNewBranch" on "Origin"

Ein lokaler Verfolgungszweig ist ein lokaler Zweig, der einen anderen Zweig verfolgt. Auf diese Weise können Sie Commits in den/aus dem anderen Zweig verschieben/ziehen. Lokale Verfolgungszweige verfolgen in den meisten Fällen einen entfernten Verfolgungszweig. Wenn Sie einen lokalen Zweig mit der Option git Push command und der Option -u auf Origin verschieben (siehe Abbildung oben), richten Sie den lokalen Zweig myNewBranch ein, um die Fernbedienung zu verfolgen Verfolgungszweig Origin/myNewBranch. Dies ist erforderlich, um git Push und git pull zu verwenden, ohne einen Upstream anzugeben, zu dem Push- oder Pull-Vorgänge ausgeführt werden sollen.

git checkout myNewBranch      # Switch to myNewBranch
git pull                      # Updates remote tracking branch "Origin/myNewBranch"
                              # to be in sync with the remote branch "myNewBranch"
                              # on "Origin".
                              # Pulls these new commits from "Origin/myNewBranch"
                              # to local branch "myNewBranch which you just switched to.
100
SNce

Hier ist die lange Antwort.

Fernbedienungen:

Wenn Sie Git gemeinsam verwenden, müssen Sie wahrscheinlich Ihre Commits mit anderen Computern oder Standorten synchronisieren. Jede Maschine oder jeder Standort wird in der Terminologie von Git als remote bezeichnet, und jede Maschine kann einen oder mehrere Zweige haben. Meistens haben Sie nur eine mit dem Namen Origin. Führen Sie git remote Aus, um alle Fernbedienungen aufzulisten:

$ git remote
bitbucket
Origin

Sie können sehen, für welche Orte diese fernen Namen Verknüpfungen sind, indem Sie git remote -v Ausführen:

$ git remote -v
bitbucket [email protected]:flimm/example.git (fetch)
bitbucket [email protected]:flimm/example.git (Push)
Origin [email protected]:Flimm/example.git (fetch)
Origin [email protected]:Flimm/example.git (Push)

Jede Fernbedienung hat ein Verzeichnis unter git/refs/remotes/:

$ ls -F .git/refs/remotes/
bitbucket/ Origin/

Niederlassungen auf Ihrer Maschine:

TLDR: Auf Ihrem lokalen Computer gibt es drei Arten von Zweigen: lokale Nicht-Tracking-Zweige, lokale Tracking-Zweige und Remote-Tracking-Zweige. Auf einem Remotecomputer gibt es nur eine Art von Zweig.

1. Lokale Niederlassungen

Sie können eine Liste aller lokalen Niederlassungen auf Ihrem Computer anzeigen, indem Sie git branch Ausführen:

$ git branch
master
new-feature

Jede lokale Niederlassung hat eine Datei unter .git/refs/heads/:

$ ls -F .git/refs/heads/
master new-feature

Es gibt zwei Arten von lokalen Zweigen auf Ihrem Computer: nicht nachverfolgbare lokale Zweige und nachverfolgbare lokale Zweige.

1.1 Nicht-Tracking-Filialen vor Ort

Lokale Filialen ohne Nachverfolgung sind keiner anderen Filiale zugeordnet. Sie erstellen eine, indem Sie git branch <branchname> Ausführen.

1.2. Lokale Filialen verfolgen

Lokale Verfolgungszweige sind einem anderen Zweig zugeordnet, normalerweise einem Zweig mit Fernverfolgung. Sie erstellen eine, indem Sie git branch --track <branchname> [<start-point>] Ausführen.

Mit git branch -vv Können Sie anzeigen, welche Ihrer lokalen Niederlassungen Niederlassungen verfolgen:

$ git branch -vv
master      b31f87c85 [Origin/master] Example commit message
new-feature b760e04ed Another example commit message

An der Ausgabe dieses Befehls können Sie erkennen, dass der lokale Zweig master den Zweig für die Fernverfolgung Origin/master Verfolgt und der lokale Zweig new-feature Nichts verfolgt.

Eine andere Möglichkeit, um zu sehen, welche Zweige Zweige verfolgen, ist ein Blick auf .git/config.

Das Verfolgen lokaler Zweige ist nützlich. Sie ermöglichen es Ihnen, git pull Und git Push Auszuführen, ohne anzugeben, welcher Upstream-Zweig verwendet werden soll. Wenn der Zweig nicht so eingerichtet ist, dass er einen anderen Zweig verfolgt, wird eine Fehlermeldung wie die folgende angezeigt:

$ git checkout new-feature
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream new-feature <remote>/<branch>

2. Remote-Tracking-Zweige (noch auf Ihrem Computer)

Sie können eine Liste aller Remote-Tracking-Zweige auf Ihrem Computer anzeigen, indem Sie git branch -r Ausführen:

$ git branch -r
bitbucket/master
Origin/master
Origin/new-branch

Jeder Remote-Tracking-Zweig hat eine Datei unter .git/refs/<remote>/:

$ tree -F .git/refs/remotes/
.git/refs/remotes/
├── bitbucket/
│   └── master
└── Origin/
    ├── master
    └── new-branch

Stellen Sie sich Ihre Remoteverfolgungszweige als Ihren lokalen Cache für die Inhalte der Remotecomputer vor. Sie können Ihre Remote-Tracking-Zweige mit git fetch Aktualisieren, das git pull Im Hintergrund verwendet.

Auch wenn alle Daten für eine Remote-Tracking-Verzweigung lokal auf Ihrem Computer gespeichert sind (wie ein Cache), wird sie dennoch nie als lokale Verzweigung bezeichnet. (Zumindest würde ich es nicht so nennen!) Es wird nur als Remote-Tracking-Zweig bezeichnet.

Zweige auf einem Remote-Computer:

Sie können alle Remote-Zweige (d. H. Die Zweige auf dem Remote-Computer) anzeigen, indem Sie git remote show <remote> Ausführen:

$ git remote show Origin
* remote Origin
  Fetch URL: [email protected]:Flimm/example.git
  Push  URL: [email protected]:Flimm/example.git
  HEAD branch: master
  Remote branches:
    io-socket-ip            new (next fetch will store in remotes/Origin)
    master                  tracked
    new-branch              tracked
  Local ref configured for 'git pull':
    master     merges with remote master
    new-branch merges with remote new-branch
  Local ref configured for 'git Push':
    master     pushes to master     (up to date)
    new-branch pushes to new-branch (fast-forwardable)

Dieser Befehl git remote Fragt den Remote-Computer über das Netzwerk nach seinen Zweigen ab. Die Remote-Tracking-Zweige auf Ihrem lokalen Computer werden nicht aktualisiert. Verwenden Sie dazu git fetch Oder git pull.

In der Ausgabe können Sie alle auf dem Remotecomputer vorhandenen Zweige anzeigen, indem Sie unter der Überschrift "Remotezweige" nachsehen (als "veraltet" markierte Zeilen ignorieren).

Wenn Sie sich auf dem entfernten Rechner anmelden und das Repository im Dateisystem finden könnten, könnten Sie sich alle seine Zweige unter refs/heads/ Ansehen.

Spickzettel:

  • So löschen Sie einen lokalen Zweig, unabhängig davon, ob er verfolgt oder nicht, sicher:

    git branch -d <branchname>
    
  • So löschen Sie einen lokalen Zweig, unabhängig davon, ob er verfolgt wird oder nicht:

    git branch -D <branchname>
    
  • So löschen Sie einen Remote-Tracking-Zweig:

    git branch -rd <remote>/<branchname>
    
  • So erstellen Sie einen neuen lokalen Zweig ohne Verfolgung:

    git branch <branchname> [<start-point>]
    
  • So erstellen Sie einen neuen lokalen Verfolgungszweig: (Beachten Sie, dass bei Angabe von <start-point> Und einem Remote-Verfolgungszweig wie Origin/foobar Das Flag --track Automatisch enthalten ist.)

    git branch --track <branchname> [<start-point]
    

    Beispiel:

    git branch --track hello-kitty Origin/hello-kitty
    
  • So löschen Sie einen Zweig auf einem Remotecomputer:

    git Push --delete <remote> <branchname>
    
  • So löschen Sie alle veralteten Remoteverfolgungszweige, in denen die entsprechenden Zweige auf dem Remotecomputer nicht mehr vorhanden sind:

    git remote Prune <remote>
    

Möglicherweise haben Sie bemerkt, dass Sie in einigen Befehlen <remote>/<branch> Und in anderen Befehlen <remote> <branch> Verwenden. Beispiele: git branch Origin/hello-kitty Und git Push --delete Origin hello-kitty.

Es mag willkürlich erscheinen, aber es gibt eine einfache Möglichkeit, sich zu erinnern, wann ein Schrägstrich und wann ein Leerzeichen verwendet werden soll. Wenn Sie einen Schrägstrich verwenden, beziehen Sie sich auf eine Remote-Tracking-Verzweigung auf Ihrem eigenen Computer, wohingegen Sie sich bei Verwendung eines Leerzeichens tatsächlich mit einer Verzweigung auf einem Remote-Computer über das Netzwerk befassen.

169
Flimm

Lokaler Zweig:

Ein Zweig auf Ihrem Computer, in dem Sie arbeiten und Commits hinzufügen können. Sie können diese Zweige mit git branch.

Local Branch (With Tracking):

Ein gewöhnlicher lokaler Zweig, der so konfiguriert ist, dass er einem entfernten Zweig entspricht. Dies hat Vorteile wie die Fähigkeit, git pull und git Push ohne Angabe von Repository und Branchenname. Tracking verursacht auch git status, um Sie zu informieren, wenn sich Ihre Zweigstelle vor oder hinter der Fernbedienung befindet.

Remote Branch:

Einfach eine Verzweigung in einem Remote-Repository - normalerweise auf einem Server wie GitHub usw.

Remote Tracking Branch:

Eine lokale Kopie einer Remotezweigstelle. Dieser Zweig sollte niemals bearbeitet werden. Ihr Zweck ist es, den aktuellen Status einer entfernten Zweigstelle zu verfolgen. Fernverfolgungszweige können mit git branch -r und normalerweise ungefähr so ​​aussehen wie Origin/master (Name des Repos, gefolgt von einem Schrägstrich, gefolgt vom Namen des Zweigs). Laufen git fetch aktualisiert die Remote-Verfolgungszweige, um den Status der entsprechenden Remote-Zweige widerzuspiegeln.

git branch -avv ist mein persönlicher Favorit für die Anzeige eines schnellen Überblicks darüber, welche Zweige sich auf meinem Computer befinden, welche Zweige sich auf der Fernbedienung befinden und welches Commit jeweils aktuell ist. Das -a part gibt an, dass alle Zweige angezeigt werden sollen (remote und lokal). Die v am Ende stehen für ausführlich (es zeigt den letzten Festschreibungs-Hash und die letzte Nachricht). Vielen Dank an @Flimm für den Hinweis, dass das zweite v Informationen darüber hinzufügt, welche lokale Niederlassung welche entfernte Niederlassung verfolgt.

12
Eric Mathison