Wie kann man das anfängliche Git-Commit zurücksetzen?

357

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?

Chau Chee Yang
quelle

Antworten:

565

Sie müssen nur den Zweig löschen, in dem Sie sich befinden. Sie können nicht verwenden, git branch -Dda dies eine Sicherheitsüberprüfung gegen dies hat. Sie können update-refdies verwenden.

git update-ref -d HEAD

Sie nicht verwenden , rm -rf .gitda dies so oder etwas vollständig Ihr gesamtes Repository mit allen anderen Branchen sowie der Zweig wischen , dass Sie zurücksetzen wollen.

CB Bailey
quelle
1
Versuchte dies während einer Rebase - wollte das allererste Commit aufteilen - dann tat es git statusund zu meiner Überraschung sagte git fatal: Not a git repository (or any parent up to mount point ...)!
Matt Fenwick
1
Das hat bei mir nicht funktioniert. Erstellen Sie Dateien, einschließlich einiger, die ignoriert werden sollten, aber nein .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 Worten git update-ref -d HEAD, ich bin vor dem ersten Commit nicht in den Staat zurückgekehrt.
Gman
1
Aber das ist der Punkt der ursprünglichen Frage. Zurück zum Status kurz vor dem ersten Festschreiben.
Gman
2
git reset --hard HEAD~1wü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/522fa69a21d6cfb3ff0b
gman
11
Falls jemand wird von gman Kommentare verwirrt: git 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 aus git reset --hard. Auch wenn diese Antwort unvollständig ist, ist sie in der Tat die beste. Vermeiden Sie sie daher rm -fr .git(es sei denn, Sie wissen, was Sie tun).
Rsenna
62

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:

git update-ref -d HEAD

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:

git push --force origin
frazras
quelle
1
Bemerkenswert ... dies ist der richtige Befehl, aber er löscht nicht den HEAD ... er löscht den Ref (unter .git \ refs \ Heads), den die .git \ HEAD-Datei ausgecheckt hat. Nachdem Sie diesen Befehl ausgeführt haben, finden Sie immer noch die HEAD-Datei, die auf die von Ihnen gelöschte Datei refs / Heads / <Name> verweist. Wenn Sie jedoch diesem Pfad folgen, werden Sie feststellen, dass die Refs für Köpfe nicht mehr vorhanden sind.
DanK
15

Diese Frage wurde aus diesem Blog-Beitrag verlinkt und eine alternative Lösung für die neueren Versionen von Git vorgeschlagen:

git branch -m master old_master
git checkout --orphan master
git branch -D old_master

Diese Lösung setzt Folgendes voraus:

  1. Sie haben nur ein Commit in Ihrer masterFiliale
  2. Es gibt keinen Zweig namens, old_masterdaher kann ich diesen Namen verwenden

Der vorhandene Zweig wird in umbenannt old_masterund ein neuer, verwaister Zweig erstellt master (wie er für neue Repositorys erstellt wurde). Danach können Sie ihn frei löschen old_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.

unsinnig
quelle
11

Unter den in der Frage festgelegten Bedingungen:

  • Das Commit ist das erste Commit im Repository.
  • Das heißt, es wurden nur sehr wenige Befehle ausgeführt:
    • a git init,
    • vermutlich einige git addOperationen,
    • und a git commit,
    • und das ist alles!

Wenn diese Voraussetzungen erfüllt sind, ist der einfachste Weg, das anfängliche Commit rückgängig zu machen, folgende:

rm -fr .git

aus dem Verzeichnis, in dem Sie getan haben git init. Sie können dann das wiederholen git 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.

Jonathan Leffler
quelle
9
Das ist ein schlechter Rat. Was ist, wenn das Repo noch andere Dinge enthält, die Sie nicht verlieren möchten?
Matt Fenwick
5
Dann wäre es nicht das anfängliche Commit, oder? Es gibt nur ein erstes Commit.
Jonathan Leffler
9
"Dann wäre es nicht das anfängliche Commit" - eigentlich ja. Sie vernachlässigen den sehr häufigen Fall mehrerer Zweige. Siehe Charles 'Antwort.
Matt Fenwick
2
Hilfreich sollte jedoch eine Warnung sein.
Simon Bengtsson
5
Das funktioniert tatsächlich. Die akzeptierte Antwort nicht. Siehe Kommentar
gman
3

Das kannst du nicht. Damit:

rm -rf .git/
git init
git add -A
git commit -m 'Your new commit message'
ma11hew28
quelle
1
Er versuchte zu sagen git reset --hard, warum sollte er es dann tun git add -A?
Aristoteles Pagaltzis
3

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.

Edward
quelle
1

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 ...

git add <your different stuff>
git commit --amend --author="author name <[email protected]>"-m "new message"
Richard
quelle
--autor ist nur erforderlich, wenn jemand die Urheberschaft des Commits korrigiert
Richard
0

Git zurücksetzen - Änderungen vornehmen, dann tun

git add -A
git commit --amend --no-edit 

oder

git add -A
git commit --amend -m "commit_message"

und dann

git push origin master --force

--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 branchfür Informationen.

Damkrat
quelle
-1

Sie müssen lediglich das Commit zurücksetzen.

git revert {commit_id}'

Dann schieben Sie es

git push origin -f
Abdallah Nofal
quelle
Es ist nicht möglich, dies beim ersten Commit zu tun.
Benutzer, der kein Benutzer ist