web-dev-qa-db-de.com

Wie kann ich das ursprüngliche Git-Commit wieder herstellen?

Ich verpflichte mich zum ersten Mal zu einem Git-Repository; Ich bedauere dann das Commit und möchte es zurücknehmen. ich versuche

# git reset --hard HEAD~1

Ich erhalte 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 rückgängig macht?

253
Chau Chee Yang

Sie müssen nur den Zweig löschen, in dem Sie sich befinden. Sie können git branch -D nicht verwenden, da dies eine Sicherheitsüberprüfung enthält. Sie können update-ref dazu verwenden.

git update-ref -d HEAD

Verwenden Sie nicht verwenden Sie rm -rf .git oder ähnliches, da dies Ihr gesamtes Repository vollständig löscht, einschließlich aller anderen Zweige sowie des Zweigs, den Sie zurücksetzen möchten.

408
CB Bailey

Sie können den HEAD löschen und Ihr Repository in einem neuen Zustand wiederherstellen, in dem Sie ein neues Initial Commit erstellen können:

git update-ref -d HEAD

Wenn Sie nach dem Erstellen eines neuen Commits bereits einen Remote-Push ausgeführt haben, müssen Sie ihn zum Remote erzwingen, um den vorherigen Initial-Commit zu überschreiben:

git Push --force Origin
41
frazras

Unter den in der Frage genannten Bedingungen:

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

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

rm -fr .git

aus dem Verzeichnis, in dem Sie git init gemacht haben. Sie können dann den git init wiederholen, um das Git-Repository neu zu erstellen, und die Ergänzungen mit den Änderungen wiederholen, die Sie bedauert haben, als Sie das erste Mal nichts unternommen haben, und das ursprüngliche Commit wiederholen.

GEFAHR! Dies entfernt das Git-Repository-Verzeichnis.

Das Git-Repository-Verzeichnis wird dauerhaft und unwiederbringlich entfernt, es sei denn, Sie haben irgendwo Backups. Unter diesen Voraussetzungen möchten Sie nichts im Repository behalten, 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 gelöscht usw. Dies ist jedoch nur dann sicher, wenn Sie überhaupt nichts anderes in Ihrem Repository haben. Unter den in der Frage "Repository erstmalig 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 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 Vorgänge ausgeführt haben, die Sie beibehalten möchten, ist dies nicht die geeignete Technik - Ihr Repository erfüllt nicht mehr die Voraussetzungen dafür, dass dies angemessen ist.

9

Diese Frage wurde von diesem Blogpost verlinkt, und für die neueren Versionen von Git wurde eine alternative Lösung vorgeschlagen:

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

Diese Lösung geht davon aus, dass

  1. Sie haben nur ein Commit für Ihren Zweig master
  2. Es gibt keinen Zweig namens old_master, daher kann ich diesen Namen frei verwenden

Es benennt den vorhandenen Zweig in old_master um und erstellt einen neuen, verwaisten Zweig master(wie er für neue Repositorys erstellt wird). Danach können Sie old_master... beliebig löschen. Wie du willst.

Hinweis: Wenn Sie einen Git-Zweig verschieben oder kopieren, bleibt der Reflog (siehe dieser Code ) erhalten, während Sie einen neuen Zweig löschen und anschließend erstellen. Da Sie ohne Historie in den ursprünglichen Zustand zurückkehren möchten, möchten Sie wahrscheinlich den Zweig löschen. Andere möchten jedoch diese kleine Notiz berücksichtigen.

9
nonsensickle

Du kannst nicht So:

rm -rf .git/
git init
git add -A
git commit -m 'Your new commit message'
3
ma11hew28

Ich werde das einwerfen, was am Ende für mich funktioniert hat. Ich musste das ursprüngliche Commit für ein Repository entfernen, da die in Quarantäne gestellten Daten verlegt wurden und das Commit bereits übertragen 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 lösen.

Wichtig

Dies befand sich in einem internen Repository, auf das nicht öffentlich zugegriffen werden konnte. Wenn Ihr Repository öffentlich zugegriffen werden konnte, gehen Sie bitte davon aus, dass alles, was Sie zurücksetzen müssen, bereits von einer anderen Person heruntergeladen wurde.

0
edward

git reset --hard Ä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 neu, auf das Sie im ersten Schritt zurückgesetzt wurden. </ strike>

Tun Sie dies nicht, weil Sie sich der Idee von VCS-Systemen und insbesondere von git widersetzen möchten. Die einzig gute Methode ist, einen neuen zu erstellen und nicht benötigte Verzweigungen zu löschen. Siehe git help branch für Informationen.

0
damkrat

Alles was Sie tun müssen, ist das Commit rückgängig zu machen.

git revert {commit_id}'

Dann schieben Sie es

git Push Origin -f
0
abdallah Nofal