wake-up-neo.com

Speichern Sie nur nicht inszenierte Änderungen in Git

Ich möchte den folgenden Arbeitsablauf ausführen:

  1. Fügen Sie der Bühne Änderungen hinzu. 
  2. Bewahren Sie alle anderen Änderungen auf, die nicht in Szene gesetzt wurden. 
  3. Machen Sie einige Dinge mit den Dingen in der Phase (d. H. Build, Ausführen von Tests usw.)
  4. Wenden Sie den Vorrat an. 

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

Beispiel

 echo "123" > foo
 git add foo # Assumes this is a git directory
 echo "456" >> foo
 git stash
 cat foo # Should yield 123
155
Unapiedra

git stash save hat eine Option --keep-index, die genau das macht, was Sie brauchen.

Führen Sie also git stash save --keep-index aus.

226
vhallac
git stash save --keep-index

Auch Re: 

Warum machen Sie Ihre Änderungen nicht fest, nachdem Sie sie bereitgestellt haben? - Shin 

A: Weil Sie immer den getesteten Code einchecken sollten. Das heißt, Sie müssen die Tests mit ausführen, nur mit den Änderungen, die Sie begehen.

Abgesehen davon, dass Sie als erfahrener Programmierer natürlich das angeborene Bedürfnis haben, genau diese Änderungen zu testen und zu überprüfen - nur teilweise ein Scherz

27
sehe

Dies kann in drei Schritten erfolgen: Speichern Sie gestaffelte Änderungen, speichern Sie alles andere, stellen Sie den Index mit gestaffelten Änderungen wieder her. Welches ist im Wesentlichen:

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.

21
alesguzik

Mit git version 2.7.4 können Sie Folgendes tun:

git stash save --patch

Die Variable git fordert Sie auf, Ihre Änderungen in Stash hinzuzufügen oder nicht.
Und Sie antworten dann einfach auf y oder n

Sie können das Arbeitsverzeichnis wie immer wiederherstellen:

git stash pop

oder, wenn Sie gespeicherte Änderungen im Speicher aufbewahren möchten:

git stash apply
10
Eugen Konkov

Bei der Erweiterung der vorherigen Antworten habe ich manchmal ein komplexes Set von Änderungen, möchte aber zuerst eine separate Änderung vornehmen. Ich habe zum Beispiel einen Fehler oder einen anderweitig falschen Code entdeckt, den ich vor meinen gestaffelten Änderungen beheben möchte. Eine mögliche Route ist folgende:

zuerst alles einlagern, aber die inszenierten Änderungen erhalten

$ git stash save --keep-index [--include-untracked]

verstecke jetzt die inszenierten Änderungen auch separat

$ git stash speichern

Änderungen vornehmen, um das Problem zu beheben; und testen; begehen sie:

$ git add [--interactive] [--patch]

$ git commit -m "fix ..."

stellen Sie jetzt die zuvor bereitgestellten Änderungen wieder her:

$ git Stash Pop

lösen Sie alle Konflikte, und beachten Sie, dass bei Konflikten git angewendet wurde, aber nicht diesen obersten Stash-Eintrag gelöscht hat.

(... Übernehmen Sie anschließend die inszenierten Änderungen, und stellen Sie den Speicher aller anderen Änderungen wieder her und fahren Sie fort ...)

5
Rhubbarb

Ein weiterer Tipp zur Frage:

Wenn Sie Ihre nicht mehr gespeicherten Änderungen effektiv mit verwahren

$ git stash save --keep-index

möglicherweise möchten Sie dem Stash eine Nachricht übermitteln, so dass bei einem git stash list das, was Sie zuvor gespeichert haben, offensichtlicher ist, insbesondere wenn Sie diesem Stash-Vorgang weitere Einsparungen folgen. Zum Beispiel

$ git stash save --keep-index "Änderungen noch nicht inszeniert"

(obwohl es tatsächlich alle Änderungen enthält, wie in anderen Antworten angegeben).

Zum Beispiel könnte auf das Obige unmittelbar folgen:

$ git stash save "inszenierte Änderungen für Feature X"

Passen Sie jedoch auf, dass Sie nicht verwenden können

$ git stash anwenden "stash @ {1}" ### ## tut nicht ganz das, was Sie möchten

um nur die nicht inszenierten Änderungen wiederherzustellen.

2
Rhubbarb

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

Mit Git können Sie jedoch angeben, welche Dateien gespeichert werden sollen.

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 Option --patch hinzu.

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

Mit der Option --include-untracked können Sie nicht gespeicherte Dateien unterbringen.

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

Führen Sie git help stash (oder man git-stash) aus, um weitere Informationen zu erhalten.

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

0
ma11hew28

Führen Sie den folgenden Befehl aus, um die nicht abgetaggten (nicht dem Commit hinzugefügten) Dateien zum Speicher hinzuzufügen:

git stash -k

Dann können Sie die bereitgestellten Dateien festschreiben. Danach können Sie die letzten Dateien mit dem folgenden Befehl zurückholen:

git stash pop
0
srth12

Die moderne Form dieses Befehls ist git stash Push [--] [<pathspec>...], da Git 2.16+ ( git stash save ist veraltet )

Sie können dies mit einem Platzhalterformular kombinieren, zum Beispiel:

git stash Push --all --keep-index ':(glob)**/*.testextension' 

Aber das funktioniert nicht gut mit Git für Windows, bis Git 2.22 (Q2 2019), siehe Ausgabe 2037 , wenn man bedenkt, dass git stash in C neu implementiert wurde (anstelle eines Shell-Skripts)

Siehe Commit 7db9302 (11. März 2019) von Thomas Gummerer (tgummerer) .
Siehe Festschreiben 1366c78 , Festschreiben 7b556aa (07. März 2019) von Johannes Schindelin (dscho) .
(Zusammengeführt von Junio ​​C Hamano - gitster - in commit 0ba1ba4 , 22. April 2019)

eingebaute stash: Behandle noch einmal :(glob) pathspecs

Bei der Übergabe einer Liste von Pfadangaben an beispielsweise git add muss darauf geachtet werden, dass nicht die analysierte Form der Pfadangaben, sondern die ursprüngliche Form verwendet wird.

Dies macht einen Unterschied, z.B. beim anrufen

git stash -- ':(glob)**/*.txt'

wobei das ursprüngliche Formular das Präfix :(glob) enthält, während das analysierte Formular dies nicht tut.

Im integrierten git stash haben wir jedoch das analysierte (d. H. Falsche) Formular übergeben, und git add schlug mit der folgenden Fehlermeldung fehl:

fatal: pathspec '**/*.txt' did not match any files

in dem Stadium, in dem git stash die Änderungen aus dem Arbeitsbaum entfernt, auch wenn refs/stash tatsächlich erfolgreich aktualisiert wurde.

0
VonC