Wie verwerfe ich lokale Commits in Git?


262

Ich hatte an etwas gearbeitet und festgestellt, dass es komplett durcheinander war ... nachdem ich etwas davon begangen hatte. Also habe ich folgende Sequenz ausprobiert:

git reset --hard
git rebase origin
git fetch
git pull
git checkout

An diesem Punkt bekam ich die Nachricht

Your branch is ahead of 'origin/master' by 2 commits.

Ich möchte meine lokalen Commits verwerfen , ohne mein lokales Verzeichnis löschen und alles erneut herunterladen zu müssen. Wie kann ich das erreichen?


6
Es ist nicht erforderlich, beides zu tun, git fetchund git pull- Pull ist eine Kombination aus Abrufen und Zusammenführen.
Ether

12
Hinweis für Benutzer: Das Hauptproblem dieser Frage hat nichts mit der Meldung zu tun, dass Ihr Zweig durch N Commits vor 'origin / master' liegt. " . Bitte hören Sie aufgrund dieser Nachricht auf, andere Fragen als Duplikate dieser zu schließen.

Antworten:


578
git reset --hard origin/master

alle Commits nicht entfernen , origin/masterwo originist der Repo - Name und masterder Name der Branche.


1
Ich dachte, die Syntax "origin / master" mit einem Schrägstrich beziehe sich auf ein lokales Repo?
Daniel C. Sobral

9
mipadi: Richtiger ausgedrückt, wird der aktuelle Zweig so zurückgesetzt, dass er auf dasselbe Commit wie origin / master verweist.
Christoffer Hammarström

Es bezieht sich auf einen Zweig. origin/masterist ein Zweig, der den masterZweig des originRemote-Repos verfolgt.
Mipadi

@ DanielC.Sobral Nein, origin/masterist ein Verweis auf den masterZweig der Fernbedienung namens origin.
Matthew

1
@littletiger git verfolgt keine Ordner, nur Dateien und deren Pfade. Daher werden leere Ordner (Ordner ohne Dateien oder nur ignorierte Dateien) vollständig ignoriert. Sie tauchen nirgendwo auf, da in ihnen nichts zu tun ist.
Mumbleskates

33

Abgesehen von der Antwort von Mipadi (die übrigens funktionieren sollte) sollten Sie wissen, dass Sie Folgendes tun:

git branch -D master
git checkout master

macht auch genau das, was Sie wollen having to redownload everything(Ihr Zitat umschrieben). Dies liegt daran, dass Ihr lokales Repo eine Kopie des Remote-Repos enthält (und diese Kopie nicht mit Ihrem lokalen Verzeichnis identisch ist, sondern auch nicht mit Ihrem ausgecheckten Zweig).

Das Löschen eines Zweigs ist absolut sicher und die Rekonstruktion dieses Zweigs ist sehr schnell und erfordert keinen Netzwerkverkehr. Denken Sie daran, Git ist in erster Linie ein lokales Repo. Sogar entfernte Filialen haben eine Kopie auf der lokalen. Es gibt nur wenige Metadaten, die git mitteilen, dass eine bestimmte lokale Kopie tatsächlich ein Remote-Zweig ist. In Git befinden sich alle Dateien ständig auf Ihrer Festplatte.

Wenn Sie keine anderen Zweige als Master haben, sollten Sie:

git checkout -b 'temp'
git branch -D master
git checkout master
git branch -D temp

4
Aber wie unterscheidet das lokal getätigte Commits von am Ursprung getätigten Commits? In der Tat sagt es mir, dassCannot delete the branch 'master' which you are currently on.
Daniel C. Sobral

1. Grundsätzlich sind alle Commits gleich, unabhängig davon, ob sie lokal oder am Ursprung vorgenommen werden. Wichtig ist, dass die Historien korrekt synchronisiert werden. Ihr lokales Commit ist erst am Ursprung vorhanden, nachdem Sie es gepusht haben, und standardmäßig lehnt git den Push ab, wenn der Verlauf am Ursprung möglicherweise in einem Zustand endet, der keinen Sinn ergibt.
Slebetman

