699 Stimmen

Wie kann ich nur zwischengespeicherte Änderungen in Git verwerfen?

Gibt es eine Möglichkeit, nur meine gestageten Änderungen zu verstecken? Das Szenario, mit dem ich Probleme habe, ist, wenn ich gleichzeitig an mehreren Fehlern gearbeitet habe und mehrere nicht gestagete Änderungen habe. Ich möchte in der Lage sein, diese Dateien einzeln zu stagen, meine .patch-Dateien zu erstellen und sie wegzulegen, bis der Code genehmigt ist. Auf diese Weise kann ich, wenn er genehmigt ist, meine gesamte (aktuelle) Sitzung verstecken, diesen Bug auspacken und den Code pushen.

Gehe ich das falsch an? Verstehe ich nicht, wie git auf andere Weise arbeiten kann, um meinen Prozess zu vereinfachen?

752voto

Bartłomiej Semańczyk Punkte 56307

Ja, das ist möglich mit DOUBLE STASH

  1. Stagen Sie alle Dateien, die Sie stachen möchten.
  2. Führen Sie git stash --keep-index aus. Dieser Befehl wird ein Stash mit ALLEN Änderungen (gestaged und ungestaged) erzeugen, aber die gestagten Änderungen in Ihrem Arbeitsverzeichnis belassen (immer noch im gestagten Zustand).
  3. Führen Sie git stash push -m "guter stash" aus (fügen Sie die -u Flagge hinzu, um neue Dateien im Stash einzuschließen)
  4. Jetzt hat Ihr "guter stash" NUR gestagte Dateien.

Wenn Sie jetzt ungestagte Dateien vor dem Stash benötigen, wenden Sie einfach zuerst den Stash an (der mit --keep-index erstellt wurde) und jetzt können Sie Dateien entfernen, die Sie in den Stash gesteckt haben.

Viel Spaß

287voto

Eugen Konkov Punkte 18206

git stash push -S

Erstellen Sie für diesen Befehl das Alias: git config --global alias.stashs 'stash push -S'.

Hier finden Sie, wie Sie nur nicht festgelegte Änderungen in den Stash legen können.

ALT
git stash push --staged # seit 2.35

Legen Sie nur die Änderungen in den Stash, die aktuell festgelegt sind. Dies ähnelt dem grundlegenden git commit, mit dem Unterschied, dass der Zustand in den Stash anstatt in den aktuellen Branch übernommen wird.

ALT

Mit der neuesten Git-Version können Sie die Option --patch verwenden

git stash push --patch   # seit 2.14.6

git stash save --patch   # für ältere Git-Versionen

Und Git wird Sie für jede Änderung in Ihren Dateien fragen, ob Sie sie dem Stash hinzufügen möchten oder nicht.
Sie antworten einfach mit y oder n

ALT AKT
Alias für DOPPELSTASH:

git config --global alias.stash-staged '!bash -c "git stash --keep-index; git stash push -m "staged" --keep-index; git stash pop stash@{1}"'

Jetzt können Sie Ihre Dateien festlegen und dann git stash-staged ausführen.
Als Ergebnis werden Ihre festgelegten Dateien im Stash gespeichert.

Wenn Sie Ihre festgelegten Dateien nicht behalten möchten und sie in den Stash verschieben möchten, können Sie ein weiteres Alias hinzufügen und git move-staged ausführen:

git config --global alias.move-staged '!bash -c "git stash-staged;git commit -m "temp"; git stash; git reset --hard HEAD^; git stash pop"'

192voto

Somo S. Punkte 3697

UPDATE 2022-04-21

Verwenden Sie einfach die Antwort von @VonC, die der neue idiomatische Ansatz für die ursprüngliche Frage ist https://stackoverflow.com/a/70231955/2959469


TL;DR FÜR DEN ALTEN ANSATZ Fügen Sie einfach -- $(git diff --staged --name-only) für Ihren git Parameter hinzu

Hier ist ein einfacher Einzeiler:

git stash -- $(git diff --staged --name-only)

Und um eine Nachricht hinzuzufügen einfach:

git stash push -m "Meine laufende Arbeit" -- $(git diff --staged --name-only)

Getestet unter v2.17.1 und v2.21.0.windows.1

