Ich habe gerade ein Git-Repository geklont und einen Zweig ausgecheckt. Ich arbeitete daran und beschloss dann, alle meine lokalen Änderungen zu entfernen, da ich die Originalkopie haben wollte.
Kurz gesagt, ich musste die folgenden zwei Befehle ausführen, um meine lokalen Änderungen zu entfernen
git checkout .
git clean -f
Meine Frage ist,
(1) Ist dies der richtige Ansatz, um lokale Änderungen zu beseitigen, oder teilen Sie mir bitte den richtigen Ansatz mit.
(2) Wann verwenden wir, git reset --hard
da ich auch ohne diesen Befehl zurücksetzen kann?
Vielen Dank
* Lösung: Hauptbearbeitung (en): 26.03.: * Viele vage Begriffe wurden durch eine git-spezifische Terminologie ersetzt [verfolgt / nicht verfolgt / inszeniert / nicht inszeniert]
Es kann nur drei Kategorien von Dateien geben, wenn wir lokale Änderungen vornehmen:
Typ 1. Staged Tracked-Dateien
Typ 2. Nicht bereitgestellte verfolgte Dateien
Typ 3. Nicht bereitgestellte nicht verfolgte Dateien, auch bekannt als nicht verfolgte Dateien
- Inszeniert - Diejenigen, die in den Staging-Bereich verschoben / Zum Index hinzugefügt werden
- Verfolgt - geänderte Dateien
- UnTracked - neue Dateien. Immer nicht inszeniert. Wenn inszeniert, bedeutet dies, dass sie verfolgt werden.
Was jeder Befehl tut:
git checkout .
- Entfernt NUR nicht bereitgestellte verfolgte Dateien [Typ 2]git clean -f
- Entfernt NUR nicht bereitgestellte nicht verfolgte Dateien [Typ 3]git reset --hard
- Entfernt NUR inszenierte verfolgte und nicht inszenierte verfolgte Dateien [Typ 1, Typ 2]git stash -u
- Entfernt alle Änderungen [Typ 1, Typ 2, Typ 3]
Fazit:
Es ist klar, dass wir beide verwenden können
(1) combination of `git clean -f` and `git reset --hard`
ODER
(2) `git stash -u`
um das gewünschte Ergebnis zu erzielen.
Hinweis: Verstecken, da das Wort "etwas (sicher) sicher und geheim an einem bestimmten Ort aufbewahren" bedeutet. Dies kann immer mit abgerufen werden git stash pop
. Die Wahl zwischen den beiden oben genannten Optionen ist also ein Aufruf des Entwicklers.
Vielen Dank an Christoph und Frederik Schøning.
Bearbeiten: 27.03
Ich dachte, es lohnt sich, auf die " Vorsicht " -Notiz zu achtengit clean -f
git clean -f
Es gibt kein Zurück. Verwenden Sie -n
oder, --dry-run
um eine Vorschau des verursachten Schadens anzuzeigen.
Wenn Sie auch Verzeichnisse entfernen möchten, führen Sie aus git clean -f -d
Wenn Sie nur ignorierte Dateien entfernen möchten, führen Sie aus git clean -f -X
Wenn Sie sowohl ignorierte als auch nicht ignorierte Dateien entfernen möchten, führen Sie aus git clean -f -x
Referenz: mehr zu git clean
: Wie entferne ich lokale (nicht verfolgte) Dateien aus dem aktuellen Git-Arbeitsbaum?
Bearbeiten: 20.05.15
Alle lokalen Commits in diesem Zweig verwerfen [Lokale Commits entfernen]
Um alle lokalen Commits in diesem Zweig zu verwerfen und den lokalen Zweig mit dem "Upstream" dieses Zweigs identisch zu machen, führen Sie ihn einfach aus git reset --hard @{u}
Referenz: http://sethrobertson.github.io/GitFixUm/fixup.html
oder tun git reset --hard origin/master
[wenn lokale Niederlassung ist master
]
Hinweis: 06/12/2015 Dies ist kein Duplikat der anderen SO-Frage, die als Duplikat markiert ist. Diese Frage befasst sich mit dem Entfernen lokaler GIT-Änderungen [Entfernen einer hinzugefügten Datei, Entfernen von Änderungen, die an einer vorhandenen Datei hinzugefügt wurden usw. und den verschiedenen Ansätzen; Wobei im anderen SO-Thread nur behandelt wird, wie das lokale Commit entfernt wird. Wenn Sie eine Datei hinzugefügt haben und diese alleine entfernen möchten, wird der andere SO-Thread nicht darüber diskutieren. Daher ist dies kein Duplikat des anderen]
Bearbeiten: 23.06.15
Wie kann ein bereits in ein Remote-Repository übertragenes Commit zurückgesetzt werden?
$ git revert ab12cd15
Bearbeiten: 01.09.2015
Löschen Sie ein vorheriges Commit aus dem lokalen Zweig und dem Remote-Zweig
Fall: Sie haben gerade eine Änderung an Ihrer lokalen Niederlassung vorgenommen und sind sofort zur Remote-Niederlassung gewechselt. Plötzlich wurde Ihnen klar: Oh nein! Ich brauche diese Änderung nicht. Jetzt was machen?
git reset --hard HEAD~1
[zum Löschen dieses Commits aus dem lokalen Zweig]
git push origin HEAD --force
[Beide Befehle müssen ausgeführt werden. Zum Löschen aus der Gegenstelle]
Was ist die Branche? Es ist die aktuell ausgecheckte Filiale.
Edit 09/08/2015 - Lokale Git- Zusammenführung entfernen :
Ich bin in einer master
Niederlassung und habe eine master
Niederlassung mit einer neu arbeitenden Niederlassung zusammengeführtphase2
$ git status
# On branch master
$ git merge phase2
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 8 commits.
F: Wie kann man diese Zusammenführung loswerden? Versucht git reset --hard
und git clean -d -f
beide haben nicht funktioniert.
Das einzige, was funktioniert hat, ist eines der folgenden:
$ git reset --hard origin/master
oder
$ git reset --hard HEAD~8
oder
$ git reset --hard 9a88396f51e2a068bb7
[sha Commit-Code - Dies ist der Code, der vorhanden war, bevor alle Ihre Merge-Commits stattfanden.]
git stash -a
[oder --all] speichert auch die ignorierten und nicht verfolgten Dateien.git clean -x
Bereinigt auch ignorierte Dateien.git clean -X
bereinigt nur die ignorierten Dateien.Antworten:
Es hängt alles davon ab, was Sie rückgängig machen / zurücksetzen möchten. Beginnen Sie mit dem Lesen des Beitrags in Ubes Link . Aber um eine Antwort zu versuchen:
Hard Reset
Entfernen Sie alle bereitgestellten und nicht bereitgestellten Änderungen an nachverfolgten Dateien vollständig.
Ich verwende häufig ein hartes Zurücksetzen, wenn ich denke, "mache einfach alles rückgängig, als hätte ich einen vollständigen Neuklon von der Fernbedienung durchgeführt". In Ihrem Fall, in dem Sie nur Ihr Repo makellos haben möchten, würde dies funktionieren.
Sauber
Entfernen Sie nicht verfolgte Dateien.
Zum Entfernen temporärer Dateien, aber beibehaltene und nicht bereitgestellte Änderungen an bereits verfolgten Dateien. In den meisten Fällen würde ich wahrscheinlich eine Ignorierregel erstellen, anstatt sie wiederholt zu bereinigen - z. B. für die Ordner bin / obj in einem C # -Projekt, die Sie normalerweise aus Platzgründen aus Ihrem Repo ausschließen möchten, oder ähnliches.
Die Option -f (force) entfernt auch Dateien, die nicht verfolgt werden und von git ignoriert werden, obwohl die Ignorierregel gilt. Im obigen Fall werden sie mit einer Ignorierregel, mit der die Ordner bin / obj niemals verfolgt werden sollen, mit der Option force aus Ihrem Dateisystem entfernt, obwohl diese Ordner von git ignoriert werden. Ich habe sporadisch eine Verwendung dafür gesehen, z. B. beim Bereitstellen von Skripten, und Sie möchten Ihren Code vor dem Bereitstellen, Zippen oder was auch immer bereinigen.
Git Clean berührt keine Dateien, die bereits verfolgt werden.
Kasse "Punkt"
Ich hatte diese Notation noch nie gesehen, bevor ich Ihren Beitrag gelesen hatte. Es fällt mir schwer, eine Dokumentation dafür zu finden (vielleicht kann jemand helfen), aber wenn ich ein bisschen herumspiele, sieht es so aus, als würde es bedeuten:
"Alle Änderungen in meinem Arbeitsbaum rückgängig machen".
Dh nicht bereitgestellte Änderungen in nachverfolgten Dateien rückgängig machen. Es berührt anscheinend keine inszenierten Änderungen und lässt nicht verfolgte Dateien in Ruhe.
Verstauen
Einige Antworten erwähnen das Verstauen. Wie der Wortlaut andeutet, würden Sie wahrscheinlich Stashing verwenden, wenn Sie sich mitten in etwas befinden (nicht bereit für ein Commit), und Sie müssen vorübergehend die Zweige wechseln oder irgendwie an einem anderen Status Ihres Codes arbeiten, um später zu Ihrem "chaotisch" zurückzukehren Schreibtisch". Ich sehe nicht, dass dies auf Ihre Frage zutrifft, aber es ist definitiv praktisch.
Um zusammenzufassen
Im Allgemeinen, wenn Sie sicher sind , haben Sie begangen und vielleicht zu einem entfernten wichtige Änderungen gedrückt, wenn Sie gerade spielen , um oder dergleichen, unter Verwendung
git reset --hard HEAD
von gefolgtgit clean -f
wird definitiv Ihren Code in den Zustand reinigen, wäre es in, war es nur geklont und aus einer Filiale ausgecheckt. Es ist wirklich wichtig zu betonen, dass durch das Zurücksetzen auch inszenierte, aber nicht festgeschriebene Änderungen entfernt werden. Es löscht alles, was nicht festgeschrieben wurde (außer nicht verfolgte Dateien, in diesem Fall verwenden Sie clean ).Alle anderen Befehle dienen dazu, komplexere Szenarien zu ermöglichen, in denen eine Granularität des "Rückgängigmachens" erforderlich ist :)
Ich bin der Meinung, dass Ihre Frage Nr. 1 behandelt wird, aber zum Schluss noch die Schlussfolgerung Nr. 2: Der Grund, warum Sie nie die Notwendigkeit gefunden haben, sie zu verwenden,
git reset --hard
war, dass Sie nie etwas inszeniert hatten. Hätten Sie eine Änderung inszeniert, hätte dies wedergit checkout .
nochgit clean -f
rückgängig gemacht.Hoffe das deckt ab.
quelle
git reset --hard
. Ich habe es ausprobiert und ja ... diese Dateien, die dem Index hinzugefügt wurden (Staging), wurden erst danach entferntgit reset --hard
, und ich gehe davon aus, dass dies standardmäßig der Fallgit reset --hard
istgit reset --hard head
. Dieser Link ist auch hilfreich gitready.com/beginner/2009/01/18/the-staging-area.htmlgit stash -u
hier am sinnvollsten finde .git stash -u
tut und wie es zu knallen ist, aber Frederik ließ mich wissen, dass es hart zurückgesetzt wurde und die Kombination vongit reset --hard
und verwendetegit clean -f
, und warum nicht,stash
wird in einigen Szenarien bevorzugt. Bitte helfen Sie mir bei der Auswahl, welche ich als Antwort markieren soll :), beide sind meine Antworten..
ist eine Pfadspezifikation, die sich auf das aktuelle Arbeitsverzeichnis bezieht, das möglicherweise das Stammverzeichnis des Repos ist. Von git-scm.com:git checkout [<tree-ish>] [--] <pathspec>…
Aktualisiert die benannten Pfade im Arbeitsbaum aus der Indexdatei oder aus einem benannten <Baum>.git reset --hard
undgit clean -dfx
als auch dergleichen destruktiv sind . Wie auch immer, bitte korrigieren Sie den Kleinbuchstabenhead
in der Antwort, er sollte entweder in GroßbuchstabenHEAD
oder überhaupt nicht vorhanden sein.Grund für das Hinzufügen einer Antwort in diesem Moment:
Bisher habe ich die Schlussfolgerung und die 'Antworten' zu meiner ursprünglichen Frage selbst hinzugefügt, wodurch die Frage sehr langwierig wurde und daher zu einer separaten Antwort übergegangen wurde.
Ich habe auch häufiger verwendete Git-Befehle hinzugefügt , die mir bei Git helfen, um auch jemand anderem zu helfen.
Grundsätzlich alle lokalen Commits zu reinigen
$ git reset --hard
und$ git clean -d -f
Der erste Schritt, bevor Sie Commits ausführen, besteht darin, Ihren Benutzernamen und Ihre E-Mail-Adresse zu konfigurieren, die zusammen mit Ihrem Commit angezeigt werden.
# Legt den Namen fest, den Sie an Ihre Festschreibungstransaktionen anhängen möchten
# Legt die E-Mail fest, die an Ihre Commit-Transaktionen angehängt werden soll
#Listen Sie die globale Konfiguration auf
#Listen Sie die Remote-URL auf
#Status überprüfen
#Listen Sie alle lokalen und Remote-Zweige auf
#Erstellen Sie einen neuen lokalen Zweig und beginnen Sie mit der Arbeit an diesem Zweig
oder es kann als zweistufiger Prozess durchgeführt werden
Zweig erstellen:
git branch branchname
Arbeiten Sie an diesem Zweig:git checkout branchname
# lokale Änderungen festschreiben [zweistufiger Prozess: - Hinzufügen der Datei zum Index, dh Hinzufügen zum Staging-Bereich. Übernehmen Sie dann die Dateien, die in diesem Staging-Bereich vorhanden sind.]
#checkout eine andere lokale Niederlassung
#Entfernen Sie alle Änderungen in der lokalen Verzweigung [Angenommen, Sie haben einige Änderungen in der lokalen Verzweigung vorgenommen, z. B. das Hinzufügen einer neuen Datei oder das Ändern einer vorhandenen Datei oder ein lokales Commit, benötigen dies jedoch nicht mehr]
git clean -d -f
undgit reset --hard
[bereinigen Sie alle lokalen Änderungen, die an der lokalen Verzweigung vorgenommen wurden, außer wenn lokales Commit]git stash -u
entfernt auch alle ÄnderungenHinweis: Es ist klar, dass wir entweder (1) Kombination von
git clean –d –f
undgit reset --hard
ODER (2) verwenden könnengit stash -u
, um das gewünschte Ergebnis zu erzielen.Anmerkung 1: Verstauen, da das Wort "etwas (sicher) sicher und geheim an einem bestimmten Ort aufbewahren" bedeutet. Dies kann immer mit Git Stash Pop abgerufen werden. Die Wahl zwischen den beiden oben genannten Optionen ist also ein Aufruf des Entwicklers.
Hinweis 2:
git reset --hard
Löscht Änderungen am Arbeitsverzeichnis. Stellen Sie sicher, dass Sie alle lokalen Änderungen aufbewahren, die Sie behalten möchten, bevor Sie diesen Befehl ausführen.# Wechseln Sie zur Hauptniederlassung und stellen Sie sicher, dass Sie auf dem neuesten Stand sind.
git fetch
[Dies kann erforderlich sein (abhängig von Ihrer Git-Konfiguration), um Updates zu Origin / Master zu erhalten.]# Führen Sie den Feature-Zweig in den Hauptzweig ein.
# Setzen Sie den Hauptzweig auf den Ursprungsstatus zurück.
# Versehentlich eine Datei aus dem lokalen gelöscht, wie kann man sie wieder abrufen?
git status
Führen Sie a aus , um den vollständigen Dateipfad der gelöschten Ressource abzurufendas ist es!
# Hauptzweig mit einem anderen Zweig zusammenführen
#rename lokaler Zweig
# lokalen Zweig löschen
# Remote-Zweig löschen
oder
# ein Commit zurücksetzen, das bereits in ein Remote-Repository übertragen wurde
#branch von einem früheren Commit mit GIT
#Change Commit-Nachricht des letzten Commits, das bereits auf Remote übertragen wurde
# Alle lokalen Commits in diesem Zweig verwerfen [Lokale Commits entfernen]
Um alle lokalen Commits in diesem Zweig zu verwerfen und den lokalen Zweig mit dem "Upstream" dieses Zweigs identisch zu machen, führen Sie ihn einfach aus
Referenz: http://sethrobertson.github.io/GitFixUm/fixup.html oder do
git reset --hard origin/master
[wenn der lokale Zweig Master ist]# Ein Commit zurücksetzen, das bereits in ein Remote-Repository übertragen wurde?
# Löschen Sie ein vorheriges Commit vom lokalen Zweig und vom Remote-Zweig
Anwendungsfall: Sie haben gerade eine Änderung in Ihrer lokalen Niederlassung vorgenommen und sofort in die entfernte Niederlassung verschoben. Plötzlich wurde Ihnen klar: Oh nein! Ich brauche diese Änderung nicht. Jetzt was machen?
git reset --hard HEAD~1
[zum Löschen dieses Commits aus dem lokalen Zweig. 1 bezeichnet das EINE Commit, das Sie gemacht haben]git push origin HEAD --force
[Beide Befehle müssen ausgeführt werden. Zum Löschen aus der Gegenstelle]. Der aktuell ausgecheckte Zweig wird als der Zweig bezeichnet, in dem Sie diesen Vorgang ausführen.#Löschen Sie einige der letzten Commits aus dem lokalen und Remote-Repo und behalten Sie das gewünschte Commit bei. (eine Art Zurücksetzen von Commits von lokal und remote)
Nehmen wir an, Sie haben 3 Commits, die Sie an den Remote-Zweig mit dem Namen '
develop
' gesendet haben.Zurück zum alten Commit (um den Status der Verzweigung zu ändern)
git log --oneline --decorate --graph
// um alle deine Commitids zu sehengit clean -d -f
// alle lokalen Änderungen bereinigengit reset --hard commitid-1
// lokal auf dieses Commitid zurückgreifengit push -u origin +develop
// diesen Status auf Remote verschieben. + Force Push# Lokale Git-Zusammenführung entfernen: Fall: Ich bin im Hauptzweig und habe den Hauptzweig mit einer neu funktionierenden Zweigphase2 zusammengeführt
Auf Zweigstamm
$ git merge phase2
$ git status
Auf Zweigstamm
Ihre Filiale liegt 8 Commits vor 'origin / master' .
F: Wie kann man diese lokale Git-Zusammenführung loswerden? Versucht
git reset --hard
undgit clean -d -f
beide haben nicht funktioniert. Das einzige, was funktioniert hat, ist eines der folgenden:$ git reset - harter Ursprung / Master
oder
$ git reset --hard HEAD ~ 8
oder
$ git reset --hard 9a88396f51e2a068bb7
[sha Commit-Code - Dies ist der Code, der vorhanden war, bevor alle Ihre Merge-Commits stattfanden.]# Gitignore-Datei erstellen
touch .gitignore
// Erstelle die Datei in Mac- oder Unix-BenutzernBeispielinhalt von .gitignore:
Referenzlink zum GIT-Spickzettel: https://services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf
quelle
git push origin :branch-name
jedoch ich empfehle die Verwendung vongit push origin --delete branchname
Wie bei allem in Git gibt es mehrere Möglichkeiten, dies zu tun. Die beiden von Ihnen verwendeten Befehle sind eine Möglichkeit, dies zu tun. Eine andere Sache, die Sie hätten tun können, ist, sie einfach damit zu verstauen
git stash -u
. Das-u
stellt sicher , dass neu hinzugefügte Dateien (untracked) sind ebenfalls enthalten.Das Praktische daran
git stash -u
ist dasgit stash pop
(es ist wie das Löschen einer E-Mail in Google Mail, die Sie einfach rückgängig machen können, wenn Sie Ihre Meinung danach ändern).Ab Ihrer anderen Frage
git reset --hard
werden die nicht verfolgten Dateien nicht entfernt, sodass Sie die weiterhin benötigengit clean -f
. Aber agit stash -u
könnte am bequemsten sein.quelle
git reset --hard
nicht untracked entfernen Dateien in der Tat, aber es wird nicht verfolgte Änderungen zu entfernen, ändert sich also auf Dateien, die bereits im Index enthalten sind. Ich bin sicher, das hast du gemeint :)git stash -u
, sah ich diese Antwort von Git Bash. "Gespeichertes Arbeitsverzeichnis und Indexstatus WIP auf {branchname}. Möglicherweise können wir dieses gespeicherte Verzeichnis mit abrufengit stash pop
.git stash -u
tut und wie es zu knallen ist, aber Frederik ließ mich wissen, dass es hart zurückgesetzt wurde und die Kombination vongit reset --hard
und verwendetegit clean -f
, und warum nicht,stash
wird in einigen Szenarien bevorzugt. Bitte helfen Sie mir bei der Auswahl, welche ich als Antwort markieren soll :), beide sind meine Antworten.1. Wenn Sie Ihre lokalen Änderungen überhaupt nicht beibehalten möchten.
Dieser Befehl entfernt alle lokalen Änderungen vollständig aus Ihrem lokalen Repository. Dies ist der beste Weg, um Konflikte während des Pull-Befehls zu vermeiden, nur wenn Sie Ihre lokalen Änderungen überhaupt nicht beibehalten möchten.
2. Wenn Sie Ihre lokalen Änderungen beibehalten möchten
Wenn Sie die neuen Änderungen von der Fernbedienung abrufen und die lokalen Änderungen während dieses Abrufs ignorieren möchten, dann
Es werden alle lokalen Änderungen gespeichert. Jetzt können Sie die Remote-Änderungen abrufen.
Jetzt können Sie Ihre lokalen Änderungen zurückbringen, indem Sie:
quelle
git reset --hard
entfernt nicht alle lokalen Änderungen. Es werden nur die Änderungen entfernt. Wenn Sie Adds entfernen möchten, müssen Sie auchgit clean -fd
Verwenden:
Verwerfen der Änderungen im Arbeitsverzeichnis.
quelle
Ich denke, Git hat eine Sache, die nicht klar dokumentiert ist. Ich denke, es wurde tatsächlich vernachlässigt.
git checkout .
Mann, du hast meinen Tag gerettet. Ich habe immer Dinge, die ich mit dem geänderten Code versuchen möchte. Aber manchmal führen die Dinge dazu, dass der geänderte Code durcheinander gebracht wird, neue nicht verfolgte Dateien hinzugefügt werden usw. Ich möchte also das inszenieren, was ich will, die unordentlichen Dinge erledigen, dann schnell aufräumen und festschreiben, wenn ich glücklich bin.
Es
git clean -fd
funktioniert gut für nicht verfolgte Dateien.Dann
git reset
entfernt einfach inszeniert, ist aber etwasgit checkout
zu umständlich. Es ist nicht immer ideal, eine Datei einzeln anzugeben oder Verzeichnisse zu verwenden. Manchmal befinden sich die geänderten Dateien, die ich entfernen möchte, in Verzeichnissen, die ich behalten möchte. Ich wünschte mir diesen einen Befehl, der nur nicht bereitgestellte Änderungen entfernt, und hier sind Sie. Vielen Dank.Aber ich denke, sie sollten einfach
git checkout
ohne Optionen sein, alle nicht bereitgestellten Änderungen entfernen und die inszenierten nicht berühren. Es ist irgendwie modular und intuitiv. Eher wie wasgit reset
macht.git clean
sollte auch das gleiche tun.quelle
Am besten überprüfen Sie die Änderungen.
Wenn Sie die Datei pom.xml in einem Projekt mit dem Namen Projektname ändern, können Sie Folgendes tun:
quelle
Wenn Sie alles verwerfen möchten, was ich gerne verstauen und ablegen möchte, ist dies der schnellste Weg, um alles zu verwerfen, insbesondere wenn Sie zwischen mehreren Repos arbeiten.
Dadurch werden alle Änderungen im
{0}
Schlüssel gespeichert und sofort gelöscht{0}
git stash && git stash drop
quelle
Überprüfen Sie zunächst, ob Ihre wichtige Änderung gespeichert wurde oder nicht durch:
als versuchen
aber wenn Sie nur rückgängig machen müssen:
Lesen Sie mehr >> https://git-scm.com/docs/git-reset
quelle