2016-06-26 17 views
3

ist die Situation:Git Stash zwei Zweige

  1. ich Änderungen am Zweig A
  2. git stash auf Zweig A
  3. git checkout B
  4. Änderungen am Zweig B
  5. git stash auf Zweig B
  6. git checkout A
  7. git stash pop auf Zweig A

Nach dem Schritt 7 der obigen Liste, die Änderungen, die ich auf dem Zweig A gemacht hatte, bevor stashing nicht zurück gekommen, aber die Änderungen, die ich auf dem Zweig B gemacht hatte tauchten auf Zweig A. I verwendet cmd z auf Zweig A und die Datei ging in den vorherigen Zustand, der die Änderungen hatte, die ich gemacht hatte. Es schien, dass der KOPF von Zweig A zum KOPF von Zweig B wechselte. Das gleiche passierte, als ich git checkout B und git stash pop auf diesem Zweig: Zweig B hatte alle Änderungen auf Zweig A gemacht, aber nicht die Änderungen, die ich auf Zweig B gemacht hatte cmd z wieder in den Verzweigungszustand zurückzukehren, den ich brauchte.

Dies verursachte mir eine Menge Probleme für einige Zeit, bis ich wieder Code für das Projekt committen durfte (niemand konnte für eine Weile verpflichten, weil es einen automatisierten Push auf den Server bei Commits gab und der Manager wollte nicht neuer Code im Server, bis sie einige Tests ausgeführt haben). Wie kann ich nur die Änderungen vornehmen, die an den Filialen vorgenommen wurden, und nicht Änderungen an anderen Filialen?

+3

Ich kenne keine Funktion, die einen Stash an einen Zweig bindet. Ein Stash-Eintrag hat jedoch eine Beschreibung und standardmäßig enthält diese Beschreibung den Namen des Zweigs, aus dem er erstellt wurde. Sie können 'git stash list' verwenden, um diese Beschreibungen anzuzeigen. Dann z.B. Verwenden Sie 'git stash pop stash @ {1}', um das zweite Element aus dem Stapel abzurufen. – Raffael

+1

Automatisierte Push-nach-Commit scheint auch eine schreckliche Idee! Lokale Commits sind die wichtigste Verbesserung von verteilten Versionskontrollsystemen gegenüber dem klassischen zentralisierten Ansatz. Das und Backup. – Raffael

+0

@Raffael: Ich werde diesen Befehl versuchen. Über den automatisierten Push war ich der Meinung, dass er aus irgendeinem Grund temporär war (im Allgemeinen stimme ich Ihnen jedoch zu). Ich kam vor ungefähr 2 Wochen zum Projekt und ich gewöhne mich immer noch daran, wie die Dinge rollen. –

Antwort

4

Was git stash macht ist ein Commit.

Natürlich, was git commit tut, ist ein Commit machen. Also warum haben wir git stash überhaupt?

Ein wesentlicher Unterschied zwischen diesen Befehlen besteht darin, dass die Commits git stashnicht auf einem Zweig sind. Dies ermöglicht es Ihnen, in einem Zweig auf stash zuzugreifen, dann in einen anderen Zweig zu wechseln und den Stash dort anzuwenden. Mit anderen Worten, Sie können damit fortlaufende Arbeiten durchführen.

Sie können oft, aber nicht immer, die laufende Arbeit fortfahren. Siehe Git - checkout another branch when there are uncommitted changes on the current branch. Wenn Sie können nicht, obwohl Sie git stash verwenden können, um damit umzugehen.

Auf der anderen Seite, wenn Sie "auf einem Zweig" stapeln möchten, wie in Ihrem Fall, sind Sie wahrscheinlich besser dran, nur eine regelmäßige Commit, anstatt eine spezielle Stash-Commit. Solche Commits sind einfacher zu handhaben und haben auch keine a bug that git stash has. Sie werden wahrscheinlich nicht auf diesen Fehler stoßen, aber "reguläre Commits sind einfacher und einfacher zu handhaben" (commits on branches, vs stashes) ist ein ziemlich guter Grund, git stash zu vermeiden.

Wenn Sie sowieso git stash verwenden möchten, beachten Sie, dass jeder neue Stash die vorherigen in einem "stash stack" höher "schiebt". Der alte Versteck wird [email protected]{1}, und was war [email protected]{1} wird [email protected]{2}, und so weiter.Wenn Sie drop (Discard) oder pop (Versuch anzuwenden, dann verwerfen) ein Versteck, bewegen sich die gestapelt, die oben es wieder nach unten so, wenn Sie git stash drop [email protected]{3} waren, als Sie auch [email protected]{4} und [email protected]{5} hätten, würden Sie mit [email protected]{3} gelassen werden und [email protected]{4} jetzt.

Sie können jeden Stash, einschließlich der neuesten, auf diese Weise benennen: [email protected]{0} bedeutet dasselbe wie stash. (Git implementiert tatsächlich all dies mit der reflog für stash.)


In der Tat, es macht mindestens zwei verpflichtet, und manchmal drei. Die beiden Commits speichern den Index und den Arbeitsbaumstatus; der dritte Commit, falls vorhanden, ist von -u oder und speichert die nicht-geladenen (-u) oder alle() Dateien. Der Work-Tree-Commit ist ein sehr merkwürdiger Merge-Commit, bei dem der Index-Commit als zweiter Elternteil und der dritte Commit, falls vorhanden, als dritter Elternteil gilt. Das erste übergeordnete Element des Work-Tree-Commits und das einzige übergeordnete Element des Index-Commits ist das Commit, das beim Ausführen von git stash aktuell war.

Wenn Sie zeichnen Graphenfragmente-die begehen, immer wenn Sie etwas tun, in Git kompliziert, ist eine gute Idee-der Index-and-Work-Baum begehen Paar Art baumelt das Original begehen, mit dem refs/stash Bezug aus Zeigen Sie auf das Paar und nicht auf den Zweignamen. Es sieht fast wie eine kleine Handtasche oder ein Essensvorrat aus, der an einem Baumast hängt, um ihn von Bären fernzuhalten, oder so etwas, deshalb bezeichne ich das gerne als "Verstecksack".

0

Torek (wie üblich) bietet eine ausgezeichnete Antwort, aber ich glaube, die kurze Antwort hier ist nur zu beachten, dass der Stash Daten als Stack (LIFO) enthält. Also, als du A's Arbeit und dann Bs Arbeit geschoben hast, erscheint zuerst B und dann A. Wenn du also zu A zurück gegangen bist und dann den ersten Pop gemacht hast, hast du die gespeicherte B Arbeit.

0

Wenn Sie ein Stash-Objekt auflegen, wird dieses letzte Stash-Objekt erneut angewendet, unabhängig davon, welchen Zweig Sie versteckt haben! Das Problem, das Sie veröffentlichen, ist, dass der letzte Stash, der in Zweig B erstellt wurde, in Zweig A erneut angewendet wurde. Beim nächsten Mal müssen Sie angeben, welchen Stash Sie ablegen möchten.

Lösung des gegebenen Problems:

  1. Stash wieder der aktuelle Status
  2. die Stash Pop, die vor dem letzten ist

Das ist alles.