2
2. Natürlich können Sie den aktuell ausgecheckten Zweig nicht löschen. Um den Master zu löschen, überprüfen Sie zuerst einen anderen Zweig. Wenn es keinen anderen Zweig gibt, erstellen Sie einfach einen temporären:git checkout -b temp;git branch -D master;git checkout master;git branch -D temp
Slebetman

Beachten Sie auch, was ich über Ihre andere lokale Kopie des Remote-Repos gesagt habe: Mit git können Sie keine Dateien in Ihrer Kopie des Remote-Zweigs bearbeiten oder sogar anzeigen. Sie können nur einen weiteren Zweig aus dem Remote-Zweig erstellen, den Sie dann anzeigen und bearbeiten können. Konventionell hat dieser lokale Zweig denselben Namen wie der entfernte Zweig. Sie haben teilweise Recht damit, dass origin/mastersich dies auf Ihrem lokalen Computer befindet. Das ist Ihre lokale (vollständige) Kopie des Remote-Zweigs. Der eigentliche Remote-Zweig ist origin master.
Slebetman

Das hat bei mir funktioniert. Vielleicht war das git branch -D masteraber nicht nötig, da es, wie bereits erwähnt, einen Fehler erzeugt.
Alexis Wilke

15

Was ich tue, ist, dass ich versuche, hart auf HEAD zurückzusetzen. Dadurch werden alle lokalen Commits gelöscht:

git reset --hard HEAD^

Dies ist die beste Antwort, die wirklich funktioniert hat. Alle lokalen Commits verworfen und auf HEAD zurückgesetzt. Was nützt ^ char?
Karim

@karim das '^' ist wahrscheinlich Regex-Zeug, was wahrscheinlich etwas ziemlich Tiefes ist, das ich nicht kenne oder vor langer Zeit in der manuellen Datei gelesen habe .. sorry man :)
giang nguyen

1
Spät, aber das ^stellt das übergeordnete Commit dar. Beim Zurücksetzen werden HEAD^nicht festgeschriebene Änderungen verworfen und der Zweig zum vorherigen Commit verschoben, wodurch das letzte Commit effektiv "gelöscht" wird (obwohl das Commit noch vorhanden ist, zeigt der Zweig einfach nicht darauf). Die Antwort enthält nur ein lokales Commit und der Rest sind nicht festgeschriebene Änderungen. @karim @giang
QuantumQuaver

3

Du musst rennen

git fetch

Um alle Änderungen zu erhalten und dann erhalten Sie keine Nachricht mit "Ihre Niederlassung ist voraus".


5
Das Abrufen hat nichts mit dem Hauptproblem des Fragestellers zu tun, nämlich die Beseitigung lokaler Commits.

1
Was ist, wenn ich bereits Dateien in lokalen festgeschrieben habe und dann versuche, den genannten Befehl auszulösen? Es wird dieselbe Fehlermeldung angezeigt. Ich habe auch git fetch und git fetch -p ausprobiert. aber zeigt den gleichen Fehler
Morez

1

Ich habe Fälle gesehen, in denen die Fernbedienung nicht mehr synchron war und aktualisiert werden musste. Wenn a reset --hardoder a branch -Dnicht funktioniert, versuchen Sie es

git pull origin
git reset --hard 

Dies beantwortet nicht die Frage, eine reset --hardArbeit in dieser Situation
CharlesB

1
Hallo Charles, du hast recht, das reset --hardsollte hier funktionieren. Ich möchte jedoch nur darauf hinweisen, dass der Zweig gelegentlich nicht ordnungsgemäß zurückgesetzt werden kann und git pull origindie Fernbedienung erneut synchronisiert wird und die reset --hardFunktion ordnungsgemäß funktioniert.
Jim Clouse

0

Ich musste machen:

git checkout -b master

wie git sagte, dass es nicht existiert, weil es mit dem abgewischt wurde

git -D master
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.