732 Stimmen

Was ist der Unterschied zwischen einem Tag und einem Branch in Git? Was sollte ich hier verwenden?

Ich habe einige Schwierigkeiten zu verstehen, wie man tags gegen Zweigstellen において git .

Ich habe gerade die aktuelle Version unseres Codes von cvs a git und jetzt werde ich an einer Teilmenge dieses Codes für eine bestimmte Funktion arbeiten. Ein paar andere Entwickler werden auch daran arbeiten, aber nicht alle Entwickler in unserer Gruppe werden sich für diese Funktion interessieren. Sollte ich einen Zweig oder ein Tag erstellen? In welchen Situationen sollte ich das eine oder das andere verwenden?

612voto

Jakub Narębski Punkte 286531

Desde el theoretisch Sichtweise:

  • tags sind symbolische Namen für eine bestimmte Revision . Sie verweisen immer auf dasselbe Objekt (in der Regel: auf dieselbe Revision); sie ändern sich nicht.
  • Zweigstellen sind symbolische Namen für Entwicklungslinie . Neue Commits werden auf dem Branch erstellt. Der Zweigzeiger rückt natürlich vor und zeigt auf immer neuere Commits.

Desde el technisch Sichtweise:

  • tags ansässig sein refs/tags/ Namespace, und kann auf Tag-Objekte (mit Anmerkungen und optional GPG-signierten Tags) oder direkt an Objekt übergeben (ein weniger gebräuchliches leichtgewichtiges Tag für lokale Namen), oder in sehr seltenen Fällen sogar zu Baumobjekt o Blob-Objekt (z.B. GPG-Signatur).
  • Zweigstellen ansässig sein refs/heads/ Namespace, und kann nur auf Objekte übergeben . Die HEAD Zeiger muss sich auf einen Zweig (symbolische Referenz) oder direkt auf eine Übergabe (abgetrennter HEAD oder unbenannter Zweig) beziehen.
  • Zweigstellen mit Fernverfolgung ansässig sein refs/remotes/<remote>/ Namespace, und folgen Sie gewöhnlichen Zweigen im entfernten Repository <remote> .

Siehe auch gitglossary manpage:

Zweigstelle

Ein "Zweig" ist eine aktive Entwicklungslinie. Die jüngste Übertragung auf einem Zweig wird als Spitze des Zweigs bezeichnet. Die Spitze der Verzweigung wird durch einen Verzweigungskopf referenziert, der sich weiterbewegt, wenn an der Verzweigung weitere Entwicklungen vorgenommen werden. Ein einzelnes Git-Repository kann eine beliebige Anzahl von Zweigen verfolgen, aber Ihr Arbeitsbaum ist nur mit einem von ihnen verbunden (dem "aktuellen" oder "ausgecheckten" Zweig), und HEAD zeigt auf diesen Zweig.

Tag

Eine Referenz, die auf ein Tag oder ein Commit-Objekt verweist. Im Gegensatz zu einem Kopf wird ein Tag durch eine Übertragung nicht verändert. Tags (nicht Tag-Objekte) werden gespeichert in $GIT_DIR/refs/tags/ . [...]. Ein Tag wird in der Regel verwendet, um einen bestimmten Punkt in der Commit-Ahnenkette zu markieren.

Tag-Objekt

Ein Objekt, das einen Verweis auf ein anderes Objekt enthält, das genau wie ein Commit-Objekt eine Nachricht enthalten kann. Es kann auch eine (PGP-)Signatur enthalten; in diesem Fall wird es als "signiertes Tag-Objekt" bezeichnet.

602voto

tvanfosson Punkte 506878

A Tag stellt eine Version eines bestimmten Zweigs zu einem bestimmten Zeitpunkt dar. A Zweigstelle stellt einen separaten Entwicklungsstrang dar, der gleichzeitig mit anderen Entwicklungsarbeiten an der gleichen Codebasis laufen kann. Änderungen an einem Zweig können schließlich wieder in einen anderen Zweig zusammengeführt werden, um sie zu vereinheitlichen.

Normalerweise werden Sie Tag eine bestimmte Version, damit Sie sie wiederherstellen können, z. B., dies ist die Version, die wir an die XYZ Corp. geliefert haben . A Zweigstelle ist eher eine Strategie, um fortlaufende Aktualisierungen für eine bestimmte Version des Codes bereitzustellen und gleichzeitig die Entwicklung daran fortzusetzen. Sie erstellen einen Zweig der ausgelieferten Version, setzen die Entwicklung auf der Hauptlinie fort, nehmen aber Fehlerkorrekturen an dem Zweig vor, der die ausgelieferte Version darstellt. Schließlich fügen Sie diese Fehlerkorrekturen wieder in die Hauptversion ein. Oft werden Sie sowohl Verzweigung als auch Markierung zusammen verwenden. Sie werden verschiedene Markierungen haben, die sowohl für die Hauptlinie als auch für die Zweige gelten und bestimmte Versionen (z.B. die, die an Kunden ausgeliefert wurden) entlang jedes Zweiges markieren, die Sie vielleicht neu erstellen wollen - für die Auslieferung, Fehlerdiagnose, etc.

