Gibt es eine Möglichkeit, nur meine inszenierten Änderungen zu speichern? Das Szenario, mit dem ich Probleme habe, ist, wenn ich gleichzeitig an mehreren Fehlern gearbeitet habe und mehrere nicht bereitgestellte Änderungen vorgenommen habe. Ich möchte in der Lage sein, diese Dateien einzeln bereitzustellen, meine .patch-Dateien zu erstellen und sie zu speichern, bis der Code genehmigt ist. Auf diese Weise kann ich, wenn es genehmigt ist, meine gesamte (aktuelle) Sitzung verstecken, diesen Fehler beheben und den Code pushen.
Gehe ich falsch vor? Verstehe ich falsch, wie Git auf andere Weise funktionieren kann, um meinen Prozess zu vereinfachen?
Antworten:
Ja, mit DOUBLE STASH ist das möglich
git stash --keep-index
. Dieser Befehl wird ein Versteck mit erstellen ALL Ihren Änderungen ( inszeniert und unstaged ), aber lassen Sie die Änderungen in Ihrem Arbeitsverzeichnis aufgeführt (noch im Zustand inszeniert).git stash push -m "good stash"
"good stash"
hat nur inszeniert Dateien .Wenn Sie vor dem Stash nicht bereitgestellte Dateien benötigen, wenden Sie einfach den ersten Stash an ( den mit
--keep-index
), und jetzt können Sie die Dateien entfernen, in denen Sie sich versteckt haben"good stash"
.Genießen
quelle
-u
Schalter verwenden.git stash apply --index
Option. Dadurch wird versucht, Ihren nicht (inszenierten) Status beizubehalten. Es ist jetzt einfacher, unerwünschte Änderungen aus dem Arbeitsbaum zu entfernen.Mit dem neuesten Git können Sie die
--patch
Option verwendenUnd git wird Sie nach jeder Änderung in Ihren Dateien fragen, die Sie in den Stash aufnehmen oder nicht.
Du antwortest einfach
y
odern
UPD-
Alias für DOUBLE STASH :
Jetzt können Sie Ihre Dateien bereitstellen und dann ausführen
git stash-staged
.Als Ergebnis werden Ihre bereitgestellten Dateien im Stash gespeichert .
Wenn Sie nicht bereitgestellte Dateien behalten und in den Stash verschieben möchten. Dann können Sie einen weiteren Alias hinzufügen und ausführen
git move-staged
:quelle
-u|--include-untracked
Option vongit-stash
Ich habe ein Skript erstellt, das nur das versteckt, was gerade inszeniert ist, und alles andere hinterlässt. Das ist großartig, wenn ich anfange, zu viele nicht verwandte Änderungen vorzunehmen. Stellen Sie einfach fest, was nicht mit dem gewünschten Commit zusammenhängt, und verstauen Sie genau das.
(Danke an Bartłomiej für den Startpunkt)
quelle
Hier ist ein einfacher Einzeiler:
Und um einfach eine Nachricht hinzuzufügen:
quelle
Um das Gleiche zu erreichen ...
git commit -m 'temp'
git add .
git stash
git reset HEAD~1
Boom. Die Dateien, die Sie nicht möchten, werden gespeichert. Die gewünschten Dateien sind alle für Sie bereit.
quelle
In diesem Szenario ziehe ich es vor, für jede Ausgabe neue Zweige zu erstellen. Ich verwende ein Präfix temp /, damit ich weiß, dass ich diese Zweige später löschen kann.
Stellen Sie die Dateien bereit, die bug1 beheben, und schreiben Sie sie fest.
Sie können dann die Commits nach Bedarf aus den jeweiligen Filialen auswählen und eine Pull-Anfrage senden.
quelle
Warum übernehmen Sie die Änderung nicht für einen bestimmten Fehler und erstellen einen Patch aus diesem Commit und seinem Vorgänger?
Verwenden Sie dann zum Erstellen der entsprechenden Patches
git format-patch
:Dadurch werden zwei Dateien erstellt:
0001-fix-bug-123.patch
und0002-fix-bug-321.patch
Oder Sie können für jeden Fehler separate Zweige erstellen, um Fehlerkorrekturen einzeln zusammenzuführen oder neu zu definieren oder sie sogar zu löschen, wenn sie nicht funktionieren.
quelle
git stash --keep-index
ist eine gute Lösung ... außer dass es auf entfernten Pfaden nicht richtig funktioniert hat, was in Git 2.23 (Q3 2019) behoben wurde.Siehe Commit b932f6a (16. Juli 2019) von Thomas Gummerer (
tgummerer
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit f8aee85 , 25. Juli 2019)quelle
Es ist schwieriger, nur den Index (inszenierte Änderungen) in Git zu speichern, als es sein sollte. Ich habe @ Joes Antwort gefunden , um gut zu funktionieren, und eine kleine Variation davon in diesen Alias umgewandelt:
Es verschiebt sowohl die inszenierten als auch die nicht inszenierten Änderungen in einen temporären Speicher, wobei die inszenierten Änderungen in Ruhe gelassen werden. Anschließend werden die inszenierten Änderungen in den Stash verschoben, den wir behalten möchten. An den Alias übergebene Argumente, wie
--message "whatever"
sie diesem Stash-Befehl hinzugefügt werden. Schließlich wird der temporäre Stash geöffnet, um den ursprünglichen Zustand wiederherzustellen und den temporären Stash zu entfernen. Anschließend werden die versteckten Änderungen über eine Reverse-Patch-Anwendung aus dem Arbeitsverzeichnis "entfernt".Für das entgegengesetzte Problem, nur die nicht bereitgestellten Änderungen (Alias
stash-working
) zu verstecken, siehe diese Antwort .quelle
Ist es unbedingt notwendig, mehrere Fehler gleichzeitig zu bearbeiten? Und mit "sofort" meine ich "Dateien gleichzeitig für mehrere Fehler bearbeiten lassen". Denn wenn Sie das nicht unbedingt brauchen, würde ich in Ihrer Umgebung jeweils nur an einem Fehler arbeiten. Auf diese Weise können Sie lokale Filialen und Rebase verwenden, was für mich weitaus einfacher ist als die Verwaltung eines komplexen Stashs / einer komplexen Phase.
Angenommen, der Master befindet sich bei Commit B. Arbeiten Sie nun an Fehler 1.
Jetzt bist du auf Branch Bug1. Nehmen Sie einige Änderungen vor, legen Sie fest und warten Sie auf die Codeüberprüfung. Dies ist lokal, so dass Sie niemanden betreffen, und es sollte einfach genug sein, einen Patch aus Git-Diffs zu erstellen.
Jetzt arbeiten Sie an Bug2. Geh zurück zum Meister mit
git checkout master
. Machen Sie einen neuen Zweig ,git checkout -b bug2
. Nehmen Sie Änderungen vor, legen Sie fest, warten Sie auf die Codeüberprüfung.Stellen wir uns vor, jemand anderes legt E & F für den Master fest, während Sie auf die Überprüfung warten.
Wenn Ihr Code genehmigt wurde, können Sie ihn mit den folgenden Schritten erneut als Master verwenden:
Dies führt zu Folgendem:
Dann können Sie pushen, Ihren lokalen Bug1-Zweig löschen und los geht's. Jeweils ein Fehler in Ihrem Arbeitsbereich, aber bei Verwendung lokaler Zweige kann Ihr Repository mehrere Fehler behandeln. Und das vermeidet einen komplizierten Bühnen- / Stash-Tanz.
Antwort auf die Frage von ctote in den Kommentaren:
Nun, Sie können für jeden Fehler zum Verstecken zurückkehren und jeweils nur mit einem Fehler arbeiten. Zumindest erspart Ihnen das Staging-Problem. Aber nachdem ich das versucht habe, finde ich es persönlich problematisch. Stashes sind in einem Git-Log-Diagramm etwas chaotisch. Und was noch wichtiger ist: Wenn Sie etwas vermasseln, können Sie nicht zurückkehren. Wenn Sie ein schmutziges Arbeitsverzeichnis haben und einen Stash einfügen, können Sie diesen Pop nicht "rückgängig machen". Es ist viel schwieriger, bereits vorhandene Commits zu vermasseln.
Also
git rebase -i
.Wenn Sie einen Zweig auf einen anderen umstellen, können Sie dies interaktiv tun (das Flag -i). Wenn Sie dies tun, haben Sie die Möglichkeit, auszuwählen, was Sie mit jedem Commit tun möchten. Pro Git ist ein großartiges Buch, das auch im HTML-Format online ist und einen schönen Abschnitt über Rebasing & Squashing enthält:
http://git-scm.com/book/ch6-4.html
Ich werde ihr Beispiel der Einfachheit halber wörtlich stehlen. Stellen Sie sich vor, Sie haben den folgenden Commit-Verlauf und möchten bug1 auf master neu starten und quetschen:
Folgendes sehen Sie, wenn Sie tippen
git rebase -i master bug1
Um alle Commits eines Zweigs zu einem einzigen Commit zusammenzufassen, behalten Sie das erste Commit als "pick" bei und ersetzen Sie alle nachfolgenden "pick" -Einträge durch "squash" oder einfach "s". Sie haben auch die Möglichkeit, die Commit-Nachricht zu ändern.
Also ja, Quetschen ist ein bisschen schmerzhaft, aber ich würde es trotzdem empfehlen, wenn man viel Stashes benutzt.
quelle
git checkout master; git checkout -b bug2
auf gekürzt werden kanngit checkout -b bug2 master
. Gleiches gilt fürgit checkout bug1; git rebase master; git checkout master; git merge bug1
, was identisch istgit rebase master bug1; git push . bug1:master
(push
Aus Ihren Kommentaren zur Antwort von Mike Monkiewicz schlage ich vor, ein einfacheres Modell zu verwenden: Verwenden Sie reguläre Entwicklungszweige, aber verwenden Sie die Squash-Option der Zusammenführung, um ein einzelnes Commit in Ihrem Hauptzweig zu erhalten:
Der Vorteil dieses Verfahrens besteht darin, dass Sie den normalen Git-Workflow verwenden können.
quelle
Nach dem Erstellen eines Alias:
Hier wird eine
git diff
Liste der--staged
Dateien zurückgegeben--name-only
. Dann übergeben wir diese Liste
pathspec
angit stash
commad.Von
man git stash
:quelle
Gehen Sie wie folgt vor, um eine versehentliche Änderung, insbesondere das Löschen mehrerer Dateien, zu bereinigen:
Mit anderen Worten, verstauen Sie den Mist und werfen Sie ihn zusammen mit dem Versteck weg.
Getestet in Git Version 2.17.1
quelle