Aufgrund einer schlechten Kirschernte ist mein lokales Git-Repository derzeit fünf Commits vor dem Ursprung und nicht in einem guten Zustand. Ich möchte all diese Verpflichtungen loswerden und von vorne beginnen.
Natürlich würde das Löschen meines Arbeitsverzeichnisses und das erneute Klonen dies tun, aber das erneute Herunterladen von allem von GitHub scheint übertrieben und meine Zeit nicht gut zu nutzen.
Vielleicht git revert
ist es das, was ich brauche, aber ich möchte nicht 10 Commits vor dem Ursprung (oder sogar sechs) abschließen, selbst wenn der Code selbst wieder in den richtigen Zustand versetzt wird. Ich möchte nur so tun, als wäre die letzte halbe Stunde nie passiert.
Gibt es einen einfachen Befehl, der dies erledigt? Es scheint ein offensichtlicher Anwendungsfall zu sein, aber ich finde keine Beispiele dafür.
Beachten Sie, dass es bei dieser Frage speziell um Commits geht , nicht um:
- nicht verfolgte Dateien
- nicht inszenierte Änderungen
- inszenierte, aber nicht festgeschriebene Änderungen
Antworten:
Wenn Ihre überschüssigen Commits nur für Sie sichtbar sind, können Sie einfach
git reset --hard origin/<branch_name>
dorthin zurückkehren, wo sich der Ursprung befindet. Dadurch wird der Status des Repositorys auf das vorherige Commit zurückgesetzt und alle lokalen Änderungen werden verworfen.Wenn Sie a
git revert
ausführen, werden neue Commits erstellt, um alte Commits so zu entfernen , dass die Geschichte aller gesund bleibt.quelle
git reset --hard <commit hash, branch, or tag>
Wenn Sie zu einer anderen Referenz als einer Remote-Verzweigung wechseln möchten.master
an einem anderen Zweig arbeiten, sollten Sie laufengit reset --hard origin/<your-branch-name>
git reset --hard origin/<branch_name>
Dadurch wird auch die Projektkonfiguration zurückgesetzt. Achten Sie also darauf. Ich habe eine große.cfg
Datei, die auf die Standardeinstellungen zurückgesetzt wurde. Ich musste wieder Stunden damit verbringen.Löschen Sie einfach Ihren lokalen Hauptzweig und erstellen Sie ihn wie folgt neu:
quelle
git reset --hard origin/<branch_name>
Versuchen:
um deinen Kopf dorthin zurückzusetzen, wo du sein willst. Verwenden Sie gitk, um zu sehen, bei welchem Commit Sie sein möchten. Sie können auch innerhalb von gitk zurücksetzen.
quelle
Löschen Sie das letzte Commit:
git reset --hard HEAD~1
Löschen Sie das letzte Commit, ohne die von Ihnen geleistete Arbeit zu zerstören:
git reset --soft HEAD~1
quelle
Wenn Sie die Atlassian SourceTree- App verwenden, können Sie die Option zum Zurücksetzen im Kontextmenü verwenden.
quelle
Bei Ihrem Zweigversuch:
Überprüfen Sie die Umkehrung (auf den Status ohne lokale Festschreibungen) mit "
git log
" oder "git status
".quelle
Just to be clear, if you're not working on master but on another branch, you should run git reset --hard origin/<your-branch-name>
git reset --hard @{u}
* löscht alle Ihre lokalen Änderungen im aktuellen Zweig, einschließlich Commits. Ich bin überrascht, dass dies noch niemand gepostet hat, wenn man bedenkt, dass Sie nicht nachschlagen müssen, zu welchen Zweigen Sie zurückkehren oder mit ihnen spielen möchten.* Das heißt, auf den aktuellen Zweig
@{upstream}
zurücksetzenorigin/<branchname>
- gelegentlich , aber nicht immerquelle
Um die SHA-1-ID des Commits zu sehen / zu erhalten, möchten Sie auch zurückkehren
Zurück zu diesem Commit
!Hinweis. Alle Commits, die nach diesem Commit vorgenommen wurden, werden gelöscht (und alle Ihre Änderungen am Projekt). Klonen Sie das Projekt also zuerst besser in einen anderen Zweig oder kopieren Sie es in ein anderes Verzeichnis.
quelle
Ich hatte eine Situation, in der ich ein Commit entfernen wollte, das nicht gepusht wurde, aber das Commit war vor einem anderen. Dazu habe ich den folgenden Befehl verwendet
git rebase -i HEAD~2
-> Die letzten beiden Commits werden neu gestartetUnd ich habe 'drop' für die Commit-Signatur verwendet, die ich entfernen wollte.
quelle
Nicht verfolgte Dateien entfernen (nicht festgeschriebene lokale Änderungen)
Löschen Sie alle lokalen Commits dauerhaft und erhalten Sie das neueste Remote-Commit
quelle
Für lokale Commits, die nicht gepusht werden, können Sie auch
git rebase -i
ein Commit löschen oder quetschen.quelle
git rebase -i
eine allgemeinere Methode zur Lösung vieler ähnlicher Probleme darstellt und in einer Vielzahl von Situationen hilfreich sein kann.drop
Schlüsselwort (anstatt eine Zeile zu löschen), wenn Sie alle Commits entfernen, um zu vermeiden, dass die Rebase abgebrochen wird.Eine einfache Lösung besteht darin, den HEAD des lokalen Hauptzweigs dem HEAD des Ursprungs- / Hauptzweigs zuzuordnen
PS: origin / master - ist ein entfernter Zeiger auf den Master-Zweig. Sie können den Master durch einen beliebigen Filialnamen ersetzen
quelle
Bevor wir antworten, fügen wir einige Hintergrundinformationen hinzu und erklären, was dies ist
HEAD
. da einige der folgenden Optionen zu einem abgenommenen Kopf führenFirst of all what is HEAD?
HEAD
ist einfach ein Verweis auf das aktuelle Commit (aktuell) in der aktuellen Verzweigung.Es kann immer nur eine einzige
HEAD
geben. (ausgenommengit worktree
)Der Inhalt von
HEAD
wird darin gespeichert.git/HEAD
und enthält die 40 Bytes SHA-1 des aktuellen Commits.detached HEAD
Wenn Sie sich nicht im letzten Commit befinden, bedeutet dies, dass
HEAD
auf ein vorheriges Commit in der Geschichte verwiesen wirddetached HEAD
.In der Befehlszeile sieht es so aus: SHA-1 anstelle des Zweignamens, da der
HEAD
nicht auf die Spitze des aktuellen Zweigs zeigtEinige Optionen zur Wiederherstellung nach einem abgetrennten KOPF:
git checkout
Dadurch wird ein neuer Zweig ausgecheckt, der auf das gewünschte Commit verweist.
Dieser Befehl checkt zu einem bestimmten Commit aus.
An diesem Punkt können Sie einen Zweig erstellen und ab diesem Punkt mit der Arbeit beginnen.
git reflog
Sie können das auch immer verwenden
reflog
.git reflog
zeigt jede Änderung an, die das aktualisiert hat,HEAD
und das Auschecken des gewünschten Reflog-Eintrags setztHEAD
diesen Commit zurück.Jedes Mal, wenn der KOPF geändert wird, wird ein neuer Eintrag in der
reflog
Dadurch kehren Sie zu Ihrem gewünschten Commit zurück
git reset --hard <commit_id>
"Bewegen" Sie Ihren HEAD zurück zum gewünschten Commit.
Sie auch das verwenden
git rebase --no-autostash
.git revert <sha-1>
"Rückgängig machen" des angegebenen Commits oder Commit-Bereichs.
Der Befehl zum Zurücksetzen "macht" alle Änderungen rückgängig, die im angegebenen Commit vorgenommen wurden.
Ein neues Commit mit dem Undo-Patch wird festgeschrieben, während das ursprüngliche Commit ebenfalls im Verlauf verbleibt.
Dieses Schema zeigt, welcher Befehl was tut.
Wie Sie dort sehen können,
reset && checkout
ändern Sie dieHEAD
.quelle
Für diejenigen, die an der Visual Studio-Lösung interessiert sind, ist hier die Übung:
Team Explorer
Fenster eine Verbindung zum Ziel-Repo her.Branches
rechten Maustaste auf den Zweig von Interesse und wählenView history
.History
Fenster und wählen SieReset -> Delete changes (--hard)
.Dadurch werden Ihre lokalen Commits verworfen und der Status Ihres Repos auf das ausgewählte Commit zurückgesetzt. Dh Ihre Änderungen, nachdem Sie das Repo gezogen haben, gehen verloren.
quelle
Wenn Ihre Niederlassung vor '
origin/XXX
um 5 Commits ' liegt.Sie können Folgendes ausgeben:
Und es sollte die letzten 5 Commits entfernen.
quelle
Dies ist nützlich, wenn Sie auf Ihrer lokalen Kopie einige Fehler gemacht haben, die Sie sicherstellen möchten, dass sie nicht versehentlich in Ihren Remote-Zweig verschoben werden.
Den SHA-Code erhalten Sie, indem Sie in der webVersion Ihres Git-Dashboards nach dem letzten Commit für den Zweig suchen.
Auf diese Weise können Sie mit dem letzten Commit in der Verzweigung synchronisiert werden.
git pull
Nachdem Sie den Hard-Reset erfolgreich abgeschlossen haben, können Sie bestätigen, dass nichts Neues zu synchronisieren ist, dh Sie erhalten die Meldung.Ihre Niederlassung ist auf dem neuesten Stand
Origin/<Branch Name>
quelle
Wenn Sie Ihr lokales Repo völlig durcheinander bringen, können Sie lokale Commits in Git zuverlässig ...
Nach meiner Erfahrung geht Eclipse gut mit der sich verändernden Welt um. Möglicherweise müssen Sie jedoch betroffene Projekte in Eclipse auswählen und bereinigen, um Eclipse zu zwingen, sie neu zu erstellen. Ich denke, andere IDEs müssen möglicherweise ebenfalls neu erstellt werden.
Ein Nebeneffekt des oben beschriebenen Verfahrens besteht darin, dass Sie herausfinden, ob Ihr Projekt auf lokalen Dateien basiert, die nicht in git abgelegt wurden. Wenn Sie feststellen, dass Dateien fehlen, können Sie diese von "my_broken_local_repo" kopieren und zu git hinzufügen. Sobald Sie sicher sind, dass Ihr neues lokales Repo alles enthält, was Sie benötigen, können Sie "my_broken_local_repo" löschen.
quelle
Wenn Sie nur lokale Commits wegwerfen und die in Dateien vorgenommenen Änderungen beibehalten möchten, führen Sie
git reset @ ~ durch.
Andere Antworten betrafen den Hard-Reset
quelle