Es ist eigentlich komplizierter als das - oder so kompliziert, wie Sie es machen wollen - aber diese Beispiele sollten Ihnen eine Vorstellung von den Unterschieden geben.

171voto

jub0bs Punkte 53314

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

Zweigstellen

Eine Zweigstelle kann man sich als eine dieser klebrigen Lesezeichen :

enter image description here

Ein brandneues Repository hat nur eine davon (genannt master ), die automatisch auf die neueste Seite wechselt (siehe übergeben. ), die Sie geschrieben haben. Es steht Ihnen jedoch frei, weitere Lesezeichen zu erstellen und zu verwenden, um andere interessante Punkte im Buch zu markieren, damit Sie schnell zu ihnen zurückkehren können.

Außerdem können Sie ein bestimmtes Lesezeichen jederzeit auf eine andere Seite des Buches verschieben (mit git-reset zum Beispiel); Punkte von Interesse ändern sich in der Regel im Laufe der Zeit.

Tags

Sie können sich die Tags wie folgt vorstellen Kapitelüberschriften .

bookmarks

Er kann einen Titel enthalten (denken Sie an kommentierte Tags ) oder nicht. Eine Markierung ist ähnlich, aber anders als ein Zweig, da sie einen Punkt markiert, an dem historisch Interesse an dem Buch. Um den historischen Aspekt beizubehalten, sollten Sie, sobald Sie einen Tag geteilt haben (d.h. ihn auf eine gemeinsame Remote geschoben haben), du sollst nicht verschieben Sie es an eine andere Stelle im Buch.

46voto

VonC Punkte 1117238

Wenn Sie von CVS kommen, müssen Sie sich darüber im Klaren sein, dass Sie nicht mehr die Verzeichnisse wenn Sie eine Zweigstelle einrichten.
Es gibt keine "klebrige Markierung" (die nur auf eine Datei angewendet werden kann) und keine "Verzweigungsmarkierung" mehr.
Branch und Tags sind zwei verschiedene Objekte in Git, und sie gelten immer für die todo Repo.

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

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

Diese Struktur ergibt sich aus der Tatsache, dass CVS ein Überarbeitungssystem und nicht ein Versionssystem (siehe Versionskontrolle vs. Revisionskontrolle? ).
Das bedeutet, dass Zweige durch Tags für CVS und Verzeichniskopien für SVN emuliert werden.

Ihre Frage macht Sinn, wenn Sie daran gewöhnt sind, einen Tag auszuwählen, und anfangen, darin zu arbeiten .
Was man nicht tun sollte ;)
Ein Tag soll eine unveränderlich Inhalte, die nur für den Zugriff auf sie verwendet werden, mit der Garantie, jedes Mal denselben Inhalt zu erhalten.

In Git ist der Verlauf der Revisionen eine Reihe von Übertragungen, die einen Graphen bilden.
Ein Zweig ist ein Pfad in diesem 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 eine Verzweigung erstellen, um damit arbeiten zu können.
  • Wenn Sie einen Zweig auschecken, sehen Sie direkt den letzten Commit it('HEAD') dieses Zweigs.

Ver Jakub Narebskis Antwort für alle technischen Einzelheiten, aber ehrlich gesagt, brauchen Sie zu diesem Zeitpunkt (noch) nicht alle Details ;)

Der wichtigste Punkt ist: Ein Tag ist ein einfacher Verweis auf eine Übertragung, dessen Inhalt Sie niemals ändern können. Sie brauchen einen Zweig.


In Ihrem Fall arbeitet jeder Entwickler an einer bestimmten Funktion:

  • sollten ihren eigenen Zweig in ihrem jeweiligen Repository erstellen
  • Verfolgung von Zweigen aus den Repositories ihrer Kollegen (die an der gleichen Funktion arbeiten)
  • ziehen/schieben, um Ihre Arbeit mit Gleichaltrigen zu teilen.

Anstatt die Zweige Ihrer Kollegen direkt zu verfolgen, könnten Sie nur den Zweig eines "offiziellen" zentralen Repositorys verfolgen, in das jeder seine Arbeit einspeist, um die Arbeit aller für diese bestimmte Funktion zu integrieren und zu teilen.

43voto

Jason Punkte 381

Zweige sind aus Holz und wachsen aus dem Stamm des Baumes. Die Anhänger sind aus Papier (ein Derivat von Holz) und hängen wie Weihnachtsschmuck an verschiedenen Stellen des Baumes.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X