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

158

Ich habe gerade angefangen, Git zu benutzen und war wirklich verwirrt zwischen verschiedenen Zweigen. Kann mir jemand helfen, die folgenden Verzweigungstypen herauszufinden?

  • lokale Niederlassungen
  • lokale Tracking-Zweige
  • entfernte Zweige
  • Fernverfolgungszweige

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

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

eded
quelle

Antworten:

123

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 Remote-Zweig ist (in den meisten Fällen origin) ein Zweig an einem Remote-Standort . Sie können den neu erstellten lokalen Zweig myNewBranchan verschieben origin. 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 Remote-Tracking-Zweig ist eine lokale Kopie eines Remote-Zweigs. Wenn myNewBranchauf gedrückt wird originmit dem Befehl oben, mit dem Namen ein Remote - Tracking - Zweig origin/myNewBranchauf Ihrem Rechner erstellt. Dieser Fern Tracking - Zweig verfolgt den Remote - Zweig myNewBranchauf origin. Sie können Ihren Remote-Tracking- Zweig mithilfe von git fetchoder so aktualisieren , dass er mit dem Remote-Zweig synchronisiert ist git pull.

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 zum / vom anderen Zweig verschieben / ziehen. Lokale Verfolgungszweige verfolgen in den meisten Fällen einen Fernverfolgungszweig. Wenn Sie einen lokalen Zweig dazu bringen origin, die Option git push commandmit einer -uOption zu verwenden (wie oben gezeigt), richten Sie den lokalen Zweig so ein, dass der Zweig myNewBranchfür die Fernverfolgung verfolgt wird origin/myNewBranch. Dies ist erforderlich, um git pushund git pullohne Angabe eines Upstreams zum Drücken oder Ziehen zu verwenden.

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.
SNce
quelle
Ist das für die Definition des lokalen Verfolgungszweigs nicht dasselbe wie ein lokaler Zweig, nachdem er auf Remote verschoben wurde?
mskw
2
@mskw Nein, ein lokaler Tracking-Zweig und ein lokaler (Nicht-Tracking-) Zweig unterscheiden sich in der Zuordnung. Ein lokaler Zweig ist keinem Zweig zugeordnet. Es ist einfach ein Zweig, der isoliert auf Ihrem lokalen Computer vorhanden ist. Ein lokaler Verfolgungszweig ist einem Fernverfolgungszweig zugeordnet. So können Sie Commits zueinander schieben / ziehen.
SNce
196

Hier ist die lange Antwort.

Fernbedienungen:

Wenn Sie Git gemeinsam verwenden, müssen Sie Ihre Commits wahrscheinlich mit anderen Computern oder Standorten synchronisieren. Jeder Computer oder Standort wird in der Terminologie von Git als Remote bezeichnet , und jeder kann einen oder mehrere Zweige haben. Meistens haben Sie nur einen Namen origin. Führen Sie Folgendes aus, um alle Fernbedienungen aufzulisten git remote:

$ git remote
bitbucket
origin

Sie können sehen, für welche Speicherorte diese Remote-Namen Verknüpfungen sind, indem Sie Folgendes ausführen git remote -v:

$ 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/

Zweige 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 haben Sie nur einen Zweigtyp.

1. Lokale Niederlassungen

Sie können eine Liste aller lokalen Zweige auf Ihrem Computer anzeigen, indem Sie Folgendes ausführen git branch:

$ git branch
master
new-feature

Jeder lokale Zweig 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 verfolgte lokale Zweige und Verfolgung lokaler Zweige.

1.1 Nicht nachverfolgbare lokale Niederlassungen

Lokale Zweige ohne Nachverfolgung sind keinem anderen Zweig zugeordnet. Sie erstellen eine durch Ausführen git branch <branchname>.

1.2. Verfolgung lokaler Niederlassungen

Das Verfolgen lokaler Zweige ist einem anderen Zweig zugeordnet, normalerweise einem Fernverfolgungszweig. Sie erstellen eine durch Ausführen git branch --track <branchname> [<start-point>].

Sie können anzeigen, welche Ihrer lokalen Niederlassungen Niederlassungen verfolgen, indem Sie git branch -vv:

$ 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 masterden Fernverfolgungszweig verfolgt origin/masterund der lokale Zweig new-featurenichts verfolgt.

Eine andere Möglichkeit, um zu sehen, welche Zweige Zweige verfolgen, besteht darin, einen Blick darauf zu werfen .git/config.

Das Verfolgen lokaler Niederlassungen ist nützlich. Mit ihnen können Sie git pullund git pushohne Angabe des zu verwendenden Upstream-Zweigs ausführen . Wenn der Zweig nicht für die Verfolgung eines anderen Zweigs eingerichtet ist, wird folgende Fehlermeldung 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 Folgendes ausführen git branch -r:

$ 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 Remote-Tracking-Zweige als Ihren lokalen Cache für das vor, was die Remote-Computer enthalten. Sie können Ihre Remote-Tracking-Zweige mit aktualisieren, indem Sie git fetchdiese git pullhinter den Kulissen verwenden.

