Angenommen, das aktuelle Protokoll in meinem Gerrit sieht wie folgt aus:
- commit10 (Master)
- begehen9
- begehen8
- begehen7
- commit6 v1.72.0
- verpflichten5
- commit4 v1.71.0
- verpflichten3
- begehen2
- begehen1
Mein Ziel ist es, ein neues Tag (v1.73.0) zu erstellen, das commit8 und commit9 enthalten sollte, und es an den Ursprung zu schieben. Mir wurde gesagt, ich solle basierend auf dem neuesten Stable-Tag einen neuen lokalen Zweig erstellen und die erforderlichen Commits aussuchen und mit Tags versehen. Ich habe jedoch ein Problem damit, das Tag auf den Master zu übertragen.
Folgendes habe ich getan:
- Erstellen Sie einen lokalen Zweig basierend auf dem neuesten Tag: git checkout -b branchforv1.73.0 v1.72.0
- Cherry-Pick commit8 und commit9
- neues Tag erstellen: git tag v1.73.0
… also, wie pushe ich v1.73.0 auf Master?
Ergebnis:
- commit10 (Master)
- begehen7
- commit9 v1.73.0
- begehen8
- commit6 v1.72.0
- verpflichten5
- commit4 v1.71.0
- verpflichten3
- begehen2
- begehen1
Wie Tags funktionieren
In Git soll jedes Tag auf einen (einen, einzelnen) Commit “zeigen”. Tatsächlich gilt dasselbe für einen Zweig: einen Zweignamen Auch zeigt nur auf einen Commit.
Was diese Arbeit ausmacht, sind zwei Dinge:
- jeder Commit zeigt auch auf einen anderen Commit (oder vielleicht mehrere), und
- für Filialen (bzw nur für Verzweigungen), der Commit, auf den die Verzweigungspunkte automatisch “vorrücken”. Das heißt, wenn du neue Commits hinzufügst – in gewisser Weise ist das alles, was Git tut: neue Commits zu seinem Kollektiv hinzufügen, so ähnlich wie die Borg aus der alten Star Trek TNG-Serie – auf welchem Branch du dich auch befindest, das ist der Branch that wird neu angepasst, um auf das neue Commit zu zeigen.
Der Hauptunterschied zwischen einer Verzweigung und einem Tag besteht also darin, dass sich ein Tag nicht bewegt.
Um zu sehen, wie das funktioniert, betrachten Sie ein einfaches Git-Repository mit nur drei Commits. Lassen Sie uns diese Commits kennzeichnen A
, B
und C
. Das erste Commit (A
) zeigt auf nichts, da es der erste Commit und Branch ist master
verweist auf A
:
A <-- master
Wenn Sie den zweiten Commit durchführen, erstellt Git B
weist zurück auf A
und rückt den Zweignamen vor, auf den verwiesen werden soll B
:
A <- B <-- master
Wenn Sie dann ein drittes Commit durchführen, lässt git es wieder auf sein übergeordnetes Commit verweisen und die Verzweigung vorrücken:
A <- B <- C <-- master
Wenn Sie jetzt ein Tag erstellen, zeigt dieses Tag standardmäßig auf Commit C
:
A <- B <- C <-- master
^
|
tag: sometag
Wenn Sie dann einen neuen Commit machen D
git erweitert die Zweigaber nicht das Tag:
A <- B <- C <- D <-- master
^
|
tag: sometag
Sie können jederzeit Tags erstellen oder löschen, die auf einen bestimmten Commit verweisen:
$ git tag -d sometag
wird Tag löschen sometag
nachdem:
$ git tag sometag master~2
werde hinzufügen sometag
zeigt auf zu begehen B
.1
(Wir haben gerade bewiesen, dass ein Tag kann Bewegung. Der wirkliche Unterschied besteht darin, dass Tags keine sind erwartet zu bewegen, während Zweige sind; und Git verschiebt Tags nicht automatisch.2 Von Verzweigungen wird im Allgemeinen erwartet, dass sie sich in eine “Vorwärts”-Richtung bewegen, dh wenn master
verwendet, um auf Commit hinzuweisen C
und zeigt jetzt zu begehen D
verpflichten C
sollte normalerweise gefunden werden, indem man bei beginnt D
und rückwärts arbeiten. Jedes Mal, wenn Sie einen Zweig so verschieben, dass diese Regel verletzt wird, „schreiben Sie die Geschichte um“; siehe andere Artikel, wann dies in Ordnung ist und wann es den Leuten Probleme bereitet.)
Tags schieben
Wenn Sie verwenden git push
was Sie wirklich tun, ist, ein anderes Git-Repository anzuweisen, alle neuen Commits zu übernehmen, die Sie nicht haben, und dann einige Namen – normalerweise Branches und/oder Tags – festzulegen, um auf einige Commits zu verweisen (jeweils einen ) in der resultierenden Sammlung.3 Diese Namen (Zweige, Tags usw.) werden im Allgemeinen als „Referenzen“ bezeichnet, aber verwenden wir zunächst nur „Zweig“ und „Tag“.
Der Streit danach git push
benennt das Repository (im Allgemeinen über einen “entfernten” Namen, wie z origin
) zu pushen. Wenn Sie es weglassen, wird Git versuchen, einen herauszufinden, aber wenn Sie einen Branch- oder Tag-Namen hinzufügen möchten, müssen Sie ihn explizit einschließen, da davon ausgegangen wird, dass das erste Wort hier der Remote-Name ist. (Das ist, git push master
versucht zu verwenden master
als entfernter Name und nicht als Zweigname.)
Drücken alle Ihre Tags können Sie einfach hinzufügen --tags
zu deinem git push
Befehl:
git push --tags origin
A schieben Spezifisch tag, du kannst es benennen:
git push origin sometag
genauso wie Sie einen bestimmten Zweig pushen können:
git push origin master
(Tatsächlich ist dieses vierte Argument a Paar von Namen, wie master:master
oder sometag:sometag
aber in den meisten Fällen wird standardmäßig auf beiden Seiten derselbe Name verwendet.4)
Sie können den Namen weglassen origin
wenn Sie es nicht brauchen, um alle Argumente zu machen, z. git push --tags
ist das gleiche wie git push --tags origin
(vorausgesetzt, alle Ihre Pushes gehen an origin
ohnehin).
Etwas zusammensetzen
Um ein Tag in der Fernbedienung festzulegen, setzen Sie es zuerst lokal mit git tag name commit-identifier
. Verwenden Sie einen beliebigen Viewer, um sicherzustellen, dass er richtig eingestellt ist. Dann drücken Sie es mit beiden git push origin name
oder git push --tags
.
1Das master~2
Syntax weist git an, bei dem Commit zu beginnen, das via gefunden wurde master
, dann zwei Schritte zurück. Sie könnten stattdessen das rohe SHA-1 für Commit schreiben B
hier.
2Alte Versionen von git (vor 1.8.4) haben beim Pushen versehentlich Verzweigungsregeln auf Tags angewendet (auf der Remote-Seite, dh sie ließen ein Tag sich bewegen, wenn es ein “schneller Vorlauf” war).
3In einigen Fällen können Sie einen Namen auf ein “annotiertes Tag” verweisen, und es gibt nichts, was einen Namen daran hindert, auf ein “Baum”- oder “Blob”-Objekt zu verweisen, aber das ist keine normale Einrichtung.
4Eigentlich die Vorgabe dst refspec für einen Zweig ist kompliziert: es hängt von Ihrer ab push.default
Konfiguration, und ob es eine remote.repository.push
Einstellung und ob ein Upstream konfiguriert ist und so weiter. Für Tags sind die Regeln einfacher, da es so etwas wie einen “Upstream” nicht gibt.
Das Erstellen eines Tags ist einfach, hier ist ein Befehl dafür: –
Beispiel:
git tag -a v1.0 7cceb02 -m "Your message here"
Wo 7cceb02
ist der Anfangsteil der Commit-ID.
Sie können das Tag dann mit pushen git push origin v1.0
.
Du kannst tun git log
um alle Commit-IDs in Ihrem aktuellen Zweig anzuzeigen.
ein neues Tag (v1.73.0), das commit8 und commit9 enthalten sollte […] Ein Tag kann nicht auf mehrere Commits verweisen; einziger.
– jub0bs
9. September 2014 um 23:30 Uhr
Wenn Sie sagen, “push it to master”, meinen Sie “push it to origin” (oder eine andere Fernbedienung)?
– Chris
9. September 2014 um 23:57 Uhr
Ich meinte “zum Ursprung schieben”.
– aznmunkey
10. September 2014 um 0:19 Uhr