Stash nur eine Datei aus mehreren Dateien, die sich geändert haben, bevor git 2.13
Wie kann ich stash nur eine von mehreren geänderten Dateien auf meinem Zweig?
- Ich glaube nicht, dass @bukzor die akzeptierte Antwort ist eine richtige Antwort auf die Frage, wie es gefragt wurde.
git stash --keep-index
hält der index, aber es Verstecke alles-sowohl in den index ein und aus. - Es scheint mir, wie Ihr bounty-sollte eigentlich eine separate Frage, die seit der ursprünglichen Frage gar nichts zu tun haben mit TortoiseGit speziell.
- Yep, da das Ergebnis hätte ich verschont 50 rep 🙂 Es ist nur so, das ist die Frage, die Sie umgeleitet, wenn Sie versuchen, suchen Sie für "teilweise" stash "tortoisegit". Tortoisegit nicht zu sein scheinen ein beliebtes Thema hier, stackoverflow.com/questions/tagged/tortoisegit
- stackoverflow.com/a/19700341/1668622 wesentlich kürzer ist als die akzeptierte Antwort, braucht keine zusätzlichen tools (wie z.B. JesusFreke ' s script) und es nur lagern, was Sie wollte, zu verstauen
- >>>>>>>>>
git diff -- *filename* > ~/patch
danngit checkout -- *filename*
und später können Sie re-installieren Sie den patch mitgit apply ~/patch
- Die meisten vorhandenen Antworten sind veraltet. Da Git 2.13 (Q2 2017) unterstützt wird es mit
git stash push [--] [<pathspec>...]
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Update die folgende Antwort ist für git, bevor git 2.13. Für git 2.13 und mehr, check out Wie kann ich mit git stash eine bestimmte Datei?
Warnung
Wie bereits angemerkt in den Kommentaren, dies stellt alles in den stash, beide staged und unstaged. Die --keep-index verlässt den index allein nach dem stash gemacht. Dies kann zu Konflikten beim Zusammenführen, wenn Sie später die pop-stash.
Diese wird stash alles, was man bislang noch nicht Hinzugefügt. Nur
git add
die Dinge, die Sie behalten möchten, dann führen Sie es.Zum Beispiel, wenn Sie teilen möchten, auf einen alten commit in mehr als einem änderungssatz, können Sie dieses Verfahren verwenden:
git rebase -i <last good commit>
edit
.git reset HEAD^
git add <files you want to keep in this change>
git stash --keep-index
git add
änderungen.git commit
git stash pop
git rebase --continue
git stash save -k
ja der index (grün ingit stat
) wird beibehalten, aber der ganzen änderungsmenge (grün und rot) geht in den stash. Dies verstößt gegen die OP ' s Wunsch, "stash nur einige änderungen". Ich will stash nur einige der rot (für zukünftige Verwendung).git stash -p
ist genau das, was ich suchte. Ich Frage mich, ob dieser Schalter wurde erst vor kurzem Hinzugefügt.git stash --keep-index
ist gebrochen. Wenn Sie weitere änderungen vornehmen, dann versuchen Siegit stash pop
später erhalten Sie merge-Konflikte, weil das Versteck enthält die geänderten Dateien, die Sie gehalten, nicht nur diejenigen, die Sie nicht halten. Zum Beispiel: ich ändere die Dateien A und B, dann verstauen B, weil ich will, um zu testen, die änderungen in Einem; find ich schon ein problem mit, die ich dann lösen; ich verpflichte mich, A; Jetzt kann ich nicht unstash, weil eine alte version von A ist in der stash für keinen guten Grund verursacht einen merge-Konflikt. In der Praxis sind A und B möglicherweise viele Dateien, vielleicht sogar binäre Bilder oder so etwas, so dass ich im Grunde aufgeben und verlieren, B.--keep-index
ist genau das, was diese Antwort behauptet, aber wie Sie darauf hinweisen, das ist Verhalten ist etwas anderes völlig. Und doch ist es Weg unfixierten seit Jahren! Was für ein Durcheinander.git stash -p
.git stash -p
richtig ist ^^^git stash -p
git stash -p
) war nicht so weit zu scrollen (12th position für einen moment). Was ist Los, ALSO? 🙂--keep-index
nicht stash nur einige Dateien, wird es stash ALLE Ihre Dateien.Können Sie auch
git stash save -p "my commit message"
. Auf diese Weise können Sie auswählen, welche der Gruppen aufgenommen werden sollen, stash, ganze Dateien können ausgewählt werden.Werden Sie aufgefordert, mit ein paar Aktionen für jeden Brocken:
stash -p
. Ich vergebe dieser Antwort, denn es bleibt die interaktive/Benutzer-freundlich.git stash save -p my stash message
; da die Reihenfolge der argumenst ist nicht sehr intuitiv...git stash -p
nicht unterstützt nicht verfolgte Dateien. Für leichter/häufiger verwenden, dieses einfache Skript in meiner Antwort auf eine doppelte Frage können Sie angeben, welche Dateien zu Begehen, und unterstützt sowohl nachverfolgt und nicht verfolgte Dateien.git log -p
, ich denke, die-p
flag muss heißen "tun die Coole Sache, dass will ich aber nicht wissen, wie Sie zum Ausdruck zu bringen."stashed.diffversion
, was ist das? was soll ich tun?git clean -fd
git stash push -m <stash_name> <file_path_to_stash>
Da git ist grundsätzlich über die Verwaltung eines alle repository - Inhalt und der index (und nicht eine oder mehrere Dateien)
git stash
Angebote, nicht überraschend,, mit der alle Arbeits-Verzeichnis.Eigentlich, da Git 2.13 (Q2 2017), Sie verstauen kann einzelne Dateien, mit
git stash push
:Siehe "Stash die änderungen an bestimmten Dateien" für mehr.
Der test-Fall ist selbsterklärend:
Die original-Antwort (unten, Juni 2010) wurde über die manuelle Auswahl, was Sie wollen, zu verstauen.
Casebash Kommentare:
bukzor's Antwort (von Ihnen positiv bewertet werden, November 2011) schlägt vor, eine praktische Lösung, basierend auf
git add
+git stash --keep-index
.Gehen, sehen und upvote seine Antwort, als die sein sollte, die offizielle (anstelle von mir).
Über diese option, chhh Punkte aus eine alternative workflow in die Kommentare:
(Original-Antwort-Juni 2010: Handbuch stash)
Doch
git stash save --patch
könnte, kann man die teilweisen Aufhänger für Sie nach:Jedoch, dass Sie die volle index (was nicht sein kann, was Sie will, da es vielleicht auch andere Dateien bereits indiziert), und eine teilweise worktree (das könnte Aussehen wie die, die Sie wollen, zu verstauen).
könnte eine bessere Passform.
Wenn
--patch
nicht funktioniert, einem manuellen Prozess könnte:Sich für eine oder mehrere Dateien, eine Zwischenlösung wäre:
(Eigentlich eleotlecram schlägt eine interessante alternative)
git stash
git stash
# diese Zeit, nur die Dateien, die Sie wollen, sind verstecktgit stash pop stash@{1}
# re-wenden Sie alle Ihre Dateien änderungengit checkout -- afile
# reset die Datei in den HEAD-Inhalt, bevor irgendwelche lokalen änderungenEnde, dass eher umständlicher Prozess, müssen Sie nur eine oder mehrere Dateien, die versteckt.
git reset --soft
nach dergit stash --keep-index
. Ein soft-reset nicht berührt der index, also wie macht es keinen Unterschied, wie weit die Inszenierung angeht?git reset
(gemischt)git is fundamentally about managing a all repository content and index and not one or several files
- , dass die Umsetzung überschatten das problem gelöst wird; es ist eine Erklärung, aber keine Rechtfertigung. Jede source-control-system IST über "verwalten mehrerer Dateien". Schau, was Kommentare bekommen die meisten von Ihnen positiv bewertet werden.git stash --keep-index
; wie bereits in den Kommentaren auf bukzor die Antwort, es einfach nicht tun, was Sie denken, es tut. Erstellen Sie zwei Dateien,foo
undbar
. Begehen Sie. Fügen Sie eine Zeile für jeden.git add foo
.git stash --keep-index
. Das gewünschte Ergebnis ist jetzt, dass Sie die änderungbar
versteckt, und die änderungfoo
noch vorhanden ist und inszeniert wird. Die Realität ist, dass Sie Ihre änderungfoo
Gegenwart und inszeniert, aber Ihre änderungen in beide - Dateien versteckt. Wenn Siegit reset
und ändernfoo
Sie jetzt nichtgit stash pop
aufgrund von Konflikten.brew install git
Wenn
git stash -p
(odergit add -p
mitstash --keep-index
) wäre zu umständlich, ich fand es einfacher zu verwendendiff
,checkout
undapply
:"Stash", die eine bestimmte Datei/Verzeichnis nur:
Danach
git add -p
ich bereits in meiner Antwort oben. +1.git diff > file.diff
undgit apply
sind meine üblichen teilweise stash-tools. Ich kann haben, zu erwägen, Umstellung aufgit stash -p
für größere änderungen.patch = log --pretty=email --patch-with-stat --reverse --full-index --binary
. Beachten Sie jedoch, dies erfordert, dass die änderungen für den patch begangen werden.../../foo/bar.txt
. Der patch generiert OK, aber ich Brauch dann bewegen Sie sich zu der Wurzel des Projektarchivs, um den patch zu übernehmen. Also, wenn Sie Probleme mit dieser - nur sicherstellen, dass Sie tun es aus der repository-root-Verzeichnis.Verwenden
git stash push
wie diese:Beispiel:
Dies ist möglich, da Git 2.13, veröffentlicht im Frühjahr 2017.
git stash push
bereits in meine Antwort oben im vergangenen März, 5 Monaten. Und ich detailliert, dass neue Git-2.13 Befehl hier: stackoverflow.com/a/42963606/6309.Lassen Sie uns sagen, Sie haben 3 Dateien
und Sie wollen stash nur b.rb und c.rb aber nicht.rb
können Sie so etwas tun
Und Sie sind fertig!
HTH.
Einen anderen Weg, dies zu tun:
Ich kam mit dieser, nachdem ich (wieder einmal) kam auf diese Seite und wusste nicht, wie die ersten beiden Antworten (die erste Antwort, nur nicht die Frage beantworten, und ich wusste nicht Recht, wie das arbeiten mit der
-p
interaktiven Modus).Die Idee ist die gleiche wie das, was @VonC vorgeschlagen, die Verwendung von Dateien außerhalb des repository, speichern Sie die änderungen, die Sie wollen, irgendwo, entfernen Sie die änderungen, die Sie nicht wollen, in Ihr Versteck, und dann erneut bewerben die änderungen, die Sie bewegt, aus dem Weg. Allerdings habe ich die git-stash als "irgendwo" (und als ein Ergebnis gibt es einen zusätzlichen Schritt am Ende: entfernen Sie die cahnges, die Sie in das Versteck, denn Sie zog diese aus dem Weg so gut).
Update (2/14/2015) - ich umgeschrieben habe das Skript ein wenig besser in den Griff den Fall von Konflikten, die sollten jetzt angezeigt werden als individueller Konflikte statt .rej-Dateien.
Oft finde ich es intuitiver zu tun, die inverse von @bukzor Ansatz. Das heißt, auf der Bühne einige Veränderungen, und dann Versteck nur die inszenierte Veränderungen.
Leider git nicht bieten ein git-stash-nur-index oder ähnliches, also ich peitschte ein Skript, das zu tun.
Können Sie speichern Sie das obige Skript als
git-stash-index
irgendwo auf Ihrem Weg, und kann dann aufgerufen werden als git-stash-indexJetzt die stash enthält einen neuen Eintrag, der nur die änderungen enthält, die Sie inszeniert hatte, und die Struktur enthält immer noch jede unstaged changes.
In einigen Fällen, die Arbeits-tree-änderungen können abhängig von der index-Veränderungen, also, wenn Sie zum speichern des index-änderungen der arbeiten-tree-änderungen haben einen Konflikt. In diesem Fall erhalten Sie die üblichen individueller Konflikte, die Sie lösen können mit git merge/git mergetool/etc.
pushd
stattcd
undpopd
am Ende der Skript, so, wenn das Skript erfolgreich ist, wird der Benutzer landet im gleichen Verzeichnis wie vor läuft es.Da das erstellen von branches in Git ist trivial, Sie könnte einfach erstellen Sie eine temporäre Niederlassung und überprüfen Sie die einzelnen Dateien in es.
Speichern Sie den folgenden code, um eine Datei, zum Beispiel mit dem Namen
stash
. Die Nutzung iststash <filename_regex>
. Das argument ist der reguläre Ausdruck für den vollständigen Pfad der Datei. Zum Beispiel, zu verstauen a/b/c.txt,stash a/b/c.txt
oderstash .*/c.txt
usw.Code zum kopieren in die Datei:
Nur für den Fall Sie eigentlich änderungen verwerfen, wenn Sie
git stash
(und nicht wirklich nutzen git stash zu verstauen vorübergehend), in diesem Fall können Sie[HINWEIS]
Dass
git stash
ist nur eine schnellere und einfache alternative zu Verzweigungen und sowas macht.Das problem mit VonC `s 'intermediate' - Lösung zum kopieren von Dateien aus dem Git-repo ist, dass Sie verlieren, Pfad-Informationen, das macht das kopieren von ein paar Dateien später wieder auf etwas Aufwand.
Einen finden es einfacher zu bedienen tar (ähnliche tools wird wahrscheinlich nicht) statt zu kopieren:
checkout -f
ist nicht erforderlich,checkout
(ohne-f
) ist genug, ich habe aktualisiert die Antwort.Manchmal habe ich aus ein nicht ändern, auf meinem ast vor, ich habe ihn engagiert, und ich möchte um es zu verschieben auf einen anderen Zweig und verpflichten Sie separat (wie master). Ich mache Folgendes:
Hinweis: der erste
stash
&stash pop
beseitigt werden kann, können Sie tragen alle Ihre änderungen über diemaster
Zweig, wenn Sie zur Kasse, aber nur wenn es keine Konflikte gibt. Auch, wenn Sie erstellen eine neue Niederlassung für die teilweisen änderungen, die Sie benötigen stash.Können Sie vereinfachen, vorausgesetzt, es keine Konflikte und keine neuen Zweig:
Stash ja nicht benötigt...
Diese kann getan werden, ganz einfach in 3 Schritten mit SourceTree.
Diese können alle in einer Angelegenheit von Sekunden in SourceTree, wo können Sie klicken Sie einfach auf die Dateien (oder auch einzelne Linien), die Sie hinzufügen möchten. Einmal Hinzugefügt, Begehen Sie eine temporäre Begehen. Weiter, klicken Sie auf das Kontrollkästchen hinzufügen, um alle änderungen, klicken Sie dann auf stash zu verstauen alles. Mit der versteckt-änderungen aus dem Weg, Blick über in Ihrer commit-Liste und beachten Sie die für den commit-hash, bevor Sie Ihre temporären Begehen, dann führen Sie 'git reset hash_b4_temp_commit', das ist im Grunde wie "knallen" die Begehung durch das zurücksetzen Ihrer Niederlassung zu Begehen, bevor es richtig. Jetzt sind Sie nur noch die Sachen, die Sie nicht wollen, versteckt.
Ich würde
git stash save --patch
. Ich finde nicht, die Interaktivität zu lästig, da gibt es Optionen, während Sie auf anwenden, um die gewünschte operation, um ganze Dateien.git stash -p
ermöglicht Ihnen, stash eine ganze Datei schnell und beenden danach.Jede Antwort hier ist so kompliziert...
Was über diese "stash":
Diese an die pop-Datei wieder ändern:
Genau dieses Verhalten als Aufhänger für eine Datei und knallen Sie es wieder an.
git apply
ich habe keine Fehlermeldung, aber die änderungen werden nicht zurück gebracht, wederHabe ich überprüft, Antworten und Kommentare, für diese und eine Reihe ähnlicher threads. Werden Sie sich bewusst, dass keiner der folgenden Befehle korrekt sind für den Zweck des seins in der Lage zu verstauen keine spezifischen verfolgt/nicht verfolgte Dateien:
git stash -p (--patch)
: wählen Sie Gruppen manuell, ohne nicht verfolgte Dateiengit stash -k (--keep-index)
: stash, die alle erfassten/nicht verfolgte Dateien und halten Sie in das Arbeitsverzeichnisgit stash -u (--include-untracked)
: stash, die alle erfassten/nicht verfolgte Dateiengit stash -p (--patch) -u (--include-untracked)
: Ungültiger BefehlDerzeit die vernünftigste Methode zu sein, in der Lage zu verstauen alle spezifischen verfolgt/nicht verfolgte Dateien ist:
ich schrieb ein einfaches Skript für dieses Verfahren in einer Antwort auf eine andere Frage, und es gibt Schritte für die Durchführung des Verfahrens in SourceTree hier.
Lösung
Lokalen änderungen:
Erstellen einer stash "my_stash" mit nur die änderungen, die auf file_C:
Getan.
Erklärung
Können Sie git status zwischen den Schritten, um zu sehen, was Los ist.
Wenn Sie nicht wollen, geben Sie eine Nachricht mit Ihrer verstaut änderungen, übergeben Sie den Dateinamen nach einem doppelten Bindestrich.
Wenn es ein nicht/neue Datei, Sie müssen auf der Stufe der ersten.
Diese Methode funktioniert in git-Versionen 2.13+
In dieser situation, die ich
git add -p
(interaktive)git commit -m blah
und dann verstauen, was übrig bleibt, wenn nötig.Wenn Sie versuchen, wechseln Sie zwischen zwei Zweigen tritt diese situation.
Versuchen Sie, fügen Sie die Dateien mit "
git add filepath
".Später diese Zeile ausführen
Zum verstauen einer einzigen Datei verwenden
git stash --patch [file]
.Dieser wird prompt:
Stash this hunk [y,n,q,a,d,j,J,g,/,e,?]? ?
. Geben Sie einfacha
(stash in diesem Stück und alle späteren Gruppen in der Datei) und du bist gut.push
wie ingit stash push --patch [file]
save
. In jedem Fallpush
odersave
sind implizit durch den Aufrufstash
: "Aufruf von git-stash, ohne Argumente äquivalent ist zu git stash schieben", docsÄhnlichen situation. Tat Begehen und erkannte, dass es nicht in Ordnung ist.
Basiert auf den Antworten, das half mir.
Ich weiß nicht, wie zu tun es auf der Kommandozeile, nur mit SourceTree. Können sagen, Sie haben sich verändert-Datei Ein, und haben zwei ändern hunks in Datei B. Wenn Sie wollen, zu verstauen erst das zweite Stück in Datei B, und lassen alles andere unberührt, dies zu tun:
Einer komplizierten Weise wäre ersten Beitrag alles:
Reset-zurück zu den ursprünglichen commit, aber Kasse the_one_file aus der neuen commit:
Können Sie jetzt stash the_one_file:
Bereinigung durch sparen verpflichtet, die Inhalte, die in Ihrem Datei-system beim zurücksetzen wieder auf die original-commit:
Ja, etwas umständlich...
Fand ich keine Antwort auf das sein, was ich brauchte und das ist so einfach wie:
Diese Verstecke genau eine Datei.
Schnelle Antwort
Zum zurücksetzen einer bestimmten geänderte Datei in git haben, können Sie die folgende Zeile:
Ist hier ein Aktuelles Beispiel:
Können Sie einfach, dies zu tun:
oder mit einer optionalen Nachricht