Ist es in git eine schlechte Idee, ein Tag mit demselben Namen wie ein gelöschter Zweig zu erstellen?

20

Ich habe ein Projekt mit einem Git-Verzweigungsmodell, das ungefähr dem von nvies Git-Flow folgt .

Unsere Release-Zweige sind im SemVer- Format benannt, zv1.5.2

Sobald ein Release-Zweig grünes Licht für die Produktion hat, schließen wir den Zweig, indem wir ihn in den Master-Zweig zusammenführen, ein Tag anwenden und dann den Zweig löschen.

Da wir den Freigabezweig sofort löschen, verwenden wir denselben Bezeichner zum Kennzeichnen des Zweigs, z v1.5.2

Hier sind die Befehle, die wir zum Schließen eines Release-Zweigs verwenden würden:

$ git checkout master
$ git merge v1.5.2
$ git tag -a v1.5.2 -m "Version 1.5.2 - foo bar, baz, etc"
$ git branch -d v1.5.2
$ git branch -dr origin/v1.5.2
$ git push origin :v1.5.2
$ git push
$ git push --tags

Dies scheint in den meisten Fällen zu funktionieren, es verursacht jedoch ein Problem in dem Szenario, in dem eine andere Instanz des Git-Repos (z. B. ein anderer Entwicklercomputer oder eine Staging-Umgebung) eine lokale Prüfung des Zweigs der Version 1.5.2 durchführt.

Der git push origin :v1.5.2Befehl löscht den Zweig in der Fernbedienung, löscht jedoch nicht die lokale Version des Zweigs (falls vorhanden) in allen Repos.

Dies führt zu einem mehrdeutigen Hinweis, wenn Sie versuchen, v1.5.2in diesen Repos auszuchecken:

$ git checkout v1.5.2
warning: refname 'v1.5.2' is ambiguous.

Kann dies vermieden werden, ohne eine andere Syntax für die Zweige zu verwenden, z. B. release-v1.5.2oder v1.5.2-rc?

Oder ist es unvermeidlich und daher eine grundsätzlich schlechte Idee, ein Tag mit dem gleichen Namen wie ein gelöschter Zweig zu erstellen?

tommarshall
quelle

Antworten:

19

Wenn Sie dieses Benennungsschema unbedingt beibehalten möchten, können Sie:

Entscheiden Sie, dass Sie diese Warnungen nicht interessieren

Das heißt, wenn Sie mit der Tatsache zufrieden sind, dass:

  • git checkout <ref>Check - Out refs/heads/<ref>über refs/tags/<ref>(siehe git-Kasse )
  • andere Befehle verwenden refs/tags/<ref>over refs/heads/<ref>(siehe gitrevisions )

In diesem Test-Repository zeigt beispielsweise der v1.5.2Zweig auf Commit B, während das v1.5.2Tag auf Commit A verweist.

% git log --oneline --decorate
8060f6f (HEAD, v1.5.2, master) commit B
0e69483 (tag: v1.5.2) commit A

git checkout bevorzugt Filialnamen:

% git checkout v1.5.2
warning: refname 'v1.5.2' is ambiguous.
Switched to branch 'v1.5.2'
% git log --decorate --oneline -1
8060f6f (HEAD, v1.5.2, master) commit B

wird aber git logden Tag-Namen verwenden:

% git log --decorate --oneline -1 v1.5.2
warning: refname 'v1.5.2' is ambiguous.
0e69483 (tag: v1.5.2) commit A

Das könnte verwirrend sein.

Trainieren Sie Personen, um ihre lokalen Zweige zu löschen, wenn sie ein neues Tag sehen

Dies kann je nach Größe Ihrer Organisation schwierig / umständlich sein.

Schreibe einen Wrapper um "git pull" und "git fetch"

Das heißt, schreiben Sie einen Wrapper, der prüft, ob Tags vorhanden sind, die Zweignamen schattieren, und warnen Sie vor diesen Zweigen (oder löschen Sie sie). Das hört sich schmerzhaft an und es könnte unerwünscht sein, wenn der schattierte Zweig gerade ausgecheckt ist.

Leider scheint es der einfachste Weg, dieses Problem zu lösen, zu sein, die Art und Weise zu ändern, in der Sie Ihre Filialen benennen. Der Link, den Sie gepostet haben, verwendet unterschiedliche Benennungsschemata für Tags und Zweige: Wenn Sie diese Methode bereits größtenteils befolgen, ist die Übernahme des Benennungsschemas möglicherweise die einfachste Lösung.

benj
quelle
Danke für die Antwort. Sehr hilfreich. Der erste Aufzählungspunkt gibt an, dass git checkoutdas Tag über dem Zweig ausgecheckt wird, wenn es einen ambitionierten Verweis gibt. Dies ist jedoch nicht das Verhalten, das ich sehe . Hat sich das in einer moderneren Version von Git geändert? Gibt es ein Flag, das ich setzen kann gitconfig, um dieses Verhalten zu erzielen?
Tommarshall
Du hast recht, ich habe das völlig falsch verstanden. Es tut uns leid! Ich habe meine Antwort korrigiert und ein Beispiel hinzugefügt.
benj
10

Sie können explizit angeben, ob Sie eine Verzweigung oder ein Tag möchten, indem Sie den vollständigen Namen verwenden:

 git checkout refs/heads/v1.5.2

oder

git checkout refs/tags/v1.5.2
mastahu
quelle