wake-up-neo.com

Wie kann ich ein Tag in einem Git-Zweig in ein anderes Commit verschieben?

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?

677
eedeep

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.

Beispiel

  1. Löschen Sie das Tag auf einer Fernbedienung, bevor Sie Push drücken

    git Push Origin :refs/tags/<tagname>
    
  2. Ersetzen Sie das Tag, um auf das letzte Commit zu verweisen

    git tag -fa <tagname>
    
  3. Schieben Sie das Tag an das entfernte Origin

    git Push Origin master --tags
    
957
Greg Hewgill

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
225
Daniel

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>
  • Zeile 1 entfernt das Tag in der lokalen Umgebung.
  • Zeile 2 entfernt das Tag in der Remote-Umgebung.
  • Zeile 3 fügt das Tag einem anderen Commit hinzu
  • Zeile 4 drückt die Änderung zur Fernbedienung

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.

113
Vive

Löschen Sie es mit git tag -d <tagname> und erstellen Sie es dann mit dem korrekten Commit neu.

82
Stuart Golodetz

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
8
Nakilon

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 #"
6

Ich versuche bei der Verwendung von Git ein paar Dinge zu vermeiden.

  1. 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.)

  2. 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.

5
user3070485

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.

0
vossad01