web-dev-qa-db-de.com

Wie unterscheidet sich ein Tag von einem Zweig in Git? Welche soll ich hier verwenden?

Ich habe einige Schwierigkeiten zu verstehen, wie man Tags gegenüber Zweigen in - verwendet. git .

Ich habe gerade die aktuelle Version unseres Codes von cvs nach git verschoben und arbeite jetzt an einer Teilmenge dieses Codes für eine bestimmte Funktion. Einige andere Entwickler werden ebenfalls daran arbeiten, aber nicht alle Entwickler in unserer Gruppe werden sich für diese Funktion interessieren. Soll ich eine Filiale oder ein Tag erstellen? In welchen Situationen sollte ich eins gegen das andere verwenden?

575
Bialecki

Ein Tag repräsentiert eine Version eines bestimmten Zweigs zu einem bestimmten Zeitpunkt. Ein Zweig repräsentiert einen separaten Entwicklungsthread, der möglicherweise gleichzeitig mit anderen Entwicklungsbemühungen auf derselben Codebasis ausgeführt wird. Änderungen an einer Verzweigung können eventuell wieder in eine andere Verzweigung übernommen werden, um sie zu vereinheitlichen.

Normalerweise werden Sie tag eine bestimmte Version, so dass Sie es neu erstellen können, z. B. Dies ist die Version, die wir an XYZ Corp geliefert haben . Eine Verzweigung ist eher eine Strategie, um fortlaufende Aktualisierungen für eine bestimmte Version des Codes bereitzustellen, während die Weiterentwicklung fortgesetzt wird. Sie erstellen eine Verzweigung der gelieferten Version, setzen die Entwicklung auf der Hauptlinie fort, beheben jedoch Fehler in der Verzweigung, die die gelieferte Version darstellt. Schließlich werden Sie diese Fehlerbehebungen wieder in der Hauptzeile zusammenführen. Oft werden Sie sowohl Verzweigungen als auch Markierungen verwenden. Sie haben verschiedene Tags, die sowohl für die Hauptleitung als auch für deren Zweige gelten können und bestimmte Versionen kennzeichnen (z. B. diejenigen, die an Kunden geliefert werden), und zwar für jeden Zweig, den Sie neu erstellen möchten, z.

Es ist tatsächlich komplizierter - oder so kompliziert, wie Sie es machen möchten - aber diese Beispiele sollen Ihnen einen Eindruck von den Unterschieden vermitteln.

490
tvanfosson

Aus der theoretisch Sicht:

  • Tags sind symbolische Namen für eine gegebene Revision. Sie zeigen immer auf dasselbe Objekt (normalerweise: auf dieselbe Revision); sie ändern sich nicht.
  • Zweige sind symbolische Namen für Entwicklungslinie. Neue Commits werden über dem Zweig erstellt. Der Verzweigungszeiger rückt natürlich vor und zeigt auf immer neuere Festschreibungen.

Aus der technisch Sicht:

  • Tags befinden sich im Namespace refs/tags/ und können auf Tag-Objekte (mit Anmerkungen versehen und optional mit einer GPG-Signatur versehen) verweisen Tags) oder direkt an Objekt festschreiben (weniger benutztes Lightweight-Tag für lokale Namen), oder in sehr seltenen Fällen sogar an Baumobjekt oder Blob Objekt (zB GPG Signatur).
  • Zweige befinden sich im Namespace refs/heads/ und können nur auf Objekte festschreiben verweisen. Der Zeiger HEAD muss sich auf eine Verzweigung (symbolische Referenz) oder direkt auf einen Festschreibevorgang (losgelöster HEAD oder unbenannter Zweig)) beziehen.
  • Remote-Tracking-Zweige befinden sich im Namespace refs/remotes/<remote>/ und folgen den normalen Zweigen im Remote-Repository <remote>.

Siehe auch gitglossary manpage:

Zweig

Eine "Niederlassung" ist eine aktive Entwicklungslinie. Das letzte Festschreiben für einen Zweig wird als die Spitze dieses Zweigs bezeichnet. Die Spitze des Zweigs wird von einem Zweigkopf referenziert, der sich vorwärts bewegt, wenn zusätzliche Entwicklung auf dem Zweig durchgeführt wird. Ein einzelnes Git-Repository kann eine beliebige Anzahl von Zweigen nachverfolgen, aber Ihr Arbeitsbaum ist nur einem von ihnen zugeordnet (dem "aktuellen" oder "ausgecheckten" Zweig), und HEAD verweist darauf Ast.

Tag

Ein Verweis, der auf ein Tag oder ein Commit-Objekt verweist. Im Gegensatz zu einem Kopf wird ein Tag nicht durch ein Commit geändert. Tags (keine Tag-Objekte) werden in $GIT_DIR/refs/tags/ Gespeichert. [...]. Ein Tag wird am häufigsten verwendet, um einen bestimmten Punkt in der Vorfahrkette des Commits zu markieren.

Tag-Objekt

Ein Objekt mit einem Verweis auf ein anderes Objekt, das eine Nachricht wie ein Festschreibungsobjekt enthalten kann. Es kann auch eine (PGP-) Signatur enthalten. In diesem Fall wird es als "signiertes Tag-Objekt" bezeichnet.

505
Jakub Narębski

Wenn Sie sich Ihr Repository als ein Buch vorstellen, das den Fortschritt Ihres Projekts aufzeichnet ...

Geäst

Sie können sich einen Zweig als eines dieser klebrigen Lesezeichen vorstellen :

enter image description here

In einem brandneuen Repository gibt es nur eines (genannt master), das automatisch zur neuesten Seite wechselt (think commit), die Sie geschrieben haben. Es steht Ihnen jedoch frei, weitere Lesezeichen zu erstellen und zu verwenden, um andere interessante Punkte im Buch zu markieren, sodass Sie schnell zu diesen zurückkehren können.

Sie können ein bestimmtes Lesezeichen auch jederzeit auf eine andere Seite des Buches verschieben (mit git-reset, zum Beispiel); Points of Interest variieren in der Regel im Laufe der Zeit.

Stichworte

Sie können sich Tags als Kapitelüberschriften vorstellen.

bookmarks

Es kann einen Titel enthalten (think annotated tags ) oder nicht. Ein Tag ähnelt einem Zweig, unterscheidet sich jedoch darin, dass es einen Punkt von historical Interesse für das Buch kennzeichnet. Um den historischen Aspekt beizubehalten, sollten Sie ein freigegebenes Tag (dh auf eine freigegebene Fernbedienung verschoben) nicht an eine andere Stelle im Buch verschieben .

137
jub0bs

Was Sie aus CVS heraus erkennen müssen, ist, dass Sie beim Einrichten eines Zweigs keine Verzeichnisse mehr erstellen .
Kein "Sticky Tag" (das nur auf eine Datei angewendet werden kann) oder "Branch Tag" mehr.
Branch und Tags sind zwei verschiedene Objekte in Git und gelten immer für das all Repo.

Sie müssten (diesmal mit SVN) Ihr Repository nicht mehr explizit strukturieren mit:

branches
   myFirstBranch
     myProject
       mySubDirs
   mySecondBranch
     ...
tags
   myFirstTag
     myProject
       mySubDirs
   mySecondTag
   ...

Diese Struktur ergibt sich aus der Tatsache, dass CVS ein Revisionssystem und kein Versionssystem ist (siehe Versionskontrolle vs. Revisionskontrolle? ).
Das heißt, Verzweigungen werden durch Tags für CVS, Verzeichniskopien für SVN emuliert.

Ihre Frage macht Sinn, wenn Sie es gewohnt sind, ein Tag zu überprüfen, und fangen Sie an, darin zu arbeiten.
Was du nicht solltest;)
Ein Tag soll einen unveränderlichen Inhalt darstellen, der nur verwendet wird, um darauf zuzugreifen, mit der Garantie, dass jedes Mal derselbe Inhalt abgerufen wird.

In Git besteht der Verlauf von Revisionen aus einer Reihe von Commits, die ein Diagramm bilden.
Ein Zweig ist ein Pfad dieses Graphen

x--x--x--x--x # one branch
    \ 
     --y----y # another branch
       1.1
        ^
        |
        # a tag pointing to a commit
  • Wenn Sie ein Tag auschecken, müssen Sie einen Zweig erstellen, um damit arbeiten zu können.
  • Wenn Sie einen Zweig auschecken, sehen Sie direkt, dass dieser Zweig zuletzt festgeschrieben wurde ('HEAD').

Siehe Jakub Narębskis Antwort für alle technischen Details, aber ehrlich gesagt, an dieser Stelle brauchen Sie (noch) nicht alle Details;)

Der Hauptpunkt ist: Ein Tag ist ein einfacher Zeiger auf ein Commit, und Sie können seinen Inhalt niemals ändern. Du brauchst eine Filiale.


In Ihrem Fall arbeitet jeder Entwickler an einer bestimmten Funktion:

  • sollten ihre eigene Filiale in ihrem jeweiligen Repository erstellen
  • verfolgen von Zweigen aus den Repositories ihrer Kollegen (die an derselben Funktion arbeiten)
  • ziehen/Drücken, um Ihre Arbeit mit Gleichaltrigen zu teilen.

Anstatt die Filialen Ihrer Kollegen direkt zu verfolgen, können Sie auch nur die Filialen eines "offiziellen" zentralen Repositorys verfolgen, in das alle Mitarbeiter ihre Arbeit verlagern, um die Arbeit aller Mitarbeiter für diese bestimmte Funktion zu integrieren und gemeinsam zu nutzen.

42
VonC

Zweige bestehen aus Holz und wachsen aus dem Stamm des Baumes. Tags bestehen aus Papier (Holzderivat) und hängen wie Christbaumschmuck an verschiedenen Stellen im Baum.

Ihr Projekt ist der Baum, und Ihre Funktion, die dem Projekt hinzugefügt wird, wächst in einem Zweig. Die Antwort ist Branch.

37
Jason

Am besten lässt sich erklären, dass Tags als schreibgeschützte Zweige fungieren. Sie können einen Zweig als Tag verwenden, ihn jedoch möglicherweise versehentlich mit neuen Commits aktualisieren. Tags verweisen garantiert auf dasselbe Commit, solange sie existieren.

15

Tags können entweder signiert oder nicht signiert sein ; Zweige sind nie signiert.

Signierte Tags können niemals verschoben werden, da sie kryptografisch (mit einer Signatur) an ein bestimmtes Commit gebunden sind. Tags ohne Vorzeichen sind nicht gebunden und können verschoben werden (das Verschieben von Tags ist jedoch kein normaler Anwendungsfall).

Zweige können nicht nur zu einem anderen Festschreiben verschoben werden, sondern es wird erwartet , dass dies geschieht. Sie sollten eine Niederlassung für Ihr lokales Entwicklungsprojekt verwenden. Es ist nicht ganz sinnvoll, die Arbeit an einem Git-Repository "auf einem Tag" festzuschreiben.

14
Greg Hewgill

Das Git-Parabel erklärt, wie ein typisches DVCS erstellt wird und warum seine Ersteller das getan haben, was sie getan haben. Vielleicht möchten Sie auch Git for Computer Scientist ; Hier wird erklärt, was jeder Objekttyp in Git bewirkt, einschließlich Verzweigungen und Tags.

10
Bombe

Ich stelle mir Zweige gerne als wohin du gehst, Tags als wo du warst.

Ein Tag fühlt sich wie ein Lesezeichen für einen bestimmten wichtigen Punkt in der Vergangenheit an, z. B. eine Versionsveröffentlichung.

Während eine Verzweigung ein bestimmter Pfad ist, geht das Projekt nach unten und der Verzweigungsmarker rückt mit Ihnen vor. Wenn Sie fertig sind, können Sie den Zweig (d. H. Die Markierung) zusammenführen/löschen. Natürlich können Sie zu diesem Zeitpunkt festlegen, dass das Commit markiert werden soll.

9
Gazzer

Ein Tag wird verwendet, um eine Version zu markieren, genauer gesagt, um einen Zeitpunkt in einem Zweig zu referenzieren. Ein Zweig wird normalerweise verwendet, um einem Projekt Features hinzuzufügen.

6
Number45

einfach:

Von Tags wird erwartet, dass sie immer auf die gleiche Version eines Projekts verweisen, während von Heads erwartet wird, dass sie im Verlauf der Entwicklung voranschreiten.

Git User Manual

3
Bar Horing

die einfache Antwort lautet:

branch: Der aktuelle Verzweigungszeiger verschiebt sich bei jedem Commit in das Repository

aber

tag: Das Festschreiben, auf das ein Tag verweist, ändert sich nicht. Tatsächlich ist das Tag eine Momentaufnahme dieses Festschreibens.

0
jsina