337 Stimmen

Wie man nur unstaged Änderungen in Git stash?

Ich möchte diesen Arbeitsablauf verwenden:

  1. Nehmen Sie einige Änderungen vor.
  2. Speichern Sie die noch nicht umgesetzten Änderungen im Stash.
  3. Machen Sie etwas mit den Dingen in der Phase (bauen, testen, etc.).
  4. Verpflichten.
  5. Wiederherstellen der nicht bereitgestellten Änderungen.

Gibt es eine Möglichkeit, Schritt 2 auszuführen?

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

405voto

vhallac Punkte 12731

git stash push hat eine Option --keep-index das genau das tut, was Sie brauchen.

Also, lauf git stash push --keep-index .

82voto

Alesya Huzik Punkte 1342

Dies kann in 3 Schritten erfolgen: Speichern der Änderungen, Auslagern aller anderen Änderungen, Wiederherstellen des Index mit den Änderungen. Was im Grunde genommen bedeutet:

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

Damit wird genau das erreicht, was Sie wollen.

36voto

sehe Punkte 346808
git stash save --keep-index

Außerdem, Re:

Warum sollten Sie Ihre Änderungen nicht festschreiben, nachdem Sie sie bereitgestellt haben? - Schienbein

A: Weil man getesteten Code immer überprüfen sollte :) Das heißt, Sie müssen die Tests mit nur die Änderungen, die Sie gerade vornehmen wollen

Ganz abgesehen davon, dass Sie als erfahrener Programmierer natürlich den angeborenen Drang haben, genau diese Änderungen zu testen und zu überprüfen - nur <em>teilweise </em>scherzhaft

28voto

Raman Punkte 14828

Versteck Ohne die stufenweisen Veränderungen

Das Problem mit --keep-index / -k

Das Speichern nur des Arbeitsbaums (unstaged changes) in Git ist schwieriger als es sein sollte. Die akzeptierte Antwort und einige andere Antworten verbergen die unstaged changes und lassen den stage allein, wie es über --keep-index .

Was jedoch nicht offensichtlich ist, ist, dass --keep-index auch Verstecke die schrittweisen Änderungen. Die inszenierten Änderungen landen sowohl auf der Bühne als auch im Versteck. Dies ist in den seltensten Fällen erwünscht, da jede zwischenzeitliche Änderung des Verstecks zu Konflikten führen kann, wenn das Versteck später geknackt wird.

Alias-Lösung

Dieser Alias funktioniert gut, um die nur die Arbeitskopie ändert:

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

Es überträgt die bereitgestellten Änderungen vorübergehend, erstellt einen Stash aus den verbleibenden Änderungen (und erlaubt zusätzliche Argumente wie --include-untracked y --message als Alias-Argumente übergeben werden), und setzt dann die temporäre Übergabe zurück, um die bereitgestellten Änderungen wiederherzustellen.

Sie ist ähnlich wie die von @Simon Knapp Antwort mit ein paar kleinen Unterschieden - es verwendet --quiet über die vorübergehenden Aktionen und akzeptiert eine beliebige Anzahl von Parametern für den Vorrat push zu verwenden, anstatt die -m und es fügt hinzu --soft bis zum endgültigen Zurücksetzen, damit der Index so bleibt, wie er begonnen hat. Außerdem verwendet er --no-verify beim Commit, um Änderungen an der Arbeitskopie durch Pre-Commit-Hooks zu vermeiden (HT: @Granfalloner).

Für das gegenteilige Problem, nur die abgestuften Änderungen zu speichern (alias stash-index ) siehe diese Antwort .

23voto

Eugen Konkov Punkte 18206

Mit git version 2.7.4 können Sie tun:

git stash save --patch

En git werden Sie aufgefordert, Ihre Änderungen in den Vorrat aufzunehmen oder nicht.
Und Sie antworten dann einfach y o n

Sie können das Arbeitsverzeichnis wiederherstellen, wie Sie das immer tun:

git stash pop

oder wenn Sie gespeicherte Änderungen im Versteck behalten wollen:

git stash apply

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X