HOWTO · Git
Wie man den Git-Branch-Zeiger auf einen anderen Commit verschiebt
Verschieben Sie einen ausgecheckten Git-Branch mit git reset oder einen anderen, nicht ausgecheckten Branch mit git branch -f oder git update-ref. Erfahren Sie, was jeder Befehl ändert und wie Sie einen Ziel-Commit wählen.
Auf dieser Seite
Um einen Git-Branch-Zeiger auf einen gewählten Commit zu verschieben, verwenden Sie git reset, wenn der Branch ausgecheckt ist. Um einen anderen Branch zu verschieben, während Sie auf Ihrem aktuellen Branch bleiben, verwenden Sie git branch -f oder git update-ref. git branch -f weigert sich, einen Branch zu verschieben, der in irgendeinem Worktree ausgecheckt ist. git update-ref aktualisiert die Referenz direkt, ohne den Index oder den Arbeitsbaum zu aktualisieren; bei einem ausgecheckten Branch kann dies dazu führen, dass diese Dateien auf dem vorherigen Commit bleiben, während HEAD auf den neuen zeigt. Ersetzen Sie <target-commit> unten durch einen Commit-Hash, ein Tag oder einen anderen Revisionsausdruck, der den gewünschten Commit bezeichnet.
Den ausgecheckten Branch mit git reset auf einen Commit verschieben
git reset verschiebt den aktuellen Branch auf den ausgewählten Commit. Wählen Sie den Modus danach, was mit dem Index und dem Arbeitsbaum geschehen soll. Ein Soft-Reset verschiebt den Branch und lässt beides unverändert. Der Standardmodus Mixed verschiebt den Branch und aktualisiert den Index, während die Dateien im Arbeitsbaum unverändert bleiben. Ein Hard-Reset verschiebt den Branch und lässt den Index und die nachverfolgten Arbeitsbaumdateien mit dem Ziel-Commit übereinstimmen.
Sichern Sie vor der Verwendung von git reset --hard alle nachverfolgten Änderungen, die Sie benötigen: Dieser Befehl kann nicht committete Änderungen an nachverfolgten Dateien verwerfen. Nicht nachverfolgte Dateien bleiben in der Regel unberührt, aber Git kann sie entfernen oder überschreiben, wenn sie das Schreiben nachverfolgter Pfade aus dem Ziel-Commit behindern. Das folgende eigenständige Beispiel erstellt ein temporäres Repository, nimmt zwei Commits auf main vor und verschiebt den ausgecheckten Branch zurück auf den ersten Commit:
set -eu
repo_dir=$(mktemp -d)
trap 'rm -rf "$repo_dir"' EXIT
cd "$repo_dir"
git init -q -b main
git config user.name Example
git config user.email example@example.com
printf 'first version\n' > note.txt
git add note.txt
git commit -q -m first
first_commit=$(git rev-parse HEAD)
printf 'second version\n' > note.txt
git commit -q -am second
git reset --hard "$first_commit" >/dev/null
printf 'Branch: %s\n' "$(git branch --show-current)"
printf 'Commit: %s\n' "$(git log -1 --format=%s)"
Branch: main
Commit: first
Verwenden Sie eine Revision wie HEAD~1 oder einen Commit-Hash als Ziel, wenn Sie den Befehl in Ihrem eigenen Repository anwenden. Wenn Sie lokale nachverfolgte Änderungen behalten müssen, erwägen Sie git reset --soft <target-commit> oder git reset --mixed <target-commit> und überprüfen Sie den resultierenden Index und Arbeitsbaum vor dem Committen. Ein Reset ändert nur den aktuellen Branch; es verschiebt keinen anderen Branch-Namen direkt.
Einen anderen, nicht ausgecheckten Branch auf einen Commit verschieben
Um einen anderen Branch als den ausgecheckten zu verschieben, halten Sie den Ziel-Branch im aktuellen Worktree nicht ausgecheckt. git branch -f verschiebt die Referenz des benannten Branchs zwangsweise auf den ausgewählten Commit. Zum Beispiel verschiebt git branch -f feature <target-commit> den Branch feature auf diesen Commit. Überprüfen Sie Branch-Name und Ziel, bevor Sie -f verwenden, da es die aktuelle Spitze des Branchs bewusst ersetzt. Es weigert sich, einen in einem Worktree ausgecheckten Branch zu verschieben.
Sie können die Branch-Referenz auch direkt mit git update-ref aktualisieren. Verwenden Sie den vollständigen Ref-Namen und eine Revision, die zum Ziel-Commit auflöst: git update-ref -m "move feature to target" refs/heads/feature <target-commit>. Die Option -m zeichnet die angegebene Nachricht im Reflog auf, was später hilft zu erklären, warum sich die Referenz verschoben hat. Bei dieser Aufgabe ist feature ein anderer, nicht ausgecheckter Branch, sodass jeder der beiden Befehle ihn verschiebt, während Ihr aktueller Branch ausgecheckt bleibt. Anders als git branch -f weigert sich git update-ref bei einem ausgecheckten Branch nicht: Es ändert die Referenz, lässt den Index und die Arbeitsbaumdateien aber unberührt. Wenn Sie den aktuellen Branch auf diese Weise aktualisieren, löst HEAD zum neuen Commit auf, während Index und Dateien noch den alten widerspiegeln, sodass sie relativ zum neuen Commit als geändert erscheinen können.
git checkout -b feature <target-commit> erstellt einen neuen Branch und checkt ihn aus; es verschiebt keinen existierenden Branch feature. Das direkte Auschecken eines Commits löst HEAD ab. Rebase hat einen anderen Zweck: Es spielt Commits auf eine neue Basis erneut ab und kann neue Commit-IDs erzeugen, ist also kein direkter Weg, einen existierenden Branch auf einen beliebigen Commit zu richten. Wählen Sie Reset für den ausgecheckten Branch oder einen der obigen Referenzbefehle für einen anderen, nicht ausgecheckten Branch.