Obwohl alle Daten für einen Remote-Tracking-Zweig lokal auf Ihrem Computer gespeichert sind (wie ein Cache), wird er nie als lokaler Zweig bezeichnet. (Zumindest würde ich es nicht so nennen!) Es wird nur ein Remote-Tracking-Zweig genannt.

Zweige auf einem Remote-Computer:

Sie können alle Remote-Zweige (dh die Zweige auf dem Remote-Computer) anzeigen, indem Sie Folgendes ausführen git remote show <remote>:

$ 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 git remoteBefehl fragt den Remotecomputer über das Netzwerk nach seinen Zweigen ab. Die Remote-Tracking-Zweige auf Ihrem lokalen Computer werden nicht aktualisiert, verwendet git fetchoder git pulldafür.

In der Ausgabe können Sie alle auf dem Remote-Computer vorhandenen Zweige anzeigen, indem Sie unter der Überschrift "Remote-Zweige" nachsehen (als "veraltet" gekennzeichnete Zeilen ignorieren).

Wenn Sie sich am Remotecomputer anmelden und das Repository im Dateisystem finden könnten, könnten Sie sich alle Zweige unter ansehen refs/heads/.

Spickzettel:

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

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

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

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

    git branch <branchname> [<start-point>]
    
  • So erstellen Sie einen neuen lokalen Tracking-Zweig: (Beachten Sie, dass das Flag automatisch eingeschlossen wird , wenn <start-point>es angegeben ist und ein Remote-Tracking-Zweig ist.)origin/foobar--track

    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 Remote-Tracking-Zweige, dh die entsprechenden Zweige auf dem Remote-Computer sind nicht mehr vorhanden:

    git remote prune <remote>
    

Möglicherweise haben Sie bemerkt, dass Sie in einigen Befehlen <remote>/<branch>und anderen Befehlen , <remote> <branch>. Beispiele: git branch origin/hello-kittyund git push --delete origin hello-kitty.

Es mag willkürlich erscheinen, aber es gibt eine einfache Möglichkeit, sich daran zu erinnern, wann ein Schrägstrich und wann ein Leerzeichen verwendet werden muss. Wenn Sie einen Schrägstrich verwenden, beziehen Sie sich auf einen Zweig mit Remoteverfolgung auf Ihrem eigenen Computer, während Sie sich bei Verwendung eines Speicherplatzes tatsächlich mit einem Zweig auf einem Remotecomputer über das Netzwerk befassen.

Flimm
quelle
Ich würde verwenden, um Zweig zu erstellen und zum Zweig in einem cmd zu gehen als: git checkout -b mynewbranch
Zeta
Ich habe den letzten Punkt über den Unterschied zwischen dem Leerzeichen und dem Schrägstrich geliebt!
Aderchox
12

Lokale Niederlassung:

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

Lokale Niederlassung (mit Tracking):

Ein gewöhnlicher lokaler Zweig, der so konfiguriert ist, dass er einem entfernten Zweig entspricht. Dies hat benfits wie die Fähigkeit, git pullund git pushohne das Repository und Zweignamen angeben. Durch die Nachverfolgung werden Sie auch darüber git statusinformiert, wenn sich Ihre Niederlassung 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 eines Remote-Zweigs. Dieser Zweig sollte niemals bearbeitet werden. Ihr Zweck ist es, den aktuellen Status einer entfernten Niederlassung zu verfolgen. Remote-Tracking-Zweige können mit angezeigt werden git branch -rund sehen normalerweise so aus origin/master(Repo-Name gefolgt von einem Schrägstrich gefolgt vom Zweignamen). Durch Ausführen git fetchwerden die Remote-Tracking-Zweige aktualisiert, um den Status der entsprechenden Remote-Zweige wiederzugeben.

git branch -avvist mein persönlicher Favorit, um einen schnellen Überblick darüber zu erhalten, welche Zweige sich auf meinem Computer befinden, welche Zweige sich auf der Fernbedienung befinden und welches Commit jeweils aktuell ist. Der -aTeil gibt an, dass alle Zweige angezeigt werden sollen (remote und lokal). Die v's am Ende stehen für ausführlich (es zeigt den letzten Commit-Hash und die letzte Nachricht). Vielen Dank an @Flimm für den Hinweis, dass der zweite vInformationen darüber hinzufügt, welcher lokale Zweig welche Fernbedienung verfolgt.

Eric Mathison
quelle
1
Ich verstehe den Unterschied zwischen lokalen Tracking- und Remote-Tracking-Zweigen nicht - ersterer entspricht dem Ursprung und letzterer dem Remote-Computer. aber sind das nicht die gleichen? Ist das nicht nur das Repo, das normalerweise auf Github läuft?
Akantoword
1
@akantoword Ich habe die Antwort aktualisiert, um zu versuchen, ein bisschen zu klären. Grundsätzlich ist der Remote-Tracking-Zweig einfach eine lokale Kopie des Remote-Zweigs, in der nicht gearbeitet werden soll. Ein lokaler Zweig mit Tracking dient zum Arbeiten.
Eric Mathison