Wie erstelle ich ein Tag mit bestimmten Commits und pushe es an den Ursprung?

Lesezeit: 8 Minuten

Benutzer-Avatar
aznmunkey

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

  • 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


Benutzer-Avatar
Torek

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, Bund 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 Aund 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 Dgit 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 sometagnachdem:

$ 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 Dverpflichten 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 pushwas 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:sometagaber 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 originohnehin).

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.

  • Gibt es eine Konvention in Bezug auf den Zweig, auf den ein Tag zeigt? Kann ich Tags haben, die auf verschiedene Zweige zeigen, oder nur auf master?

    – Amy Pellegrini

    28. Februar 2019 um 13:43 Uhr

  • @AmyPellegrini: Tags nicht zeigen auf Äste. Sobald das Tag erstellt ist, sind alle Verzweigungen irrelevant. Schlagwörter weisen darauf hin begeht. Siehe die aktualisierte Zeichnung in der Antwort.

    – Torek

    28. Februar 2019 um 16:40 Uhr

  • @torek Ja, das verstehe ich, ich frage mich nur, wie Sie die Tags konsistent organisieren, um automatisierte Freigaben/Bereitstellungen zu ermöglichen. Ich hätte gedacht, dass Releases von einem bestimmten Zweig ausgelöst werden und nicht von einem Tag, aber Tags scheinen bequemer zu sein. Grundsätzlich möchte ich, dass jedes Tag einer bestimmten Version entspricht und jede Version standardmäßig automatisch für eine bestimmte Umgebung freigegeben wird.

    – Amy Pellegrini

    28. Februar 2019 um 16:49 Uhr


  • @AmyPellegrini Nun, das hängt von Ihrem Veröffentlichungsprozess ab. Es gibt zu viele, um einfach willkürlich zu sagen: “Prozess X verwenden”. Eines, das mir jedoch etwa 2015 oder so gefiel, war: Wir haben einen Zweig mit dem Namen erstellt release/1.0dann ein Schild genannt release/1.0.rc0. Beheben Sie einige Fehler und markieren Sie sie release/1.0.rc1, und so weiter, bis wir die eigentliche Veröffentlichung hatten. Dann würden wir löschen das release/1.0 Verzweigung, weil Sie nicht darauf entwickeln sollten: Stattdessen gibt es eine neue Verzweigung release/1.1 zeigt auf den Commit, der als markiert ist release-1.0.

    – Torek

    28. Februar 2019 um 16:58 Uhr

  • Wir haben ein paar Iterationen durchlaufen, um die Namen ein wenig zu ändern, und ich glaube, wir haben am Ende verwendet rc/x.y als Verzweigungs- und/oder Tag-Namen, statt release/bis die Veröffentlichungen stattfanden, und nannte die endgültigen Veröffentlichungs-Tags release/x.y. Auf diese Weise wurden die eigentlichen Veröffentlichungen abseits der Zweige gruppiert. Aber diesem speziellen Startup-Unternehmen gingen die Mittel aus, sodass es sowieso nie über 0.x hinauskam. 🙂

    – Torek

    28. Februar 2019 um 16:59 Uhr


Hier ein konkretes Beispiel:

git add .
git commit -m "some description"
git tag v0.1.9 # or any other text
git push origin master # push the commit
git push --tags origin # push the tags

  • git push --tags origin hat alle lokalen Tags gepusht. Können wir diejenige angeben, die wir pushen möchten?

    – Mohammed Faisal

    7. September 2018 um 14:25 Uhr

Benutzer-Avatar
YASH GARUDKAR

Das ist, was du willst

git add .
git commit -m "commit10"
git tag -a v1.73.0 -m "Latest release (or some message)"
git push origin master
git push origin v1.73.

Sobald Sie das Tag erstellt haben (wie es aussieht), führen Sie es einfach aus

git push --tags origin

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.

1215940cookie-checkWie erstelle ich ein Tag mit bestimmten Commits und pushe es an den Ursprung?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy