In Anbetracht der Tatsache, dass es mehrere Git-Befehle gibt, die in einem Bare-Repository keinen Sinn ergeben (da Bare-Repositorys keine Indizes verwenden und kein Arbeitsverzeichnis haben),
git reset --hard HEAD^
ist keine Lösung, um die letzte Änderung in einem solchen Repository aufzuheben.
Die Suche über das Internet, alles , was ich zu dem Thema finden konnte , ist dies , in dem ich vorgestellt habe drei Möglichkeiten , dies zu tun:
1. „den Referee manuell aktualisieren (die Sanitär beinhaltet)“;
2. " git push -f
aus einem nicht nackten Repository";
3. " git branch -f this $that
".
Welche Lösung halten Sie für angemessener oder welche anderen Möglichkeiten gibt es dafür? Leider ist die Dokumentation, die ich über Git Bare Repositories gefunden habe, ziemlich schlecht.
Antworten:
Sie können den
git update-ref
Befehl verwenden. Um das letzte Commit zu entfernen, verwenden Sie:Oder wenn Sie sich nicht in dem Zweig befinden, aus dem Sie das letzte Commit nicht entfernen können:
Sie können auch eine sha1 übergeben, wenn Sie möchten:
Siehe die Dokumentation des Befehls git-update-ref .
quelle
git update-ref <ref> <newvalue>
als richtigen Zweig angeben , z. B. "refs / Heads / Master" anstelle von HEAD. Ich hoffe, ich habe Ihre Frage nicht falsch verstanden.branch-name
Argument irreführend . Bei Verwendungupdate-ref
mit einem „Zweig“ müssen Sie unbedingt den vollständigen Referenznamen des Zweigs angeben (dhrefs/heads/
vor dem normalen kurzen Zweignamen ). Wenn Sie nur die Kurznamen verwenden , werden Sie am Ende der Erstellung / Aktualisierung$GIT_DIR/branch-name
statt$GIT_DIR/refs/heads/branch-name
. Das Vorhandensein von beidenbranch-name
undrefs/heads/branch-name
führt zu "refname ... ist mehrdeutig" Warnungen.Wenn Sie in einem Bare Repo Folgendes verwenden:
Dann stoßen Sie nicht auf die Probleme
--hard
und--mixed
Optionen, die Sie in einem Bare-Repo verwenden, da Sie nicht versuchen, etwas zu ändern, das das Bare-Repo nicht hat (dh Arbeitsbaum und Index). In Ihrem Fall möchten Sie speziell (aus dem Bare Repo) verwenden:So wechseln Sie die Zweige auf dem Remote-Repo :
Um den aktuell ausgewählten Zweig anzuzeigen, verwenden Sie:
https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html
quelle
git checkout other_branch
funktioniert aber nicht im nackten Zustand.Das
git push -f
sollte gut funktionieren:Wenn Sie dieses Bare-Repo klonen, entfernen Sie das letzte Commit (
git reset --hard HEAD^
wie Sie erwähnen, aber in einem lokalen nicht-Bare-Repo) und drücken Sie zurück (-f
):quelle
git reset --soft <sha1>
wie in meiner Antwort unten gezeigt, die empfohlene Vorgehensweise sein, um HEAD auf einem nackten Repo zu bewegen?reset --soft
sollte funktionieren, wenn es direkt auf einem nackten Repo gemacht wird. Ich vermute, dass dies selten gemacht wird, da ein nacktes Repo im Allgemeinen ein Upstream-Repo ist (dh ein Repo, an das Sie Daten senden), und die meiste Zeit haben Sie keinen direkten lokalen Zugriff darauf. Wenn Sie dies jedoch tun, ist dies sicherlich ein weiteres gutes Beispiel für diereset --soft
Verwendung von " " (wie in stackoverflow.com/questions/5203535/… ). Also +1 auf Ihre Antwort.Sie können auch die Git-Refspec-Notation verwenden und Folgendes tun:
git push -f origin +<commit you want to revert to>:<destination_head | branch_name>
Dies erzwingt die Aktualisierung des Zielzweigs (wie durch den Verweis angegeben) auf das Quell-Commit, wie durch das
+<object ref>
Teil angegeben.quelle