Ich begebe mich zum ersten Mal in einem Git-Repository. Ich bereue dann das Commit und möchte es zurücksetzen. ich versuche
# git reset --hard HEAD~1
Ich bekomme diese Nachricht:
fatal: ambiguous argument 'HEAD~1': unknown revision or path not in the working tree.
Dieses Commit ist das erste Commit des Repositorys. Irgendeine Idee, wie man das anfängliche Commit von git rückgängig macht?
git status
und zu meiner Überraschung sagte gitfatal: Not a git repository (or any parent up to mount point ...)
!.gitignore
.git add .
,git commit -m "initial commit"
,git update-ref -D HEAD
, Erstellen.gitignore
, bemerken , dass git noch die Dateien , sieht es früher hinzugefügt, ignoriert sollte. Mit anderen Wortengit update-ref -d HEAD
, ich bin vor dem ersten Commit nicht in den Staat zurückgekehrt.git reset --hard HEAD~1
würde hinzugefügte Dateien für alle anderen Commits entfernen. Die Frage ist natürlich, wie man in allen anderen Fällen zum gleichen Zustand wie dieser Befehl gelangt. Sehen Sie sich diese Liste an, um zu beweisen, dass Ihre Lösung nicht funktioniert. Gist.github.com/greggman/522fa69a21d6cfb3ff0bgit update-ref -d HEAD
nicht zurückkehren eigentlich der erste begehen, sondern hält alle zuvor Änderungen verpflichtet in den Index aufgenommen. Wenn Sie diese Änderungen auch entfernen möchten, führen Sie einfach Folgendes ausgit reset --hard
. Auch wenn diese Antwort unvollständig ist, ist sie in der Tat die beste. Vermeiden Sie sie daherrm -fr .git
(es sei denn, Sie wissen, was Sie tun).Sie können den HEAD löschen und Ihr Repository in einem neuen Zustand wiederherstellen, in dem Sie ein neues anfängliches Commit erstellen können:
Wenn Sie nach dem Erstellen eines neuen Commits bereits auf Remote geschoben haben, müssen Sie es auf die Remote erzwingen, um das vorherige anfängliche Commit zu überschreiben:
quelle
Diese Frage wurde aus diesem Blog-Beitrag verlinkt und eine alternative Lösung für die neueren Versionen von Git vorgeschlagen:
Diese Lösung setzt Folgendes voraus:
master
Filialeold_master
daher kann ich diesen Namen verwendenDer vorhandene Zweig wird in umbenannt
old_master
und ein neuer, verwaister Zweig erstelltmaster
(wie er für neue Repositorys erstellt wurde). Danach können Sie ihn frei löschenold_master
... oder nicht. Wie du willst.Hinweis: Durch das Verschieben oder Kopieren eines Git-Zweigs wird dessen Reflog (siehe diesen Code ) beibehalten, während das Löschen und anschließende Erstellen eines neuen Zweigs ihn zerstört. Da Sie ohne Verlauf zum ursprünglichen Zustand zurückkehren möchten, möchten Sie wahrscheinlich den Zweig löschen, andere möchten jedoch möglicherweise diese kleine Notiz berücksichtigen.
quelle
Unter den in der Frage festgelegten Bedingungen:
git init
,git add
Operationen,git commit
,Wenn diese Voraussetzungen erfüllt sind, ist der einfachste Weg, das anfängliche Commit rückgängig zu machen, folgende:
aus dem Verzeichnis, in dem Sie getan haben
git init
. Sie können dann das wiederholengit init
, um das Git-Repository neu zu erstellen, und die Ergänzungen mit allen Änderungen wiederholen, die sinnvoll sind, die Sie beim ersten Mal nicht vorgenommen haben, und das anfängliche Festschreiben wiederholen.ACHTUNG! Dadurch wird das Git-Repository-Verzeichnis entfernt.
Das Git-Repository-Verzeichnis wird dauerhaft und unwiederbringlich entfernt, es sei denn, Sie haben irgendwo Backups. Unter den Voraussetzungen haben Sie nichts, was Sie im Repository behalten möchten, damit Sie nichts verlieren. Alle von Ihnen hinzugefügten Dateien sind weiterhin in den Arbeitsverzeichnissen verfügbar, vorausgesetzt, Sie haben sie noch nicht geändert und nicht gelöscht usw. Dies ist jedoch nur dann sicher, wenn Sie überhaupt nichts anderes in Ihrem Repository haben. Unter den in der Frage "Erstes Repository festschreiben - dann bereuen" beschriebenen Umständen ist es sicher. Sehr oft ist es jedoch nicht sicher.
Dies ist auch sicher, um ein unerwünschtes geklontes Repository zu entfernen. Das Repository, aus dem es geklont wurde, wird nicht beschädigt. Es wirft alles weg, was Sie in Ihrer Kopie getan haben, wirkt sich aber ansonsten nicht auf das ursprüngliche Repository aus.
Seien Sie vorsichtig, aber es ist sicher und effektiv, wenn die Voraussetzungen erfüllt sind.
Wenn Sie mit Ihrem Repository andere Dinge getan haben, die beibehalten werden sollen, ist dies nicht die geeignete Technik - Ihr Repository erfüllt nicht mehr die Voraussetzungen dafür.
quelle
Das kannst du nicht. Damit:
quelle
git reset --hard
, warum sollte er es dann tungit add -A
?Ich werde das einwerfen, was am Ende für mich funktioniert hat. Ich musste das anfängliche Commit in einem Repository entfernen, da unter Quarantäne gestellte Daten falsch platziert wurden und das Commit bereits verschoben wurde.
Stellen Sie sicher, dass Sie sich derzeit in der richtigen Filiale befinden.
git checkout master
git update-ref -d HEAD
git commit -m "Initial commit
git push -u origin master
Dies konnte das Problem beheben.
Wichtig
Dies war in einem internen Repository, das nicht öffentlich zugänglich war. Wenn Ihr Repository öffentlich zugänglich war, gehen Sie bitte davon aus, dass alles, was Sie zurücksetzen müssen, bereits von einer anderen Person heruntergezogen wurde.
quelle
Ich frage mich, warum "Änderung" nicht vorgeschlagen wird und von @damkrat durchgestrichen wurde, da Änderung für mich genau der richtige Weg ist, um das zugrunde liegende Problem der Behebung des falschen Commits am effizientesten zu lösen, da es keinen Zweck gibt, keine Initiale zu haben verpflichten. Wie einige betont haben, sollten Sie "öffentliche" Zweige wie master nur ändern, wenn niemand Ihr Repo geklont hat ...
quelle
Git zurücksetzen - Änderungen vornehmen, dann tunoder
und dann
--force schreibt das Commit, auf das Sie im ersten Schritt zurückgesetzt wurden, neu.Tun Sie dies nicht, da Sie im Begriff sind, gegen die gesamte Idee von VCS-Systemen und insbesondere von Git zu verstoßen. Die einzig gute Methode besteht darin, einen neuen Zweig zu erstellen und nicht benötigte Zweige zu löschen. Siehe
git help branch
für Informationen.quelle
Sie müssen lediglich das Commit zurücksetzen.
Dann schieben Sie es
quelle