Was ist das Git-Äquivalent zu TFS-Befehlen Shelve / Unshelve? Kirschpflücker?

76

Ich fand, dass die Shelve / Unshelve-Befehle in TFS sehr praktisch und sehr einfach zu verwenden sind. Was ist das Äquivalent in Git?

Hier ist das Szenario in TFS:

  • Ich habe Änderungen im Kofferraum vorgenommen
  • Ich stelle ein: Der Änderungssatz wird auf dem Server gespeichert (mit einem Etikett) und ich erhalte die Quelle vor den Änderungen zurück
  • Ich arbeite im Kofferraum
  • Jemand kann sich abmelden: Die Änderung in seinem Arbeitsbereich festlegen

Ich weiß, dass es einen Befehlsaufruf gibt, aber ich bin mir nicht sicher, wie der Workflow funktioniert und ob er den Anforderungen entspricht.

MatthieuGD
quelle

Antworten:

85

Was Sie beschreiben, ist ähnlich git stash, außer dass Sie mit git ein eigenes Repository haben (nicht nur ein einziges auf einem Server), nur Sie können diese Änderung zurücksetzen.

Die allgemeine Idee ist:

# do some stuff
vim foo/bar.c
# stash away your changes
git stash

# do some other things...

# retrieve your changes
git stash pop

Wenn Sie möchten, dass jemand anderes Zugriff auf dieses Änderungsset hat, möchten Sie es stattdessen einem funktionierenden Zweig zuweisen:

# make yourself a branch
git checkout -b temp-featureA
# commit to it
git add foo/bar.c; git commit

# now you push this branch (or they could just fetch straight from you)
git push origin temp-featureA


# Now, in someone else's repo:
# Fetch updates
git fetch origin
# Make a branch tracking the remote branch
git branch temp-featureA origin/temp-featureA

# Either check it out:
git checkout temp-featureA
# or cherry-pick it, to apply the changes somewhere else:
git cherry-pick temp-featureA
# or, if it's multiple commits, rebase it!
git rebase --onto my-branch start-of-featureA temp-featureA
Cascabel
quelle
Haben Sie eine Idee, was zu tun ist, wenn ich diese Änderungen nicht im Regal übernehmen möchte? Wir haben Verbindungszeichenfolgen, die wir ändern, um unterschiedliche Umgebungen zu treffen, aber wir möchten diese nicht auf dem Master ändern, nur für lokales Debugging. Wenn wir sie in einer Zweigstelle haben, werden sie festgeschrieben, wenn wir sie in unsere Zweigstelle
einbinden
Gibt es eine Möglichkeit, unter Beibehaltung der lokalen Änderungen zu verstauen? Kann Stash gefolgt von Stash gelten?
Psddp
Ja, Stash, dann Stash Apply würde das im Wesentlichen tun. Aber ich bin ein wenig verwirrt, warum Sie wollen. Im Allgemeinen liegt es daran, dass die Änderungen vorübergehend verschwinden und an einer anderen Stelle abgelegt werden sollen. Wenn Sie sie behalten und weiterarbeiten möchten, ist es möglicherweise besser, nur eine Verpflichtung einzugehen. Sie können dann das Commit an anderer Stelle auswählen, anstatt einen Stash anzuwenden, und Sie können ihn anschließend jederzeit wegquetschen, wenn Sie aufräumen möchten.
Cascabel
2
Eigentlich ist das nicht dasselbe wie ein TFS Shelveset. Wenn ich an einem lokalen Git-Zweig arbeite ... am Ende des Tages möchte ich sagen ... mit all den Warzen und Kompilierungsfehlern ... diese Arbeit zur sicheren Aufbewahrung auf den Server legen. Wenn meine Festplatte abstürzt, verliere ich nicht alles. Ich möchte meine Arbeit jedoch noch nicht auf den Remote-Zweig übertragen, da dieser unvollständig ist. Meine lokale Niederlassung verfolgt die entfernte Niederlassung. Cascabel listet 8 separate Git-Befehle auf, um dies zu orchestrieren ... in TFS ... es ist ein Befehl ... Shelve.
Bayrat
29

Was Sie tun möchten, wird mit einer einfachen alten Verzweigung in Git erreicht.

Aus einer schönen StackOverflow-Antwort von JaredPar :

Mit Shelving können Sie alle Änderungen auf Ihrer Box speichern, ohne einchecken zu müssen. Die Änderungen bleiben auf dem Server erhalten.

Dies ist analog zum Festschreiben an einen Zweig und zum Übertragen auf einen Server in Git.

Wie es geht:

Angenommen, Sie arbeiten am Zweig "Master" und entscheiden sich für die Implementierung von Feature X. Sie haben einen guten Start, aber dann sagt Ihnen Ihr Chef, dass Feature Y so schnell wie möglich implementiert werden muss. Phil im nächsten Würfel über Freiwillige, um Feature X zu beenden, während Sie Feature Y ausführen. Folgendes tun Sie:

Erstellen Sie einen neuen Zweig und wechseln Sie zu diesem:

$ git checkout -b feature-x

Übernehmen Sie Ihre Änderungen:

$ git add filethatyouchanged.cc
$ git commit -m 'partial implementation of feature X'

Schieben Sie es auf einen Server, den Phil sehen kann:

$ git push origin feature-x

Gehen Sie zurück zum Hauptzweig (der sich nicht geändert hat):

$ git checkout master

Möglicherweise möchten Sie auch proaktiv einen neuen Zweig für Feature Y erstellen:

$ git checkout -b feature-y

Phil kann jetzt Ihre Feature-X-Arbeit herunterziehen und dort weitermachen, wo Sie aufgehört haben:

phil$ git fetch origin
phil$ git checkout -t origin/feature-x
Neall
quelle
1
Obwohl es nicht so billig ist wie in Git, wird es tatsächlich im Repo gespeichert. Wenn das Repo verteilt wird, bedeutet dies, dass Sie Ihr Regal vom Repo aus an jeden Computer liefern lassen können, ohne dass es zu einem Commit wird. (TFS2010) Dies ist sehr praktisch, wenn es eine Art Richtlinie wie CI oder Gated Check-In gibt (obligatorischer serverseitiger Build bei jedem Check-in)
Onno
5

Git Stash ist ein bisschen ähnlich, außer dass es auf Ihren Arbeitsbaum beschränkt ist.

In einem DVCS müssen Sie Folgendes tun, um einen solchen Workflow zu erzielen:

  • Übernehmen Sie Ihre aktuellen Änderungen in einem neuen Zweig
  • Überprüfen Sie den ursprünglichen Zweig, in dem Sie fortfahren können, ohne die Änderungen vorzunehmen, die Sie vorgenommen haben (aber in dem neuen Zweig festgeschrieben haben).
  • Schieben Sie diesen neuen Zweig zu einem nackten Repo
  • Erlauben Sie einem anderen Entwickler, diesen neuen Zweig zu ziehen und ihn mit seinem aktuellen Zweig zusammenzuführen.

Eine andere Möglichkeit wäre, den anderen Entwickler Ihren Zweig abrufen zu lassen (wo Sie diese speziellen Änderungen vorgenommen haben) und ihn auszuwählen , was jedoch nicht empfohlen wird, da von Kirschen ausgewählte Commits schwer zu verfolgen sind .

VonC
quelle
Vielen Dank für Ihre Antwort. Ich habe Jefromis Antwort markiert, weil sie mir ein Beispiel gibt, aber Ihre war auch hilfreich.
MatthieuGD