Ich ♥ git stash -p
. Aber manchmal nach einer Befriedigung Sitzung y
, n
und s
bekomme ich diese:
Saved working directory and index state WIP on foo: 9794c1a lorum ipsum
error: patch failed: spec/models/thing_spec.rb:65
error: spec/models/thing_spec.rb: patch does not apply
Cannot remove worktree changes
Warum?
git add--interactive --patch=stash
nicht richtig funktioniert.add -p
Sie einfach alles, was Sie behalten möchten, in den Index aufnehmen und dannstash --keep-index
die anderen Teile verstauen.git add -p
: gist.github.com/nh2/…Antworten:
git stash -p
sollte mit Git 2.17 (Q2 2018) weniger scheitern.Zuvor war "
git add -p
" (mit dem die Logik geteilt wirdgit stash
) beim Zusammenführen von geteilten Patches faul, bevor das Ergebnis an das zugrunde liegende "git apply
" übergeben wurde, was zu Eckfallfehlern führte. Die Logik zum Vorbereiten des Patches, der angewendet werden soll, nachdem die Hunk-Auswahl verschärft wurde.Siehe Commit 3a8522f , Commit b3e0fcf , Commit 2b8ea7f (05. März 2018), Commit fecc6f3 , Commit 23fea4c , Commit 902f414 (01. März 2018) und Commit 11489a6 , Commit e4d671c , Commit 492e60c (19. Februar 2018) von Phillip Wood (
phillipwood
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 436d18f , 14. März 2018)(Hinzufügen, kann aber auch auf Stash angewendet werden)
Hier können Sie einige Tests sehen .
Git 2.19 verbessert sich
git add -p
: Wenn der Benutzer den Patch in "git add -p
" bearbeitet und der Editor des Benutzers so eingestellt ist, dass nachgestellte Leerzeichen wahllos entfernt werden, wird eine leere Zeile, die im Patch unverändert bleibt, vollständig leer (anstelle einer Zeile mit einem einzigen SP darauf).Der in Git 2.17 eingeführte Code konnte einen solchen Patch nicht analysieren, aber jetzt lernte er, die Situation zu bemerken und damit umzugehen.
Siehe Commit f4d35a6 (11. Juni 2018) von Phillip Wood (
phillipwood
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 5eb8da8 , 28. Juni 2018)Git 2.23 (Q3 2019) verbessert das
git add -p
von "git checkout -p
" verwendete, das selektiv einen Patch in umgekehrter Reihenfolge anwenden muss: Es hat vorher nicht gut funktioniert.Siehe Commit 2bd69b9 (12. Juni 2019) von Phillip Wood (
phillipwood
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 1b074e1 , 09. Juli 2019)Mit Git 2.25 (Q1 2020) werden die Bemühungen
git-add--interactive
fortgesetzt, das Perl-Skript nach C zu verschieben.Infolgedessen werden die oben genannten Korrekturen erneut implementiert.
Sehen Sie verpflichten 2e40831 , begehen 54d9d9b , begehen ade246e , begehen d6cf873 , begehen 9254bdf , begehen bcdd297 , begehen b38dd9e , begehen 11f2c0d , begehen 510aeca , begehen 0ecd9d2 , begehen 5906d5d , begehen 47dc4fd , begehen 80399ae , begehen 7584dd3 , begehen 12c24cf , begehen 25ea47a , verpflichten e3bd11b , Commit 1942ee4 , Commit f6aa7ec (13. Dezember 2019) vonJohannes Schindelin (
dscho
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 45b96a6 , 25. Dezember 2019)Vor Git 2.27 (Q2 2020)
git stash -p
funktioniert es nicht gut , dem Benutzer das Teilen eines Patch-Hunks zu ermöglichen, während " " nicht gut funktioniert. Ein Pflaster wurde hinzugefügt, damit dies (teilweise) besser funktioniert.Siehe Commit 7723436 , Commit 121c0d4 (08. April 2020) von Johannes Schindelin (
dscho
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit e81ecff , 28. April 2020)Git 2.29 (Q4 2020) bringt einen Leakfix zu
git add -p
(verwendet vonstash -p
)Siehe Commit 324efcf (07. September 2020) von Phillip Wood (
phillipwood
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 3ad8d3e , 18. September 2020)quelle
Dies passiert für mich jedes Mal, wenn ich versuche, ein Stück in kleinere Stücke aufzuteilen, die zu nahe beieinander liegen (weniger als 3 Zeilen zwischen den Änderungen). Die kurze Erklärung ist, dass der Patch Kontextzeilen enthält, die mit Ihren lokalen Änderungen in Konflikt stehen. Vollständigere Erklärung unten.
Angenommen, ich habe ein Git-Repo mit diesen nicht festgeschriebenen Änderungen:
Wenn ich die erste Änderung verwahre, bekomme ich:
Der
git stash
Befehl kann den Patch tatsächlich erfolgreich speichern (überprüfengit stash list
), aber dann verwendet git diesen Patch in umgekehrter Reihenfolge, um die versteckten Änderungen aus meinem Arbeitsverzeichnis zu entfernen. Der Kontext nach dem Stück hat "Sprünge", was nicht mit den "Spaziergängen" übereinstimmt, die sich noch in meinem Arbeitsverzeichnis befinden. Also steigt git mit ausund lässt alle Änderungen in meinem Arbeitsverzeichnis, und das Versteck wird so ziemlich wertlos.
Ich würde dies einen Fehler in der Unterstützung von Git's Hunk Splitting nennen. Wenn es weiß, dass die Änderungen zu eng aufgeteilt werden, kann es einige Kontextzeilen aus dem Patch entfernen oder den Patch so verschieben, dass die geänderten Kontextzeilen anstelle der makellosen vorhanden sind. Wenn das Teilen von Hunks, die so eng sind, offiziell nicht unterstützt wird, sollte es alternativ abgelehnt werden, Hunks, die so nahe sind, zu teilen.
quelle
git add -p
dem ich mich nie dafür entschieden habe, ein Stück aufzuteilen, sondern nury
/ sagten
.Nachdem
git stash -p
ich auf die gleiche Weise einen Fehler gemacht hatte, hatte ich Glück mit dieser Problemumgehung (Git 2.0.2):git add -p
Aufteilen der exakt gleichen Teile, jedoch mit umgekehrten Antworten ("y", umadd
"Änderungen beizubehalten", "n", umstash
Änderungen beizubehalten.)git stash -k
um den Index zu behalten und alles andere zu verstauengit reset
um weiter an meinen Dateien zu arbeitenIch bin mir nicht sicher, warum ich nicht
git add -p
auf die gleiche Weise gescheitert bingit stash -p
. Ich denke, weil das Hinzufügen mit dem Index funktioniert, anstatt eine Patch-Datei zu erstellen?quelle
Die derzeit akzeptierte Antwort kann leider auch in Git 2.17 noch fehlschlagen.
Wenn Sie wie ich viel Mühe darauf verwendet haben, das perfekte Versteck aufzubauen, und diese Mühe nicht wegwerfen möchten, ist es immer noch möglich, meistens das zu bekommen, was Sie wollen:
git stash show -p | patch -p1 -R
Dies schlägt bei Ablehnungen fehl, aber die Chancen stehen gut, dass die meisten Hunks korrekt angewendet werden und Sie zumindest die Zeit sparen, alle Dateien erneut zu überprüfen.
quelle
Das Anwenden des Staates kann mit Konflikten fehlschlagen. In diesem Fall wird es nicht aus der Stash-Liste entfernt. Sie müssen die Konflikte von Hand lösen und anschließend git stash drop manuell aufrufen
quelle
git stash pop
Fehler geeignet , nicht für einengit stash -p
Fehler.