So heben Sie das Commit des letzten nicht gepussten Git-Commits auf, ohne die Änderungen zu verlieren

539

Gibt es eine Möglichkeit, ein Commit zurückzusetzen, sodass meine lokale Kopie die in diesem Commit vorgenommenen Änderungen beibehält, diese jedoch zu nicht festgeschriebenen Änderungen in meiner Arbeitskopie werden? Wenn Sie ein Commit zurücksetzen, gelangen Sie zum vorherigen Commit. Ich möchte die vorgenommenen Änderungen beibehalten, habe sie jedoch in den falschen Zweig übernommen.

Dies wurde nicht vorangetrieben, sondern nur begangen.

Mr. Boy
quelle
6
git reset --softund git reset --mixedbeide tun dies (etwas anders), siehe git-reset
torek

Antworten:

930

Es gibt viele Möglichkeiten, zum Beispiel:

falls Sie das Commit noch nicht öffentlich gemacht haben:

git reset HEAD~1 --soft   

Das war's, Ihre Commit-Änderungen befinden sich in Ihrem Arbeitsverzeichnis, während das LAST-Commit aus Ihrem aktuellen Zweig entfernt wird. Siehe git reset man


Falls Sie tut Push öffentlich (auf einem Zweig namens ‚Master‘):

git checkout -b MyCommit //save your commit in a separate branch just in case (so you don't have to dig it from reflog in case you screw up :) )

normales Commit zurücksetzen und drücken

git checkout master
git revert a8172f36 #hash of the commit you want to destroy
# this introduces a new commit (say, it's hash is 86b48ba) which removes changes, introduced in the commit in question (but those changes are still visible in the history)
git push origin master

Wenn Sie diese Änderungen nun als lokale Änderungen in Ihrer Arbeitskopie haben möchten ("damit Ihre lokale Kopie die in diesem Commit vorgenommenen Änderungen beibehält"), setzen Sie das Zurücksetzen-Commit einfach mit der folgenden --no-commitOption zurück:

git revert --no-commit 86b48ba (hash of the revert commit).

Ich habe ein kleines Beispiel erstellt: https://github.com/Isantipov/git-revert/commits/master

Isantipov
quelle
5
Vielen Dank, in meinem Fall hatte ich zwei Commits, die ich abbrechen wollte, und zweimal hintereinander 'git reset HEAD ~ 1 --soft' brachte mich dahin, wo ich sein musste.
Geoff Gunter
2
Um ein wenig Klarheit zu schaffen, wenn Sie keine CLI verwenden, resetlautet der erste erwähnte Befehl "sanft" auf 1 Umdrehung vor dem Kopf zurückgesetzt, wodurch alle lokalen Änderungen erhalten bleiben. Dies war mir für die Verwendung in SourceTree nicht sofort klar. Stellen Sie einfach sicher, dass Sie sanft auf die vorherige Umdrehung zurücksetzen, nicht auf die Umdrehung, die Sie zurücksetzen möchten
Jon B
1
Ich habe den "bereits gepushen" Ansatz ausprobiert und er funktioniert bei Git 2.14.1 nicht: Er sagt, "Already up to date"wann die Zusammenführung durchgeführt wird.
Fabio A.
1
@ FabioA. Ich habe die Antwort mit einer funktionierenden Version aktualisiert. Danke, dass du das bemerkt hast!
Isantipov
1
Das funktioniert nicht. Ich habe das Zurücksetzen und Festschreiben übersprungen und nur das Git zurückgesetzt und herausgeschoben ... jetzt sind die Änderungen vielleicht noch nicht sicher verloren ... zum Glück habe ich ein Backup erstellt, hoffentlich auf einfache Weise, dass eines noch funktioniert;) Andernfalls können Änderungen von diesem kopiert werden .
Skybuck Flying
13

Wenn Sie die Änderungen übernommen haben, können Sie undosie verwenden und die Dateien wieder auf die Bühne verschieben, ohne einen anderen Zweig zu verwenden.

git show HEAD > patch
git revert HEAD
git apply patch

Es wird eine Patch-Datei erstellt, die die letzten Zweigänderungen enthält. Dann werden die Änderungen rückgängig gemacht. Wenden Sie zum Schluss die Patch-Dateien auf den Arbeitsbaum an.

Aminadav Glickshtein
quelle
Vielleicht möchten Sie rm patchauch
Max Coplan
6

Für den Fall: "Dies wurde nicht gepusht, sondern nur festgeschrieben ." - Wenn Sie IntelliJ (oder eine andere JetBrains-IDE) verwenden und noch keine Änderungen vorgenommen haben , können Sie dies als Nächstes tun.

  1. Gehen Sie zum Versionskontrollfenster ( Alt + 9 / Befehl + 9 ) - Registerkarte "Protokoll".
  2. Klicken Sie mit der rechten Maustaste auf ein Commit vor Ihrem letzten.
  3. Setzen Sie den aktuellen Zweig auf hier zurück
  4. wähle Soft (!!!)
  5. Klicken Sie unten im Dialogfenster auf die Schaltfläche Zurücksetzen.

Erledigt.

Dadurch werden Ihre Änderungen "aufgehoben" und Ihr Git-Status wird auf den Punkt vor Ihrem letzten lokalen Festschreiben zurückgesetzt. Sie verlieren keine Änderungen, die Sie vorgenommen haben.

Eduard Streltsov
quelle
2
Ich liebe es, JetBrains zu lernen, danke! Das entspricht git reset --soft "HEAD^"übrigens Windows. :)
Payne
3

Bei mir passiert es meistens, wenn ich Änderungen in den falschen Zweig schiebe und später realisiere. Und folgende Arbeiten in den meisten Fällen.

git revert commit-hash
git push

git checkout my-other-branch
git revert revert-commit-hash
git push
  1. Setzen Sie das Commit zurück
  2. (erstellen und) anderen Zweig auschecken
  3. Zurücksetzen
Mubashar
quelle
1
Ich habe das getestet. Ihr Ansatz funktioniert auch, wenn Sie nicht auf Remote geschoben haben. $ git revert <commit-hash> ... dann checkt einen anderen Zweig aus und gibt $ git revert <revert-commit-hash> ein (ohne die Pushs). Vielen Dank für diesen einfachen Ansatz!
Natalie Cottrill
1

Bitte stellen Sie sicher, dass Sie Ihre Änderungen sichern, bevor Sie diese Befehle in einem separaten Ordner ausführen

git checkout branch_name

Kasse in Ihrer Filiale

git merge --abort

Brechen Sie die Zusammenführung ab

Git-Status

Überprüfen Sie den Status des Codes, nachdem Sie die Zusammenführung abgebrochen haben

git reset --hard origin / branch_name

Dieser Befehl setzt Ihre Änderungen zurück und richtet Ihren Code an dem Code branch_name (branch) aus.

Mohit Singh
quelle
1

2020 einfacher Weg:

git reset <commit_hash>

Commit-Hash des letzten Commits, das Sie behalten möchten.

Xys
quelle