Ist es in git möglich, einen Stash zu erstellen, den Stash in ein Remote-Repository zu verschieben, den Stash auf einem anderen Computer abzurufen und den Stash anzuwenden?
Oder sind meine Optionen:
- Erstellen Sie einen Patch und kopieren Sie den Patch auf den anderen Computer
- Eine Nebenniederlassung erstellen und die unvollständige Arbeit an diese Niederlassung übergeben?
git fetch some-remote +refs/stash:refs/remotes/some-remote/stash
dasgit stash apply some-remote/stash
. Sie können jedoch keine älteren Stashes erhalten, da diese im Reflog gespeichert sind, das nicht abgerufen werden kann. Siehe stackoverflow.com/questions/2248680/…Hinweis: Ich habe diese Antwort gerade mit 24 Stunden mehr Git-Fu umgeschrieben :) In meiner Shell-Geschichte besteht der gesamte Shebang jetzt aus drei Einzeilern. Ich habe sie jedoch für Ihre Bequemlichkeit nicht komprimiert.
Auf diese Weise hoffe ich, dass Sie sehen können, wie ich Dinge getan habe, anstatt nur blind Dinge kopieren / einfügen zu müssen.
Hier ist Schritt für Schritt.
Angenommen, die Quelle in ~ / OLDREPO enthält Verstecke. Erstellen Sie einen TEST-Klon ohne Stashes:
Schieben Sie alle Verstecke als temporäre Zweige:
Schleife am Empfangsende, um sich wieder in Verstecke zu verwandeln:
Bereinigen Sie Ihre temporären Zweige, wenn Sie so wollen
Wenn Sie eine Git-Stash-Liste erstellen, werden Sie ungefähr so aussehen:
Auf dem ursprünglichen Repository sah das genauso aus
quelle
git add .
vor demgit stash save ...
Schritt eine brauchte, da ich michgit stash
weigere, neue Dateien zu speichern, es sei denn, sie wurden bereitgestellt. Auch das Ergebnis der Rohrleitungengit rev-list ...
durchtac
Kehrt die Reihenfolge des stashes so kommen sie in der gleichen Reihenfolge.for
Schleife mitgit branch -D stash_$a
(Bereinigen, wenn Stashes erstellt werden), damit wir Commits, die bereits erfolgreich gespeichert wurden, nicht erneut verarbeiten, wenn etwas schief geht und wir es erneut versuchen.git stash save "$(git log --format='%s' -1 HEAD@{1})"
mitgit update-ref --create-reflog -m "$(git show -s --format=%B $rev)" refs/stash $rev
Ihnen die Original Stash Nachricht bekommen (update-ref
ist das, wasgit stash save
hinter den Kulissen).Ich bin etwas spät zur Party, aber ich glaube, ich habe etwas gefunden, das für mich funktioniert, und es könnte auch für Sie sein, wenn Ihre Umstände gleich oder ähnlich sind.
Ich arbeite an einem Feature in einem eigenen Zweig. Der Zweig wird nicht zum Master zusammengeführt und verschoben, bis er fertig ist, oder ich habe Verpflichtungen eingegangen, die ich der Öffentlichkeit gerne zeigen möchte. Was ich also mache, wenn ich nicht bereitgestellte Änderungen auf einen anderen Computer übertragen möchte, ist:
[non-commit] FOR TRANSFER ONLY
", die den Inhalt enthält, den Sie übertragen möchten.Dann mach:
git pull ssh+git://<username>@<domain>/path/to/project/ rb:lb
Die URL kann für Sie unterschiedlich sein, wenn Sie auf andere Weise auf Ihr Repository zugreifen. Dadurch werden Änderungen von dieser URL vom Remote-Zweig "rb" in den lokalen Zweig "lb" gezogen. Beachten Sie, dass auf meinem eigenen Computer ein SSH-Server ausgeführt wird und ich auf diese Weise auf das Repository zugreifen kann.
git reset HEAD^
(impliziert--mixed
)Dadurch wird der HEAD so zurückgesetzt, dass er auf den Status vor dem Commit "[non-commit]" verweist.
Von git-reset (1): "
--mixed
: Setzt den Index zurück, aber nicht den Arbeitsbaum (dh die geänderten Dateien werden beibehalten, aber nicht für das Festschreiben markiert) [...]"Sie werden also am Ende Ihre Änderungen an den Dateien haben, aber es werden keine Commits zum Master gemacht und es ist kein Stash erforderlich.
Dies erfordert jedoch, dass Sie sich
git reset --hard HEAD^
in dem Repository befinden, in dem Sie "[non-commit]" vorgenommen haben, da es sich bei diesem Commit um Müll handelt.quelle
Es ist etwas spät, aber diese Antwort könnte jemandem helfen. Ich wollte das wissen, weil ich in der Lage sein wollte, eine laufende Funktion / einen Fehler / was auch immer zu pushen und von demselben Punkt aus auf einem anderen Computer zu arbeiten.
Was für mich funktioniert, ist das Festschreiben meines in Bearbeitung befindlichen Codes (in einem Zweig, an dem ich alleine arbeite). Wenn ich an meinen anderen Computer komme, ziehen Sie und machen Sie das Commit rückgängig mit:
Arbeiten Sie weiter wie bisher, mit all Ihren laufenden Änderungen, unverbindlich und nicht inszeniert.
Ich hoffe es hilft.
quelle
Es scheint einen sehr guten Trick zu geben, um dies zu lösen. Sie können
git diff > file.diff
die Datei verwenden (und die Datei festschreiben) und dann die Änderungen mithilfegit apply file.diff
(von überall) wiederherstellen , um das gleiche Ergebnis zu erzielen.Dies wurde auch hier erklärt .
quelle
Ich würde mich für den zweiten Ansatz entscheiden, obwohl ich keine Ahnung habe, warum Sie ihn nicht für den Master / Featured Branch festlegen können. Es ist auch möglich, Kirschen zu pflücken.
quelle
AFAIK die ganze Idee von Stash ist es, etwas nicht so Wichtiges unter dem lokalen Teppich zu verstecken . Niemand sollte etwas über deinen Lieblingsmist wissen ;-) Das einzige "aber" ist: Aber wenn ich mich auf ein paar Workstations entwickle? Dann
scp
ist es viel besser.quelle
Die derzeit akzeptierte Antwort ist technisch korrekt. Sie können Git nicht direkt anweisen, alle Ihre Stashes auf eine Fernbedienung zu übertragen und dann alles in Ihre lokalen Stashes auf einem anderen Computer zu ziehen.
Und obwohl die aktuell am besten bewertete Antwort funktionieren sollte, hat es mir nicht gefallen, dass sie eine Reihe von temporären Zweigen erstellt und das Stash-Commit manuell überprüft und als Stash gespeichert werden muss, was zu Problemen wie diesem Kommentar führen kann erwähnt und führt zu einem Duplikat
On (no branch): On testing:
. Sicher muss es einen besseren Weg geben!Während Sie Stashes nicht direkt pushen können, ist ein Stash nur ein Commit (eigentlich zwei Commits), und pro
git push
Manpage können Sie Commits pushen:Ich entschied mich dafür, die Verstecke zu verschieben,
refs/stashes/*
damit ich meine Fernbedienung nicht mit zusätzlichen Zweigen überfüllte. Also kann ich das machen mit:(Der
rev-parse
Befehl erhält den kurzen Hash des Stashs, der für das Repo eindeutig ist.)Als nächstes muss ich den Vorrat vom anderen Computer holen. Git ruft standardmäßig nur Zweige ab, daher muss ich die Stashes speziell abrufen:
Nun konvertieren Sie das Stash-Commit zurück in ein tatsächliches Stash. Wie bereits erwähnt, kann ich das Festschreiben, Zurücksetzen und Verstecken des Stashs zwar wie gewohnt überprüfen, es gefällt mir jedoch nicht, dass zusätzliche Schritte erforderlich sind oder der Indexstatus für das Stash möglicherweise nicht beibehalten wird. Ich habe online nach einer Möglichkeit gesucht, dies automatisch zu tun, aber mein Such-Fu hat mich gescheitert. Schließlich habe ich in der Manpage nachgesehen
git stash
, wo ich Folgendes gefunden habe:Da ich bereits das Commit habe,
store
klingt es wie das, was ich will. Also kann ich tun:Ersetzen
<SHA>
durch das gerade abgerufene Versteck.(Das
git show
Befehl ruft die Festschreibungsnachricht aus dem Stash-Commit ab, um sie als Nachricht für das Stash-Protokoll zu verwenden.)Der Vorrat wird jetzt wie gewohnt in meinem lokalen Repo angezeigt:
Um die Fernbedienung zu bereinigen, können die Verstecke wie folgt von der Fernbedienung gelöscht werden:
Diese Methode hat auch den Vorteil, dass sie idempotent ist: Wenn Sie den
push
Befehl erneut ausführen , wird er gemeldetEverything up-to-date
. Derfetch
Befehl kann auch sicher wiederholt ausgeführt werden. Während dasstash store
Speichern des Stashs übersprungen wird, wenn es mit dem letzten Stash identisch ist, werden Duplikate älterer Stashes nicht verhindert. Dies kann jedoch umgangen werden, wie ich es in meinemgit-rstash
Skript tue , siehe unten.Zum Abschluss können Sie auch einfach alle Verstecke schieben (mit Bash):
oder importiere alle abgerufenen Stashes:
Ich habe eine erstellt BashSkript, das als Unterbefehl aufgerufen werden kann (z. B.
git rstash push 0
), damit ich mich nicht an all das erinnern muss.git-rstash
finden Sie hier.quelle
Das Folgende funktioniert nicht mit dem Stash, sondern mit den nicht festgeschriebenen Änderungen im Arbeitsverzeichnis. Es erstellt eine Verzweigung, schreibt alle aktuellen Änderungen automatisch fest und überträgt sie an die Fernbedienung:
Verwenden Sie wie:
quelle
Ich würde einfach einen neuen Stash-Zweig erstellen und ihn entfernen, wenn dieser Zweig nicht benötigt wird.
quelle
Benutze einfach Dropbox wie dieser Typ. Auf diese Weise müssen Sie sich keine Gedanken über das Verschieben von Stashes machen, da Ihr gesamter Code gesichert wird.
http://blog.sapegin.me/all/github-vs-dropbox
quelle