Einschränkungen:

  • Bitte beachten Sie, dass dadurch alles gestasht wird, wenn Sie keine Dateien gestaged haben.
  • Außerdem, wenn Sie eine Datei haben, die nur teilweise gestaged ist (d.h. nur einige geänderte Zeilen sind gestaged, während andere geänderte Zeilen nicht gestaged sind), wird die gesamte Datei gestasht (einschließlich nicht gestager Zeilen).

141voto

VonC Punkte 1117238

Mit Git 2.35 (Q1 2022) hat "git stash"(man) die Option --staged gelernt, um das, was dem Index hinzugefügt wurde (und nichts anderes), zu verstecken.

Dies wird also jetzt offiziell unterstützt (8 Jahre später).

Siehe Commit a8a6e06 (28. Okt 2021) und Commit 41a28eb (18. Okt 2021) von Sergey Organov (sorganov).
(Eingefügt von Junio C Hamano -- gitster -- in Commit 44ac8fd, 29. Nov 2021)

stash: 'push' und 'save' implementieren die Option '--staged'

Unterzeichnet von: Sergey Organov

Nur die Änderungen speichern, die gestaged sind.

Dieser Modus ermöglicht es, Änderungen, die nichts mit der aktuellen Arbeit in Bearbeitung zu tun haben, leicht für spätere Verwendung zu speichern.

Anders als 'stash push --patch' unterstützt --staged die Verwendung eines beliebigen Tools zur Auswahl der Änderungen, die gespeichert werden sollen, einschließlich, aber nicht beschränkt auf 'git add --interactive'(man).

git stash enthält jetzt in seiner man page:

'git stash' [push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--quiet]

git stash enthält jetzt in seiner man page:

save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] []

git stash enthält jetzt in seiner man page:

-S

--staged

Diese Option ist nur gültig für die Befehle push und save.

Nur die Änderungen, die derzeit gestaged sind, speichern. Dies ist ähnlich wie ein grundlegender git commit, jedoch wird der Zustand nicht dem aktuellen Branch, sondern dem Stash committed.

Die Option --patch hat Vorrang vor dieser.

git stash enthält jetzt in seiner man page:

Unabhängige Änderungen für zukünftige Verwendung speichern

Wenn Sie mitten in massiven Änderungen stecken und ein ähnliches Problem finden, das Sie nicht vergessen wollen zu beheben, können Sie die Änderungen vornehmen, sie stagen und git stash push --staged verwenden, um sie für die spätere Verwendung zu verstecken.
Das ist ähnlich wie das Committen der gestageten Änderungen, nur dass das Commit im Stash und nicht im aktuellen Branch landet.

----------------------------------------------------------------
# ... hack hack hack ...
$ git add --patch foo           # fügen Sie nicht verwandte Änderungen dem Index hinzu
$ git stash push --staged       # speichern Sie diese Änderungen im Stash
# ... hack hack hack, beenden Sie die aktuellen Änderungen ...
$ git commit -m 'Massive'       # committen Sie vollständig getestete Änderungen
$ git switch fixup-branch       # wechseln Sie zu einem anderen Branch
$ git stash pop                 # um die gespeicherten Änderungen fertigzustellen
----------------------------------------------------------------

59voto

Joe Punkte 597

Ich habe ein Skript erstellt, das nur das sichert, was aktuell inszeniert ist und alles andere zurücklässt. Dies ist großartig, wenn ich anfange, zu viele nicht verwandte Änderungen vorzunehmen. Einfach das inszenieren, was nicht mit dem gewünschten Commit zusammenhängt, und nur das sichern.

(Danke an Bartomiej für den Ausgangspunkt)

#!/bin/bash

#Alles vorübergehend sichern. Behalte inszenierte Dateien, verwerfe alles andere nach dem Sichern.
git stash --keep-index

#Alles sichern, was übrig bleibt (nur die inszenierten Dateien sollten übrig bleiben). Das ist der Stash, den wir behalten wollen, also geben wir ihm einen Namen.
git stash save "$1"

#Den ursprünglichen Stash anwenden, um zurück zu kommen, wo wir angefangen haben.
git stash apply stash@{1}

#Ein vorübergehendes Patch erstellen, um die ursprünglich inszenierten Änderungen rückgängig zu machen und anwenden
git stash show -p | git apply -R

#Den vorübergehenden Stash löschen
git stash drop stash@{1}

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