Wie verstaue ich nur ungestaffelte Änderungen in Git?

Lesezeit: 7 Minuten

Wie verstaue ich nur ungestaffelte Anderungen in Git
Unapiedra

Ich möchte diesen Workflow verwenden:

  1. Nehmen Sie einige Änderungen vor.
  2. Speichern Sie die nicht bereitgestellten Änderungen im Stash.
  3. Machen Sie einige Dinge mit den Dingen in der Phase (Build, Test usw.).
  4. Verpflichten.
  5. 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

Wie verstaue ich nur ungestaffelte Anderungen in Git
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

1643909288 845 Wie verstaue ich nur ungestaffelte Anderungen in Git
alesguzik

Dies kann in 3 Schritten erfolgen: gespeicherte Änderungen speichern, alles andere verstauen, Index mit schrittweisen Änderungen wiederherstellen. Was ist im Grunde:

git commit -m 'Save index'
git stash push -u -m 'Unstaged changes and untracked files'
git reset --soft HEAD^

Dies wird genau das tun, was Sie wollen.

  • 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

1643909288 935 Wie verstaue ich nur ungestaffelte Anderungen in Git
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

1643909288 552 Wie verstaue ich nur ungestaffelte Anderungen in Git
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:

stash-working = "!f() { 
  git commit --quiet --no-verify -m "temp for stash-working" && 
  git stash push "$@" && 
  git reset --quiet --soft HEAD~1; }; f"

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


1643909288 397 Wie verstaue ich nur ungestaffelte Anderungen in Git
ma11hew28

Git hat keinen Befehl, der nur Ihre nicht bereitgestellten Änderungen speichert.

Git lässt Sie jedoch angeben, welche Dateien Sie speichern möchten.

git stash push --message 'Unstaged changes' -- app/controllers/products_controller.rb test/controllers/products_controller_test.rb

Wenn Sie nur bestimmte Änderungen in diesen Dateien speichern möchten, fügen Sie die --patch Möglichkeit.

git stash push --patch --message 'Unstaged changes' -- app/controllers/products_controller.rb test/controllers/products_controller_test.rb

Der --include-untracked Mit der Option können Sie nicht nachverfolgte Dateien verstauen.

git stash push --include-untracked --message 'Untracked files' -- app/controllers/widgets_controller.rb test/controllers/widgets_controller_test.rb

Lauf git help stash (oder man git-stash) Für mehr Information.

Hinweis: Wenn Ihre nicht inszenierten Änderungen eher disoganisiert sind, ist die Antwort von @alesguzik wahrscheinlich einfacher.

.

758070cookie-checkWie verstaue ich nur ungestaffelte Änderungen in Git?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy