Um den Verzweigungszeiger eines ausgecheckten Zweigs zu verschieben, kann der git reset --hard
Befehl verwendet werden. Aber wie verschiebt man den Verzweigungszeiger eines nicht ausgecheckten Zweigs, um auf ein anderes Commit zu zeigen (wobei alle anderen Dinge wie der verfolgte Remote-Zweig beibehalten werden)?
git
git-branch
Mot
quelle
quelle
git branch <branch-name> <SHA-1-of-the-commit>
den alten Zweig verwenden und sichern?Antworten:
Sie können dies für beliebige Refs tun. So verschieben Sie einen Verzweigungszeiger:
Die allgemeine Form:
Sie können Nissen über die Reflog-Nachricht auswählen, wenn Sie möchten - ich glaube, die
branch -f
unterscheidet sich von derreset --hard
einen, und dies ist nicht genau eine davon.quelle
git branch -f
. Um genau zu sein, scheint diese Methode zu sein: (A) schwerer zu verwenden (B) schwerer zu merken und (C) gefährlicherquelle
git update-ref -m "reset: Reset <branch> to <new commit>" <branch> <commit>
. (Sie können Nissen über die Reflog-Nachricht auswählen, wenn Sie möchten - ich glaube, diebranch -f
eine unterscheidet sich von derreset --hard
einen, und dies ist nicht genau eine von beiden.)git help branch
sagt "-f, --force Reset <branchname> auf <startpoint>, wenn <branchname> bereits existiert. Ohne -f weigert sich der Zweig git, einen vorhandenen Zweig zu ändern."git branch -f master <hash>
und es sagt mirfatal: Cannot force update the current branch.
Ummmm, ich muss was jetzt tun, einen anderen zufälligen Zweig überprüfen, bevor ich diesen Befehl verwenden darf?HEAD
zeigt darauf).Sie können auch
git reset --hard
eine Festschreibungsreferenz übergeben.Zum Beispiel:
Ich finde, dass ich so etwas nur selten mache:
Angenommen, diese Geschichte
quelle
git update-ref
oben beschriebenen Schritte auszuführen .git reset --hard ...
dass Sie es hier nicht wiederholen müssen! :-(Um die Diskussion zu bereichern und den
myBranch
Zweig auf Ihr aktuelles Commit zu verschieben, lassen Sie einfach das zweite Argument nach-f
Beispiel:
git branch -f myBranch
Ich mache das normalerweise, wenn ich mich
rebase
in einem Zustand mit losgelöstem KOPF befinde :)quelle
In
gitk --all
:Beachten Sie, dass beim erneuten Erstellen statt Ändern des vorhandenen Zweigs Informationen zum Tracking-Zweig verloren gehen . (Dies ist im Allgemeinen kein Problem für einfache Anwendungsfälle, in denen es nur eine Fernbedienung gibt und Ihre lokale Niederlassung denselben Namen wie die entsprechende Niederlassung in der Fernbedienung hat. Weitere Informationen finden Sie in den Kommentaren. Vielen Dank an @mbdevpl, dass Sie auf diesen Nachteil hingewiesen haben.)
Es wäre cool, wenn
gitk
es eine Funktion gäbe, bei der das Dialogfeld drei Optionen hätte: Überschreiben, Vorhandene ändern oder Abbrechen.Selbst wenn Sie normalerweise ein Kommandozeilen-Junkie wie ich sind
git gui
undgitk
sehr gut für die Teilmenge der Git-Nutzung ausgelegt sind, die sie zulassen. Ich empfehle dringend, sie für das zu verwenden, was sie können (dh selektiv Staging von Hunks in / aus dem Index in Git-GUI und auch nur Festschreiben) (Strg-s, um eine Abmeldung hinzuzufügen: Zeile, Strg-Eingabe zum Festschreiben .)gitk
ist ideal, um ein paar Zweige im Auge zu behalten, während Sie Ihre Änderungen in eine nette Patch-Serie sortieren, um sie im Upstream einzureichen, oder alles andere, wo Sie mit mehreren Zweigen den Überblick behalten müssen, in dem Sie sich gerade befinden.Ich habe noch nicht einmal einen grafischen Dateibrowser geöffnet, aber ich liebe gitk / git gui.
quelle
git status
Ausgabe ist betroffen. Zusätzlich kann in einigen Fällengit fetch
undgit push
wird nicht funktionieren remote explizit ohne Angabe , wenn Sie nicht den Tracking - Zweig gesetzt haben. Ich weiß nicht über alle Fälle Bescheid, aber für mich lautet die allgemeine Faustregel, dass es aus Gründen der Bequemlichkeit und Schnelligkeit der Arbeit besser ist, die Nachverfolgungszweige in der richtigen Reihenfolge zu haben.Die empfohlene Lösung
git branch -f branch-pointer-to-move new-pointer
in TortoiseGit :quelle
Ehrlich gesagt bin ich überrascht, wie niemand über den
git push
Befehl nachgedacht hat :Der Punkt (.) Verweist auf das lokale Repository, und Sie benötigen möglicherweise die Option -f, da sich das Ziel möglicherweise "hinter seinem Remote-Gegenstück" befindet .
Obwohl dieser Befehl zum Speichern Ihrer Änderungen auf Ihrem Server verwendet wird, ist das Ergebnis genau das gleiche, als würde der Remote-Zweig (
<branch>
) auf denselben Commit wie der lokale Zweig (<destination>
) verschoben.quelle
-f
lokale Probleme zu vermeiden. Zum Beispielgit fetch origin && git push . origin/develop:develop
ist eine Fail-Fast-Version vongit checkout develop && git pull --ff-only
Öffnen Sie die Datei
.git/refs/heads/<your_branch_name>
und ändern Sie den dort gespeicherten Hash in den, in den Sie den Kopf Ihres Zweigs verschieben möchten. Bearbeiten und speichern Sie die Datei einfach mit einem beliebigen Texteditor. Stellen Sie einfach sicher, dass der zu ändernde Zweig nicht der aktuell aktive ist.Haftungsausschluss: Wahrscheinlich kein ratsamer Weg, dies zu tun, aber die Arbeit erledigt.
quelle
Wenn das Commit, auf das Sie zeigen möchten, vor dem aktuellen Zweig liegt (was der Fall sein sollte, es sei denn, Sie möchten die letzten Commits des aktuellen Zweigs rückgängig machen), können Sie einfach Folgendes tun:
quelle
git push . <commit>:<branch>
was bereits vorgeschlagen wurde.