Wie setze ich meinen lokalen Zweig so zurück, dass er dem Zweig im Remote-Repository entspricht?
Ich tat:
git reset --hard HEAD
Aber wenn ich a git status
,
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: java/com/mycompany/TestContacts.java
modified: java/com/mycompany/TestParser.java
Können Sie mir bitte sagen, warum ich diese "modifiziert" habe? Ich habe diese Dateien nicht berührt? Wenn ich das getan habe, möchte ich diese entfernen.
git status
Ihres zweiten Befehlsgit reset --hard HEAD
fehlgeschlagen. Sie haben die Ausgabe jedoch nicht eingefügt. → Unvollständige Frage.git status
sagtnothing to commit, working directory clean
. - Bitte angeben!Antworten:
Das Einstellen Ihres Zweigs auf den Remote-Zweig kann in zwei Schritten erfolgen:
Wenn Sie den Status Ihres aktuellen Zweigs speichern möchten, bevor Sie dies tun (nur für den Fall), können Sie Folgendes tun:
Jetzt wird Ihre Arbeit im Zweig "Meine gespeicherte Arbeit" gespeichert, falls Sie entscheiden, dass Sie sie zurückhaben möchten (oder sie später ansehen oder gegen Ihren aktualisierten Zweig abweichen möchten).
Beachten Sie, dass im ersten Beispiel davon ausgegangen wird, dass der Name des Remote-Repos "Ursprung" ist und dass der Zweig mit dem Namen "Master" im Remote-Repo mit dem aktuell ausgecheckten Zweig in Ihrem lokalen Repo übereinstimmt.
Übrigens, diese Situation, in der Sie sich befinden, ähnelt einem häufigen Fall, in dem ein Push in den aktuell ausgecheckten Zweig eines nicht nackten Repositorys durchgeführt wurde. Haben Sie kürzlich in Ihr lokales Repo gestoßen? Wenn nicht, dann keine Sorge - etwas anderes muss dazu geführt haben, dass diese Dateien unerwartet geändert wurden. Andernfalls sollten Sie sich darüber im Klaren sein, dass es nicht empfohlen wird, in ein nicht nacktes Repository zu pushen (und insbesondere nicht in den aktuell ausgecheckten Zweig).
quelle
git reset FETCH_HEAD --hard
, das ist die gleiche Bedeutung.Ich musste tun (die Lösung in der akzeptierten Antwort):
Gefolgt von:
um lokale Dateien zu entfernen
So sehen Sie, welche Dateien entfernt werden (ohne sie tatsächlich zu entfernen):
quelle
git clean -d -f
wenn nicht verfolgte Verzeichnisse vorhanden sind.git clean -fdx
git clean -f
war das wesentliche Stück, das ich brauchte. Vielen Dank!Setzen Sie zunächst auf den zuvor abgerufenen
HEAD
des entsprechenden Upstream-Zweigs zurück:Der Vorteil der Angabe
@{u}
oder ihrer ausführlichen Form@{upstream}
besteht darin, dass der Name des Remote-Repos und der Verzweigung nicht explizit angegeben werden muss.Entfernen Sie anschließend nach Bedarf nicht verfolgte Dateien, optional auch mit
-x
:Holen Sie sich schließlich nach Bedarf die neuesten Änderungen:
quelle
origin/master
@{upstream}
ist sehr praktisch und kann in Aliasnamen verwendet werden:alias resetthisbranch="git reset --hard @{upstream}"
git reset --hard
erfordert ein Commit, sonst würde es nicht wissen, worauf Sie zurückgesetzt werden sollen.@{u}
zeigt auf ein bestimmtes Commit - den Kopf des verfolgten Zweigs, ab dem Zeitpunkt, an dem Sie das letzte Mal einen ausgeführt habengit fetch
.git reset --hard
obwohl es nicht auf Remote-Zweig zurückgesetzt wirdgit reset --hard "@{u}"
). Ich habe eine Weile gebraucht, um das herauszufinden.git reset --hard HEAD
wird eigentlich nur auf den zuletzt festgeschriebenen Zustand zurückgesetzt. In diesem Fall bezieht sich HEAD auf den HEAD Ihrer Niederlassung.Wenn Sie mehrere Commits haben, funktioniert dies nicht.
Was Sie wahrscheinlich tun möchten, ist das Zurücksetzen auf den Ursprungskopf oder wie auch immer Ihr Remote-Repository heißt. Ich würde wahrscheinlich einfach so etwas machen
Sei aber vorsichtig. Hard Resets können nicht einfach rückgängig gemacht werden. Es ist besser, wie von Dan vorgeschlagen, eine Kopie Ihrer Änderungen zu verzweigen, bevor Sie sie zurücksetzen.
quelle
Alle oben genannten Vorschläge sind richtig, aber um Ihr Projekt wirklich zurückzusetzen, müssen Sie häufig auch Dateien entfernen, die sich in Ihrem befinden
.gitignore
.Um das moralische Äquivalent zum Löschen Ihres Projektverzeichnisses und zum erneuten Klonen von der Fernbedienung zu erhalten, gehen Sie wie folgt vor:
Warnung :
git clean -x -d -f
ist irreversibel und Sie können Dateien und Daten verlieren (z. B. Dinge, die Sie ignoriert haben.gitignore
).quelle
git clean -xdf
das ist gleichgit clean -x -d -f
.Verwenden Sie die folgenden Befehle. Diese Befehle entfernen auch alle nicht verfolgten Dateien aus dem lokalen Git
quelle
git clean -d -f
wir ohne die noch einige Dinge des alten Zweigs im lokalen Verzeichnis hatten. Danke, Mann.Die Frage vermischt hier zwei Themen:
git status
sagtnothing to commit, working directory clean.
Die Antwort aus einer Hand lautet:
git fetch --prune
(optional) Aktualisiert den lokalen Snapshot des Remote-Repos. Weitere Befehle sind nur lokal.git reset --hard @{upstream}
Setzt den lokalen Verzweigungszeiger auf die Position des Snapshots der Fernbedienung und setzt den Index und das Arbeitsverzeichnis auf die Dateien dieses Commits.git clean -d --force
Entfernt nicht verfolgte Dateien und Verzeichnisse, die Git daran hindern, "Arbeitsverzeichnis bereinigen" zu sagen.quelle
@{upstream}
Syntax muss Upstream festgelegt werden. Dies geschieht standardmäßig, wenn Sie dies tungit checkout <branchname>
. - Andernfalls ersetzen Sie es durchorigin/<branchname>
.-x
zugit clean
, um alles zu entfernen, was nicht im Commit enthalten ist (dh sogar Dateien, die mit dem .gitignore-Mechanismus ignoriert werden).Dies ist etwas, mit dem ich regelmäßig konfrontiert bin, und ich habe das oben bereitgestellte Skript Wolfgang verallgemeinert, um mit jedem Zweig zu arbeiten
Ich habe auch eine Eingabeaufforderung "Bist du sicher" und eine Feedback-Ausgabe hinzugefügt
quelle
Vorausgesetzt, das Remote-Repository ist vorhanden
origin
und Sie interessieren sich fürbranch_name
:Außerdem setzen Sie den aktuellen Zweig von
origin
auf zurückHEAD
.Wie es funktioniert:
git fetch origin
lädt das Neueste von der Fernbedienung herunter, ohne zu versuchen, etwas zusammenzuführen oder neu zu starten.Dann
git reset
setzt der<branch_name>
Zweig auf das zurück, was Sie gerade abgerufen haben. Die--hard
Option ändert alle Dateien in Ihrem Arbeitsbaum so, dass sie mit den Dateien in übereinstimmenorigin/branch_name
.quelle
Ich tat:
Zweig vollständig zurücksetzen
Beachten Sie, dass Sie zu einem anderen Zweig auschecken sollten, um den erforderlichen Zweig löschen zu können
quelle
Hier ist ein Skript, das automatisiert, was die beliebteste Antwort vorschlägt ... Unter https://stackoverflow.com/a/13308579/1497139 finden Sie eine verbesserte Version, die Zweige unterstützt
quelle
Wenn Sie als ich ein Problem hatten, dass Sie bereits einige Änderungen vorgenommen haben, aber jetzt, aus irgendeinem Grund, den Sie loswerden möchten, ist der schnellste Weg, Folgendes zu verwenden
git reset
:Ich hatte 2 nicht benötigte Commits, daher die Nummer 2. Sie können sie in Ihre eigene Anzahl von Commits ändern, um sie zurückzusetzen.
Beantworten Sie also Ihre Frage: Wenn Sie 5 Commits vor dem HEAD des Remote-Repositorys haben, sollten Sie diesen Befehl ausführen:
Beachten Sie, dass Sie die vorgenommenen Änderungen verlieren. Seien Sie also vorsichtig!
quelle
Bei früheren Antworten wird davon ausgegangen, dass der zurückzusetzende Zweig der aktuelle Zweig ist (ausgecheckt). In Kommentaren stellte OP hap497 klar, dass der Zweig zwar ausgecheckt ist, dies jedoch in der ursprünglichen Frage nicht ausdrücklich vorgeschrieben ist. Da es mindestens eine "doppelte" Frage gibt, setzen Sie den Zweig vollständig auf den Repository-Status zurück , wobei nicht davon ausgegangen wird, dass der Zweig ausgecheckt ist. Hier ist eine Alternative:
Wenn der Zweig "mybranch" derzeit nicht ausgecheckt ist , können Sie diesen Befehl auf niedriger Ebene verwenden , um ihn auf den Kopf des entfernten Zweigs "myremote / mybranch" zurückzusetzen :
Diese Methode lässt den ausgecheckten Zweig unverändert und den Arbeitsbaum unberührt. Es bewegt einfach den Kopf von mybranch zu einem anderen Commit, was auch immer als zweites Argument angegeben wird. Dies ist besonders hilfreich, wenn mehrere Zweige auf neue Remote-Köpfe aktualisiert werden müssen.
Seien Sie dabei jedoch vorsichtig und
gitk
überprüfen Sie Quelle und Ziel mit einem ähnlichen Tool. Wenn Sie dies versehentlich für den aktuellen Zweig tun (und Git wird Sie nicht davon abhalten), werden Sie möglicherweise verwirrt, da der neue Zweiginhalt nicht mit dem Arbeitsbaum übereinstimmt, der sich nicht geändert hat (um den Zweig zu reparieren, aktualisieren Sie ihn erneut). dorthin, wo es vorher war).quelle
Das benutze ich oft:
Beachten Sie, dass es gute Praxis , nicht um Änderungen an Ihrem lokalen Master / entwickelt Zweig ist, sondern die Kasse zu einem anderen Zweig für jede Änderung, mit dem Zweignamen durch die Art der Veränderung vorangestellt, zum Beispiel
feat/
,chore/
,fix/
etc. Auf diese Weise nur Sie müssen Änderungen ziehen, keine Änderungen vom Master übertragen. Gleiches gilt für andere Branchen, zu denen andere beitragen. Daher sollte das oben Gesagte nur verwendet werden, wenn Sie Änderungen an einem Zweig festgeschrieben haben, für den sich andere verpflichtet haben und der zurückgesetzt werden muss. Andernfalls vermeiden Sie es in Zukunft, zu einem Zweig zu pushen, zu dem andere pushen, sondern checken Sie aus und drücken Sie über den ausgecheckten Zweig zu diesem Zweig.Wenn Sie Ihre lokale Niederlassung auf das neueste Commit in der vorgelagerten Niederlassung zurücksetzen möchten, funktioniert dies für mich bisher wie folgt:
Überprüfen Sie Ihre Fernbedienungen, stellen Sie sicher, dass Ihr Upstream und Ihre Herkunft Ihren Erwartungen entsprechen. Wenn nicht wie erwartet
git remote add upstream <insert URL>
, verwenden Sie z. B. das ursprüngliche GitHub-Repo, von dem Sie sich gegabelt haben, und / odergit remote add origin <insert URL of the forked GitHub repo>
.Auf GitHub können Sie auch den Zweig mit demselben Namen wie den lokalen auschecken, um die Arbeit dort zu speichern. Dies ist jedoch nicht erforderlich, wenn die Ursprungsentwicklung dieselben Änderungen wie der lokale Zweig für gespeicherte Arbeit aufweist. Ich verwende den Entwicklungszweig als Beispiel, aber es kann ein beliebiger vorhandener Zweigname sein.
Wenn Sie diese Änderungen dann bei Konflikten mit einem anderen Zweig zusammenführen müssen, um die Änderungen in der Entwicklung beizubehalten, verwenden Sie:
Während des Gebrauchs
um die widersprüchlichen Änderungen von branch_name beizubehalten. Verwenden Sie andernfalls ein Mergetool mit
git mergetool
.Mit all den Änderungen zusammen:
Beachten Sie, dass Sie anstelle von Upstream / Develop einen Commit-Hash, einen anderen Zweigstellennamen usw. verwenden können. Verwenden Sie ein CLI-Tool wie Oh My Zsh, um zu überprüfen, ob Ihr Zweig grün ist und anzeigt, dass nichts festgeschrieben werden muss und das Arbeitsverzeichnis sauber ist ( was bestätigt oder auch überprüfbar ist durch
git status
). Beachten Sie, dass dies tatsächlich im Vergleich Commits hinzufügen kann entwickeln Upstream , wenn es etwas hinzugefügt wird , automatisch von einem Commit, zB UML - Diagramme, Lizenz - Header usw., so dass in diesem Fall könnten Sie dann ziehen Sie die Änderungen an ,origin develop
umupstream develop
, wenn nötig.quelle
Die Antwort
wurde unterschätzt ( -d , um Verzeichnisse zu entfernen). Vielen Dank!
quelle
git clean -xdf
. Dadurch werden alle Dateien gelöscht, die git nicht kennt, und Ihr Ordner stimmt genau mit dem überein, was in der Objektliste von git enthalten ist. Beachten Sie, dass Sie-n
(z. B.git clean -nxdf
) ein "Was-wäre-wenn" hinzufügen können, um zu erfahren, was gelöscht wird, ohne tatsächlich etwas zu tun. ( git clean )Wenn Sie
HEAD
sowohl für das Arbeitsverzeichnis als auch für den Index zum Status zurückkehren möchten, sollten Sie diesgit reset --hard HEAD
nicht tunHEAD^
. (Dies war möglicherweise ein Tippfehler, genau wie der einfache oder doppelte Strich für--hard
.)Bei Ihrer speziellen Frage, warum diese Dateien im Status "Geändert" angezeigt werden, haben Sie möglicherweise einen Soft-Reset anstelle eines Hard-Reset durchgeführt. Dies führt dazu, dass die Dateien, die im
HEAD
Commit geändert wurden, so angezeigt werden, als wären sie bereitgestellt. Dies ist wahrscheinlich das, was Sie hier sehen.quelle
Kein Zurücksetzen und Bereinigen schien Auswirkungen auf nicht verfolgte und geänderte Dateien in meinem lokalen Git-Repo zu haben (ich habe alle oben genannten Optionen ausprobiert). Meine einzige Lösung bestand darin, das lokale Repo zu rmen und es von der Fernbedienung neu zu klonen.
Zum Glück hatte ich keine anderen Filialen, die mir wichtig waren.
xkcd: Git
quelle
Die einzige Lösung, die in allen Fällen funktioniert, die ich gesehen habe, ist das Löschen und erneute Klonen. Vielleicht gibt es einen anderen Weg, aber offensichtlich lässt dieser Weg keine Chance, dass der alte Staat dort zurückbleibt, also bevorzuge ich ihn. Bash Einzeiler, den Sie als Makro festlegen können, wenn Sie in git häufig Probleme haben:
* geht davon aus, dass Ihre Git-Dateien nicht beschädigt sind
quelle
Haben Sie vergessen, einen Feature-Zweig zu erstellen, und haben sich versehentlich direkt auf den Master festgelegt?
Sie können den Feature-Zweig jetzt erstellen und den Master zurücksetzen, ohne den Arbeitsbaum (lokales Dateisystem) zu beeinträchtigen , um das Auslösen von Builds, Tests und Problemen mit Dateisperren zu vermeiden:
quelle
Mit nur 3 Befehlen funktioniert es
quelle
Wenn es Ihnen nichts ausmacht, Ihre lokalen Änderungen zu speichern, Sie Ihr Repository jedoch so aktualisieren möchten, dass es mit origin / HEAD übereinstimmt, können Sie einfach Ihre lokalen Änderungen speichern und dann Folgendes abrufen:
quelle