it-swarm.com.de

Bewegen Sie den Zweigzeiger auf ein anderes Commit ohne Checkout

Um den Verzweigungszeiger eines ausgecheckten Zweigs zu verschieben, können Sie den Befehl git reset --hard verwenden. Aber wie verschieben Sie den Verzweigungszeiger eines nicht ausgecheckten Zweigs, um auf ein anderes Commit zu verweisen (wobei alle anderen Elemente wie verfolgter entfernter Zweig beibehalten werden)?

612
Mot

N.B. Wenn Sie einfach einen branch in ein anderes Commit verschieben möchten, das Der einfachste Weg ist

git branch -f branch-name new-tip-commit

wie ausführlich in der Antwort von Chris Johnsen .

Sie können es für beliebige Referenzen tun. So verschieben Sie einen Zweigzeiger: 

git update-ref -m "reset: Reset <branch> to <new commit>" refs/heads/<branch> <commit>

Die allgemeine Form:

git update-ref -m "reset: Reset <branch> to <new commit>" <ref> <commit>

Wenn Sie möchten, können Sie Nits zur Reflog-Nachricht auswählen. Ich glaube, der branch -f unterscheidet sich von dem reset --hard, und dies ist nicht genau einer der beiden.

437
Adam A
git branch -f branch-name new-tip-commit
828
Chris Johnsen

Sie können auch git reset --hard eine Commit-Referenz übergeben.

Zum Beispiel:

git checkout branch-name
git reset --hard new-tip-commit

Ich finde, ich mache so etwas häufig:

Angenommen, diese Geschichte

$ git log --decorate --oneline --graph
* 3daed46 (HEAD, master) New thing I shouldn't have committed to master
* a0d9687 This is the commit that I actually want to be master

# Backup my latest commit to a wip branch
$ git branch wip_doing_stuff

# Ditch that commit on this branch
$ git reset --hard HEAD^

# Now my changes are in a new branch
$ git log --decorate --oneline --graph
* 3daed46 (wip_doing_stuff) New thing I shouldn't have committed to master
* a0d9687 (HEAD, master) This is the commit that I actually want to be master
122
Amiel Martin

Um die Diskussion zu bereichern, wenn Sie myBranch in Ihr current commit verschieben möchten, lassen Sie das zweite Argument nach -f aus.

Beispiel:

git branch -f myBranch


Im Allgemeinen mache ich dies, wenn ich rebase in einem Zustand mit freistehendem HEAD bin :)

29
Matheus Felipe

In gitk --all:

  • klicken Sie mit der rechten Maustaste auf das gewünschte Commit
  • -> neuen Zweig erstellen
  • geben Sie den Namen einer vorhandenen Niederlassung ein
  • drücken Sie die Eingabetaste im Dialogfeld, das bestätigt, um den alten Zweig dieses Namens zu ersetzen.

Beachten Sie, dass das erneute Erstellen anstelle des vorhandenen Zweigs die Informationen zum Tracking-Zweig verliert. (Dies ist im Allgemeinen kein Problem für einfache Anwendungsfälle, bei denen es nur eine Remote gibt und Ihr lokaler Zweig den gleichen Namen hat wie der entsprechende Zweig in der Remote. Weitere Informationen finden Sie in den Kommentaren. Dank @mbdevpl für den Hinweis auf diesen Nachteil.)

Es wäre schön, wenn gitk eine Funktion hätte, bei der das Dialogfeld 3 Optionen hatte: Überschreiben, Ändern oder Abbrechen.


Selbst wenn Sie normalerweise ein Befehlszeilen-Junkie wie ich sind, sind git gui und gitk für die Teilmenge der git-Nutzung, die sie zulassen, recht gut geeignet. Ich empfehle dringend, sie für das einzusetzen, wozu sie gut sind (dh selektive Unterteilung in/aus dem Index in git gui und auch nur das Festschreiben. (Ctrl-s zum Hinzufügen einer signierten Linie: ctrl-enter zum Commit) .)

gitk eignet sich hervorragend für die Verfolgung einiger Äste, während Sie Ihre Änderungen in eine Nice-Patch-Reihe einteilen, um den Upstream einzureichen, oder etwas anderes, wo Sie mit mehreren Zweigen nachverfolgen müssen, wo Sie sich gerade befinden.

Ich habe nicht einmal einen grafischen Dateibrowser geöffnet, aber ich liebe gitk/git gui.

11
Peter Cordes

Die empfohlene Lösung git branch -f branch-pointer-to-move new-pointer in TortoiseGit :

  • "Git Show log"
  • Aktivieren Sie "Alle Niederlassungen".
  • In der Zeile, in die der Zweigzeiger (neuer Zeiger) verschoben werden soll: .__
    • Klicken Sie mit der rechten Maustaste auf "Zweig in dieser Version erstellen".
    • Geben Sie neben "Zweig" den Namen des Zweigs ein, den Sie verschieben möchten (
    • Überprüfen Sie unter "Base On", ob der neue Zeiger korrekt ist
    • Überprüfen Sie "Force"
    • Ok

 enter image description here

 enter image description here

5
ax.

Ehrlich gesagt bin ich überrascht, wie niemand über den git Push-Befehl nachgedacht hat:

git Push -f . <destination>:<branch>

Der Punkt (.) Verweist auf das lokale Repository, und Sie benötigen möglicherweise die Option -f, da das Ziel "hinter seinem entfernten Gegenstück" liegen könnte.

Obwohl dieser Befehl zum Speichern Ihrer Änderungen auf Ihrem Server verwendet wird, ist das Ergebnis genau das gleiche, als würde der entfernte Zweig (<branch>) auf dieselbe Festschreibung wie der lokale Zweig (<destination>) verschoben