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?

42voto

Michael Punkte 978

Um dasselbe zu erreichen...

  1. Stagen Sie nur die Dateien, an denen Sie arbeiten möchten.
  2. git commit -m 'temp'
  3. git add .
  4. git stash
  5. git reset HEAD~1

Knall. Die Dateien, die Sie nicht möchten, sind gestasht. Die Dateien, die Sie möchten, sind alle bereit für Sie.

24voto

Raman Punkte 14828

UPDATE Januar 2022: Git 2.35 wurde veröffentlicht, und stash unterstützt nun einen --staged-Parameter. Diese Antwort ist daher für Git 2.35+ veraltet. Siehe Antwort von vonc: https://stackoverflow.com/a/70231955/430128.

Alte Antwort:

Das Zwischenspeichern nur des Index (staged Änderungen) in Git ist schwieriger als es sein sollte. Ich habe festgestellt, dass die Antwort von @Joe gut funktioniert, und habe eine kleine Variante davon in dieses Alias umgewandelt:

stash-index = "!f() { \
  ! git diff --cached --exit-code --quiet && \
  git stash push --quiet --keep-index -m \"temp für stash-index\" && \
  git stash push \"$@\" && \
  git stash pop --quiet stash@{1} && \
  git stash show -p | git apply -R; }; f"

Es:

  1. Validiert, dass tatsächlich gestagte Änderungen vorliegen (git diff --cached --exit-code gibt einen Nicht-Null-Status zurück, wenn dies der Fall ist). HT: @nandilugio

  2. Es schiebt beides, die gestagten und die ungestagten Änderungen, in einen temporären Zwischenspeicher und lässt die gestagten Änderungen dabei in Ruhe.

  3. Dann schiebt es die gestagten Änderungen in den Zwischenspeicher, den wir behalten wollen. Argumente, die dem Alias übergeben werden, wie z. B. --message "irgendetwas", werden diesem Zwischenspeicher-Befehl hinzugefügt.

  4. Es nimmt den temporären Zwischenspeicher zurück und stellt den ursprünglichen Zustand wieder her, und entfernt dann den temporären Zwischenspeicher, und schließlich

  5. "entfernt" die zwischengespeicherten Änderungen aus dem Arbeitsverzeichnis durch eine Umkehr-Patch-Anwendung.

Für das gegenteilige Problem des Zwischenspeicherns nur der ungestagten Änderungen (Alias stash-working) siehe diese Antwort.

14voto

Shamps Punkte 488

In diesem Szenario ziehe ich es vor, für jedes Problem neue Branches zu erstellen. Ich verwende ein Präfix temp/, damit ich später diese Branches löschen kann.

git checkout -b temp/bug1

Die Dateien, die das Problem bug1 beheben, stagen und committen.

git checkout -b temp/bug2

Dann können Sie die Commits aus den jeweiligen Branches auswählen und einen Pull-Request einreichen.

13voto

Majid Sadr Punkte 673

7voto

knittl Punkte 214432

Warum bestätigen Sie die Änderung für einen bestimmten Fehler nicht und erstellen einen Patch aus diesem Commit und seinem Vorgänger?

# hackhackhack, beheben Sie zwei nicht zusammenhängende Fehler
git add -p                   # füge Abschnitte des ersten Fehlers hinzu
git commit -m 'Fehler #123 beheben' # erstelle Commit #1
git add -p                   # füge Abschnitte des zweiten Fehlers hinzu
git commit -m 'Fehler #321 beheben' # erstelle Commit #2

Dann, um die entsprechenden Patches zu erstellen, verwenden Sie git format-patch:

git format-patch HEAD^^

Dies erstellt zwei Dateien: 0001-fix-bug-123.patch und 0002-fix-bug-321.patch

Oder Sie können separate Branches für jeden Fehler erstellen, damit Sie Fehlerkorrekturen einzeln zusammenführen oder neu basieren können, oder sie sogar löschen, wenn sie nicht funktionieren.

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