Wie verwerfe ich alle an einem Zweig vorgenommenen Änderungen?


116

Ich arbeite in einem Zweig (dh design) und habe eine Reihe von Änderungen vorgenommen, muss sie jedoch alle verwerfen und auf die Repository-Version zurücksetzen. Ich dachte, ich git checkout designwürde es tun, aber es sagt mir nur, dass ich bereits in der Filiale bin designund dass ich 3 geänderte Dateien habe.

Wie würde ich diese Änderungen verwerfen und den Zweig so erhalten, wie er jetzt auf dem Remote-Server steht?

Antworten:


207

Hinweis: Sie können dies nicht rückgängig machen .

Wenn Sie git checkout -fdies versuchen, werden alle lokalen Änderungen verworfen, die nicht in ALLEN Zweigen und im Master festgeschrieben sind .


86

git reset --hard kann Ihnen helfen, wenn Sie alles seit Ihrem letzten Commit wegwerfen möchten


6
odergit reset --hard HEAD^
Deadfish

27
git reset --hard HEAD^sollte wirklich die akzeptierte Antwort sein. OP fragte nicht nach anderen Zweigen ...
vphilipnyc

2
Ich habe es versucht und ich denke, es hat alles seit meinem letzten Push gelöscht, nicht nur mein letztes Commit.
Chase Roberts

3
Ich habe versucht, git zurückzusetzen --hard HEAD ^ und es blieben immer noch ein paar nicht verfolgte Dateien übrig. Nun zu Google, wie man sie mit einem einfachen Befehl entfernt.
John Deighan

20
git diff master > branch.diff
git apply --reverse branch.diff

Diese Schritte können sehr nützlich sein, wenn Ihr Ziel darin besteht, den Status eines bestimmten Zweigs so festzulegen, dass er dem Hauptzweig entspricht. Führen Sie dies aus dem jeweiligen Zweig aus und löschen Sie dann die .diff-Datei [Zweigstellenname], wenn Sie mitgit rm [branch name].diff
karolus

18

Wenn Sie keine Änderungen wünschen designund definitiv möchten, dass sie nur mit dem Zweig einer Fernbedienung übereinstimmen, können Sie den Zweig auch einfach löschen und neu erstellen:

# Switch to some branch other than design
$ git br -D design
$ git co -b design origin/design            # Will set up design to track origin's design branch

7
auch: Git Checkout Design; Git Reset - Hard Origin / Design
Dan

Ich würde mich auch verpflichten, bevor ich den Zweig
lösche

Wenn Sie Commits in der lokalen Niederlassung haben, die sich nicht auf der Fernbedienung befinden, ist dies meiner Meinung nach ein Rezept, um in wirklich verwirrende Situationen zu geraten. Ich würde diese Lösung definitiv nicht verwenden.
Erewok

1
@erewok: Nun, die Frage besagt ausdrücklich, dass der Fragesteller alle Änderungen verwerfen möchte.
Mipadi

Und ich glaube nicht, dass diese Antwort das erreicht.
Erewok

7

@ Will, Git Immersion ist ein wirklich schönes und einfaches Git-Tutorial. Es zeigt Ihnen, wie Sie Änderungen für die folgenden Fälle rückgängig machen können: nicht bereitgestellt, bereitgestellt und festgeschrieben. Labore 14-18


2
Ich möchte nur sagen, dass ich jetzt Git-Immersion gemacht habe ... über ein Jahr später. OI! Ich hätte das so viel früher tun sollen ...
Will

1
Dies muss Rubyinstalliert werden .. was nicht immer eine Wahl zu sein scheint
Vishnu

5

Wenn Sie Änderungen in Ihrem lokalen Zweig verwerfen möchten, können Sie diese Änderungen mit dem Befehl git stash speichern.

git stash save "some_name"

Ihre Änderungen werden gespeichert und können später abgerufen werden, wenn Sie möchten, oder Sie können sie löschen. Danach hat Ihr Zweig keinen nicht festgeschriebenen Code und Sie können den neuesten Code mit git pull aus Ihrem Hauptzweig ziehen.


4

Im Quellstamm: git reset ./ HEAD <--un-stage any staged changes git checkout ./ <--discard any unstaged changes


0

REVERSIBLE Methode zum Verwerfen aller Änderungen:

Ich fand diese Frage, nachdem ich eine Zusammenführung vorgenommen und vergessen hatte, sich unmittelbar danach zur Kasse zu entwickeln . Sie haben es erraten: Ich habe angefangen, einige Dateien direkt auf dem Master zu ändern . D'Oh! Da meine Situation kaum einzigartig ist (wir haben es alle getan, nicht wahr; ->), biete ich eine umkehrbare Möglichkeit an, alle Änderungen zu verwerfen, damit der Meister wieder wie entwickelt aussieht.

Nachdem ich a ausgeführt hatte, um git diffzu sehen, welche Dateien geändert wurden, und den Umfang meines Fehlers zu bewerten, führte ich Folgendes aus:

git stash
git stash clear

Nachdem alle Änderungen zuerst gespeichert worden waren, wurden sie als nächstes gelöscht. Alle Änderungen, die an den fehlerhaften Master- Dateien vorgenommen wurden, wurden entfernt und die Parität wiederhergestellt.

Angenommen, ich wollte diese Änderungen jetzt wiederherstellen. Ich kann dies tun. Der erste Schritt besteht darin, den Hash des Stashs zu finden, den ich gerade gelöscht / gelöscht habe:

git fsck --no-reflog | awk '/dangling commit/ {print $3}'

Nachdem ich den Hash gelernt hatte, stellte ich die nicht festgeschriebenen Änderungen erfolgreich wieder her mit:

git stash apply hash-of-cleared-stash

Ich wollte diese Änderungen nicht wirklich wiederherstellen, sondern nur überprüfen, ob ich sie zurückerhalten kann, also habe ich sie erneut gelöscht.

Eine andere Möglichkeit besteht darin , den Stash auf einen anderen Zweig anzuwenden , anstatt die Änderungen zu löschen. Wenn Sie also Änderungen löschen, die durch die Arbeit am falschen Zweig vorgenommen wurden, haben stashSie viel Flexibilität, um sich von Ihrem Boo-Boo zu erholen.

Wie auch immer, wenn Sie ein reversibles Mittel zum Löschen von Änderungen an einem Zweig wünschen, ist das Vorstehende in diesem Anwendungsfall weniger gefährlich.


-1

git checkout -f

Dies ist ausreichend für Ihre Frage. Das einzige, was einmal getan ist, ist getan. Es gibt kein Rückgängigmachen.

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.