2013-08-06 8 views
6

Ich arbeite am Zweig A und die Funktion/Aufgabe ist nicht erledigt. Dann muss ich für eine schnelle Lösung zu einem anderen Zweig B wechseln. Wenn ich versuche, einen anderen Zweig einzuschalten, zwingt Git mich, meine lokalen Änderungen zu speichern, sonst verliere ich alle lokalen Änderungen.Auf lokalen Zweig, nicht wollen, Änderungen zu bestätigen, müssen aber zu einem anderen Zweig wechseln

Ich muss meinen unvollständigen Code begehen. Gibt es eine Möglichkeit, dass ich zwischen mehreren Zweigen wechseln kann, ohne Code zu binden oder zu verlieren? Oder gibt es einen besseren Weg, mit der Situation umzugehen?

+0

möglich Duplikat [Speichern Git ändert vorübergehend] (http://stackoverflow.com/questions/6800778/saving-git-changes-temporarily) –

Antwort

9

Eine Option, wie mipadi demonstrates, ist einfach git stash zu verwenden.

Eine andere Möglichkeit ist, einfach nur Ihre aktuelle Arbeit in Fortschritt verpflichten, Zweige zu wechseln, und dann, wenn Sie bereit sind, zurück zu wechseln, führen Sie eine gemischte Reset zurück zu Ihrer vorherigen begehen: wird

# While working on "feature" branch, 
# you suddenly need to go work on a hotfix: 
$ git commit --all --message "Backup my feature work" 
$ git checkout -b hotfix master 

# You did your hotfix, and are ready to go back to feature 
$ git checkout feature 
$ git reset head^ 

git reset head^ Führen Sie ein gemischtes Zurücksetzen auf das Commit durch, bevor Sie ein Backup-Commit durchgeführt haben, und alle Änderungen, die Sie an Ihrem Backup-Commit vorgenommen haben, werden in Ihrer Arbeitskopie wiederhergestellt. Vom official Linux Kernel documentation for git reset (Hervorhebung von mir):

Resets der Index aber nicht die Arbeits Baum (das heißt, die geänderten Dateien werden beibehalten, aber nicht für begehen markiert) und berichtet, was nicht aktualisiert wurde. Dies ist die Standardaktion.

+0

+1 Ich würde das auch empfehlen, da ein 'Git-Stash' nichts mit einem Zweig zu tun hat. Doing 'git commit -a -m" stashing "' behält den Kontext Ihrer Arbeit. Dies sollte die akzeptierte Antwort sein. – eckes

+0

Das Stashing steht möglicherweise nicht mit einem Zweig in Verbindung, aber _ist_ basiert auf dem aktuellen HEAD-Commit. 'git show -s stash' zeigt das Stash-Commit als eine Zusammenführung zweier Eltern-Commits, von denen das erste der HEAD ist, auf dem der Stash basiert.Und 'git stash [save]' ohne eine gegebene Nachricht zeichnet standardmäßig den Namen der Verzweigung auf. – musiphil

+0

Ich bevorzuge das Speichern von temporären Objekten, da nur ein 'git stash'-Befehl den Status des Index und des Arbeitsbaums speichern kann. Beim Commit werden die Änderungen in der Arbeitsbaumstruktur, die nicht im Index bereitgestellt ist, nicht erfasst. – musiphil

8

Sie können git stash verwenden, die Ihre Änderungen speichern, ohne ein Commit zu erstellen.

Zuerst verstauen Sie Ihre Änderungen:

$ git stash 

dann auf Ihre anderen Zweig wechseln:

$ git checkout branch-B 

Wenn Sie lesen, zu Ihrem ursprünglichen Zweig zurück und unstash Ihre Änderungen :

$ git checkout branch-A 
$ git stash pop 

Siehe die verknüpfte Dokumentation oben für weitere Details und Besonderheiten zu weiteren Anwendungsfällen.


Technisch es schafft ein begehen, aber git stash verwendet einige Magie, so dass Sie nicht wirklich sehen der Commit, und Git-Tools wissen, wie man richtig mit diesen Pseudo-Commits beschäftigen.

+0

gut, was ist, wenn, wenn ich einige Änderungen am Zweig-B getan haben und ihnen verpflichtet sind, werden unsere Änderungen von Filiale A nicht begehen? – Suleman