Ich habe ein Tag im Master-Zweig namens v0.1
erstellt:
git tag -a v0.1
Aber dann wurde mir klar, dass es noch einige Änderungen gab, die ich für Release 0.1 mit Master zusammenführen musste, also tat ich das. Aber jetzt ist mein v0.1
-Tag (um die Post-it-Note-Analogie aufzurufen) auf dem falschen Commit geklebt. Ich möchte, dass es beim letzten Commit für Master feststeckt, aber stattdessen beim zweitletzten Commit für Master.
Wie kann ich es auf das letzte Commit für Master verschieben?
Verwenden Sie die Option -f
für git tag
:
-f
--force
Replace an existing tag with the given name (instead of failing)
Wahrscheinlich möchten Sie -f
in Verbindung mit -a
verwenden, um ein kommentiertes Tag anstelle eines nicht kommentierten Tags zu erzwingen.
Löschen Sie das Tag auf einer Fernbedienung, bevor Sie Push drücken
git Push Origin :refs/tags/<tagname>
Ersetzen Sie das Tag, um auf das letzte Commit zu verweisen
git tag -fa <tagname>
Schieben Sie das Tag an das entfernte Origin
git Push Origin master --tags
Genauer gesagt, Sie müssen das Hinzufügen des Tags erzwingen, und drücken Sie dann die Option --tags und -f
git tag -f -a <tagname>
git Push -f --tags
Zusammenfassend, wenn Ihre Fernbedienung Origin
heißt und Sie am master
-Zweig arbeiten:
git tag -d <tagname>
git Push Origin :refs/tags/<tagname>
git tag <tagname> <commitId>
git Push Origin <tagname>
Sie können auch Zeile 4 in git Push Origin --tags
umtauschen, um alle Änderungen mit Tags aus Ihren lokalen Änderungen zu übernehmen.
Basierend auf @ stuart-golodetz, @ greg-hewgill, @eedeep, @ ben-hocking Antworten, Kommentaren unter ihren Antworten und NateS-Kommentaren unter meiner Antwort.
Löschen Sie es mit git tag -d <tagname>
und erstellen Sie es dann mit dem korrekten Commit neu.
Ich lasse hier nur eine andere Form dieses Befehls, die meinen Bedürfnissen entspricht.
Es gab ein Tag v0.0.1.2
, das ich verschieben wollte.
$ git tag -f v0.0.1.2 63eff6a
Updated tag 'v0.0.1.2' (was 8078562)
Und dann:
$ git Push --tags --force
Alias, um ein Tag in ein anderes Commit zu verschieben.
Um in Ihrem Beispiel mit dem Hash e2ea1639 zu verschieben, führen Sie Folgendes aus: git tagm v0.1 e2ea1639
.
Verwenden Sie für gepushte Tags git tagmp v0.1 e2ea1639
.
Beide Aliasnamen enthalten das ursprüngliche Datum und die ursprüngliche Nachricht. Wenn Sie git tag -d
verwenden, haben Sie Ihre ursprüngliche Nachricht verloren.
Speichern Sie sie in Ihrer .gitconfig
-Datei
# Return date of tag. (To use in another alias)
tag-date = "!git show $1 | awk '{ if ($1 == \"Date:\") { print substr($0, index($0,$3)) }}' | tail -2 | head -1 #"
# Show tag message
tag-message = "!git show $1 | awk -v capture=0 '{ if(capture) message=message\"\\n\"$0}; BEGIN {message=\"\"}; { if ($1 == \"Date:\" && length(message)==0 ) {capture=1}; if ($1 == \"commit\" ) {capture=0} }; END { print message }' | sed '$ d' | cat -s #"
### Move tag. Use: git tagm <tagname> <newcommit>
tagm = "!GIT_TAG_MESSAGE=$(git tag-message $1) && GIT_COMMITTER_DATE=$(git tag-date $1) && git tag-message $1 && git tag -d $1 && git tag -a $1 $2 -m \"$GIT_TAG_MESSAGE\" #"
### Move pushed tag. Use: git tagmp <tagname> <newcommit>
tagmp = "!git tagm $1 $2 && git Push --delete Origin $1 && git Push Origin $1 #"
Ich versuche bei der Verwendung von Git ein paar Dinge zu vermeiden.
Verwendung des Wissens über die internen Elemente, z. Refs/Tags. Ich versuche, ausschließlich die dokumentierten Git-Befehle zu verwenden und Dinge zu vermeiden, die Kenntnisse über den internen Inhalt des .git-Verzeichnisses erfordern. (Das heißt, ich behandle Git als Git-Benutzer und nicht als Git-Entwickler.)
Vermeiden Sie die Anwendung von Gewalt, wenn dies nicht erforderlich ist.
Also hier meine gewaltfreie Lösung zum Ändern eines Tags, sowohl lokal als auch remote, ohne Kenntnis der Git-Interna.
Ich verwende es, wenn ein Software-Fix letztendlich ein Problem hat und aktualisiert/erneut veröffentlicht werden muss.
git tag -d fix123; # delete the old local tag
git Push github :fix123 # delete the old remote tag (use for each remote)
git tag fix123 790a621265 # create a new local tag
git Push github fix123 # Push new tag to remote (use for each remote)
github
ist ein entfernter Beispielname, fix123
ist ein Beispiel-Tag-Name und 790a621265
ein Beispiel-Commit.
Ein anderer Weg:
Tag in Remote-Repo verschieben (Ersetzen Sie HEAD ggf. durch einen anderen.)
$ git Push --force Origin HEAD:refs/tags/v0.0.1.2
Änderungen zurückholen.
$ git fetch --tags
Wenn Sie ein mit Anmerkungen versehenes Tag verschieben möchten, ändern Sie nur das Ziel-Commit, behalten jedoch die Anmerkungsnachricht und andere Metadaten bei.
moveTag() {
local tagName=$1
# Support passing branch/tag names (not just full commit hashes)
local newTarget=$(git rev-parse $2^{commit})
git cat-file -p refs/tags/$tagName |
sed "1 s/^object .*$/object $newTarget/g" |
git hash-object -w --stdin -t tag |
xargs -I {} git update-ref refs/tags/$tagName {}
}
usage: moveTag <Tag zum Verschieben> <Ziel>
Die obige Funktion wurde durch Referenzierung von teerapap/git-move-annotated-tag.sh entwickelt.