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)?
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
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.
git branch -f branch-name new-tip-commit
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
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 :)
In gitk --all
:
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.
Die empfohlene Lösung git branch -f branch-pointer-to-move new-pointer
in TortoiseGit :
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