Wie verstaue ich nur ungestaffelte Änderungen in Git?
Lesezeit: 7 Minuten
Unapiedra
Ich möchte diesen Workflow verwenden:
Nehmen Sie einige Änderungen vor.
Speichern Sie die nicht bereitgestellten Änderungen im Stash.
Machen Sie einige Dinge mit den Dingen in der Phase (Build, Test usw.).
Verpflichten.
Stellen Sie die nicht bereitgestellten Änderungen wieder her.
Gibt es eine Möglichkeit, Schritt 2 zu tun?
Beispiel:
git init
echo one >file
git add file
git commit
echo two >>file
git add file
echo three >>file
git stash push
test
git commit
git stash pop
Warum übertragen Sie Ihre Änderungen nicht, nachdem Sie sie bereitgestellt haben?
– Schizzmo
4. Oktober 11 um 16:08 Uhr
IIRC –keepindex macht genau das
– sehen
4. Oktober 11 um 16:11 Uhr
Denn wenn, sagen wir, der Build fehlschlägt, möchte ich kein Commit davon haben. Ich weiß, dass ich den Commit löschen kann, aber ich möchte dies möglichst ohne Commit tun.
– Unapiedra
4. Oktober 11 um 16:12 Uhr
Sehe, danke. Ich kann bestätigen, dass das funktioniert. Gee, ich habe mir das Handbuch angeschaut linux.die.net/man/1/git-stash was veraltet ist. man git stash ist viel besser.
– Unapiedra
4. Oktober 11 um 16:17 Uhr
es ist –keep-index, fwiw.
– jaf0
24. Juni 14 um 21:34 Uhr
vhallac
git stash push hat eine Möglichkeit --keep-index das macht genau das was du brauchst.
Also, lauf git stash push --keep-index.
Wahr. Ich benutze weiter save mit git stash. Vielleicht ist es der Programmierer in mir, der darauf besteht, die Symmetrie mit apply/pop zu ehren. 🙂
– vhallac
4. Oktober 11 um 16:22 Uhr
Hinweis: Dies ist immer noch ein Versteck alle Ihre Änderungen; der einzige unterschied zu normal git stash save ist, dass es die bereits inszenierten Änderungen auch in Ihrer Arbeitskopie belässt. Im obigen Workflow würde dies gut funktionieren, da Sie den Stash nur auf eine lokale Kopie anwenden, die bereits die Hälfte der Änderungen des Stashs enthält (die Git intelligent genug ist, um sie zu ignorieren). Aber wenn Sie den Code bearbeiten, bevor Sie den Stash erneut anwenden, könnten Sie möglicherweise Zusammenführungskonflikte sehen, wenn Sie sich bewerben. Fyi.
– Peterflynn
4. März 14 um 6:09 Uhr
@ytpete Das hat mich schon so oft gebissen. Ich wünschte wirklich, es gäbe eine Möglichkeit für Git, nur die Dinge zu verstauen, die Sie nicht behalten … Ich übertrage oft Sachen und mache dann einen vollständigen Git-Versteck, weil ich weiß, dass ich es kann git commit --ammend wenn es Probleme bei dem gibt, was ich begangen habe.
– rjmunro
8. April 14 um 10:11 Uhr
Diese Lösung funktioniert bei mir aufgrund der von peterflynn beschriebenen Probleme nicht. Es ist keine gute Antwort auf die Frage, da es immer noch die inszenierten Änderungen verbirgt. Hat jemand eine bessere Lösung?
– Benutzer643011
18. März 17 um 14:29 Uhr
Docs scheinen das zu sagen stash save ist jetzt veraltet: “Diese Option wird zugunsten von veraltet git stash push. Es unterscheidet sich von “stash push” darin, dass es keine Pfadspezifikationen entgegennehmen kann und alle Nicht-Optionsargumente die Nachricht bilden.”
– jokul
27. August 19 um 20:14 Uhr
alesguzik
Dies kann in 3 Schritten erfolgen: gespeicherte Änderungen speichern, alles andere verstauen, Index mit schrittweisen Änderungen wiederherstellen. Was ist im Grunde:
Notiz: -u verstaut auch nicht nachverfolgte Dateien.
– ma11hew28
17. Dezember 18 um 22:28 Uhr
Dieser Ansatz dupliziert im Wesentlichen was git stash save --keep-index macht viel mehr Arbeit. Ich sehe keine Vorteile.
– Inigo
1. Februar 20 um 22:55 Uhr
@vas Nein, der Ansatz dupliziert das nicht. Siehe peterflynns Kommentar zur akzeptierten Antwort.
– Alexander Klauer
10. März 20 um 17:30 Uhr
Ausgezeichnet, aber der Zweck des Verstauens nicht inszenierter Änderungen bestand darin, inszenierte Änderungen zu testen Vor sie zu begehen. Es macht also keinen Sinn, Ihren dritten Befehl auszuführen git reset --soft HEAD^.
– Maggyero
30. Januar um 2:33 Uhr
git stash save --keep-index
Auch Re:
Warum übertragen Sie Ihre Änderungen nicht, nachdem Sie sie bereitgestellt haben? – Schienbein
A: Weil Sie immer getesteten Code einchecken sollten 🙂 Das heißt, Sie müssen die Tests mit ausführen nur die Änderungen, die Sie übernehmen werden
All dies abgesehen davon, dass Sie als erfahrener Programmierer natürlich den angeborenen Drang haben, genau diese Änderungen zu testen und zu überprüfen – nur teilweise scherzhaft
Eugen Konkow
Mit git version 2.7.4 Sie können Folgendes tun:
git stash save --patch
Der git wird Sie auffordern, Ihre Änderungen in den Stash hinzuzufügen oder nicht.
Und du antwortest dann einfach y oder n
Sie können das Arbeitsverzeichnis wie immer wiederherstellen:
git stash pop
oder, wenn Sie gespeicherte Änderungen im Stash behalten möchten:
git stash apply
Raman
Versteck Ohne die inszenierten Änderungen
Das Problem mit --keep-index / -k
Nur den funktionierenden Baum (nicht bereitgestellte Änderungen) in Git zu stashen, ist schwieriger, als es sein sollte. Die akzeptierte Antwort und einige andere Antworten verstauen die nicht inszenierten Änderungen und verlassen die Bühne wie angefordert über --keep-index.
Was jedoch nicht offensichtlich ist, ist das --keep-index Auch Verstecke die inszenierten Veränderungen. Die inszenierten Änderungen landen sowohl in der Bühne als auch im Stash. Dies ist selten das, was man möchte, da alle zwischenzeitlichen Änderungen am Stash wahrscheinlich zu Konflikten führen, wenn man das Stash später platzen lässt.
Alias-Lösung
Dieser Alias funktioniert gut für die Bühne einfach die Arbeitskopie ändert sich:
Es schreibt die inszenierten Änderungen vorübergehend fest, erstellt einen Stash aus den verbleibenden Änderungen (und erlaubt zusätzliche Argumente wie z --include-untracked und --message als Alias-Argumente übergeben werden) und setzt dann den temporären Commit zurück, um die bereitgestellten Änderungen wiederherzustellen.
Es ähnelt der Antwort von @Simon Knapp, jedoch mit einigen geringfügigen Unterschieden – es wird verwendet --quiet auf den durchgeführten temporären Aktionen und akzeptiert eine beliebige Anzahl von Parametern für den Stash pushanstatt die -mund es fügt hinzu --soft bis zum endgültigen Zurücksetzen, damit der Index so bleibt, wie er gestartet wurde. Es verwendet auch --no-verify beim Commit, um Änderungen an der Arbeitskopie durch Pre-Commit-Hooks zu vermeiden (HT: @Granfalloner).
Für das entgegengesetzte Problem, nur die inszenierten Änderungen (alias stash-index) siehe diese Antwort.
Als weitere Verbesserung dieses Snippets lohnt es sich, es hinzuzufügen --no-verify Option zu git commitandernfalls könnte das implizite temporäre Commit das Arbeitsverzeichnis aufgrund des Pre-Commit-Hooks ernsthaft durcheinander bringen.
– Granfalloner
16. Dezember 2020 um 17:52 Uhr
Führen Sie den folgenden Befehl aus, um die nicht getaggten (nicht zum Commit hinzugefügten) Dateien zum Stash hinzuzufügen:
git stash -k
Wenn Sie neu hinzugefügte Dateien (die nicht bereitgestellt werden – nicht grün) auch in den Stash aufnehmen möchten, gehen Sie wie folgt vor:
git stash -k -u
Dann können Sie die bereitgestellten Dateien festschreiben. Danach können Sie die zuletzt gespeicherten Dateien mit dem folgenden Befehl wiederherstellen:
git stash pop
Als weitere Verbesserung dieses Snippets lohnt es sich, es hinzuzufügen --no-verify Option zu git commitandernfalls könnte das implizite temporäre Commit das Arbeitsverzeichnis aufgrund des Pre-Commit-Hooks ernsthaft durcheinander bringen.
– Granfalloner
16. Dezember 2020 um 17:52 Uhr
ma11hew28
Git hat keinen Befehl, der nur Ihre nicht bereitgestellten Änderungen speichert.
Git lässt Sie jedoch angeben, welche Dateien Sie speichern möchten.
Warum übertragen Sie Ihre Änderungen nicht, nachdem Sie sie bereitgestellt haben?
– Schizzmo
4. Oktober 11 um 16:08 Uhr
IIRC –keepindex macht genau das
– sehen
4. Oktober 11 um 16:11 Uhr
Denn wenn, sagen wir, der Build fehlschlägt, möchte ich kein Commit davon haben. Ich weiß, dass ich den Commit löschen kann, aber ich möchte dies möglichst ohne Commit tun.
– Unapiedra
4. Oktober 11 um 16:12 Uhr
Sehe, danke. Ich kann bestätigen, dass das funktioniert. Gee, ich habe mir das Handbuch angeschaut linux.die.net/man/1/git-stash was veraltet ist.
man git stash
ist viel besser.– Unapiedra
4. Oktober 11 um 16:17 Uhr
es ist –keep-index, fwiw.
– jaf0
24. Juni 14 um 21:34 Uhr