2010-04-02 5 views
742

Kontext: Ich arbeite an Master hinzufügen eine einfache Funktion. Nach ein paar Minuten merke ich, dass es nicht so einfach war und es besser gewesen wäre, in eine neue Filiale zu arbeiten.Git: Erstellen Sie eine Zweigstelle von nicht gestützten/nicht festgeschriebenen Änderungen am Master

Das passiert immer mit mir und ich habe keine Ahnung, wie ich zu einem anderen Zweig wechseln und alle diese unbeaufsichtigten Änderungen mit mir den Master-Zweig sauber verlassen. Ich soll git stash && git stash branch new_branch würde einfach das erreichen, aber das ist, was ich bekommen:

~/test $ git status 
# On branch master 
nothing to commit (working directory clean) 

~/test $ echo "hello!" > testing 

~/test $ git status 
# On branch master 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: testing 
# 
no changes added to commit (use "git add" and/or "git commit -a") 

~/test $ git stash 
Saved working directory and index state WIP on master: 4402b8c testing 
HEAD is now at 4402b8c testing 

~/test $ git status 
# On branch master 
nothing to commit (working directory clean) 

~/test $ git stash branch new_branch 
Switched to a new branch 'new_branch' 
# On branch new_branch 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: testing 
# 
no changes added to commit (use "git add" and/or "git commit -a") 
Dropped refs/[email protected]{0} (db1b9a3391a82d86c9fdd26dab095ba9b820e35b) 

~/test $ git s 
# On branch new_branch 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: testing 
# 
no changes added to commit (use "git add" and/or "git commit -a") 

~/test $ git checkout master 
M testing 
Switched to branch 'master' 

~/test $ git status 
# On branch master 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: testing 
# 
no changes added to commit (use "git add" and/or "git commit -a") 

Wissen Sie, ob es eine Möglichkeit, dies zu erreichen ist?

+0

Obwohl es eine einfachere Lösung für Ihr Problem ist, können Sie in dem, was das Ergebnis, das Sie erhalten, unterscheidet sich von dem, was man wollte angeben könnten? – Gauthier

+1

durch die oben genannten oder die Antworten am unteren Rand, die nicht committed Änderungen sind sowohl auf Master-und der neue Zweig. Ich will sie nur auf dem neuen Zweig, so kann ich Master und arbeiten an einer anderen Sache, ohne diese Änderungen schweben um – knoopx

+1

siehe meine bearbeitete Antwort. Sie müssen Ihre lokalen Änderungen für den neuen Zweig festschreiben, wenn Sie einen sauberen Master auschecken möchten. Lokale Änderungen sind nur die Unterschiede zwischen dem aktuellen HEAD und Ihren Dateien auf der Festplatte. Diese Änderungen an lokalen Dateien sind nicht versioniert, Sie müssen git anweisen, sie irgendwo zu speichern, wenn Sie sie später abrufen möchten. – Gauthier

Antwort

884

Keine Notwendigkeit zu verstauen.

git checkout -b new_branch_name 

berührt nicht Ihre lokalen Änderungen. Es erstellt nur den Zweig vom aktuellen HEAD und setzt den HEAD dort. Also ich denke das ist was du willst.

--- Bearbeiten, um das Ergebnis der Kasse Master zu erklären ---

Sind Sie verwirrt, weil checkout master verwirft die Änderungen nicht?

Da die Änderungen nur lokal sind, möchte Git nicht, dass Sie sie zu leicht verlieren. Beim Ändern der Verzweigung überschreibt git Ihre lokalen Änderungen nicht. Das Ergebnis Ihrer checkout master ist:

M testing 

, was bedeutet, dass Ihre Arbeitsdateien sind nicht sauber. Git hat den HEAD geändert, aber Ihre lokalen Dateien nicht überschrieben. Aus diesem Grund werden in Ihrem letzten Status immer noch Ihre lokalen Änderungen angezeigt, obwohl Sie sich unter master befinden.

Wenn Sie die lokalen Änderungen wirklich verwerfen möchten, müssen Sie den Checkout mit -f erzwingen.

git checkout master -f 

Da Ihre Änderungen nie ausgeführt wurden, würden Sie sie verlieren.

Versuchen Sie, zu Ihrem Zweig zurückzukehren, Ihre Änderungen zu bestätigen und dann den Master erneut auszuprobieren.

git checkout new_branch 
git commit -a -m"edited" 
git checkout master 
git status 

Sie sollten eine M Nachricht nach der ersten Kasse bekommen, aber dann nicht mehr nach dem checkout master und git status keine geänderten Dateien zeigen.

--- Bearbeiten Verwirrung über Arbeitsverzeichnis (lokale Dateien) ---

In Antwort auf Ihren ersten Kommentar, sind lokale Änderungen nur zu klären ... na ja, lokal. Git speichert sie nicht automatisch, Sie müssen es ihm mitteilen, um sie für später zu speichern. Wenn Sie Änderungen vornehmen und sie nicht explizit festschreiben oder speichern, wird git diese nicht versionieren. Wenn Sie HEAD ändern (checkout master), werden die lokalen Änderungen nicht überschrieben, da sie nicht gespeichert wurden.

+0

So mache ich es immer. Es funktioniert genau so, wie Sie es möchten. – synic

+0

Alter, ich habe diesen wichtigen Punkt vermisst. Ich denke, ich habe verstanden, warum das passiert und warum Git offensichtlich die Änderungen nicht ignorieren kann (ohne Ablegen zu erzwingen), wenn ich sie nicht zuerst begehe. Danke: D – knoopx

+22

Die verwirrende Sache hier ist, dass git's man page besagt, dass "git checkout" "Dateien im Arbeitsbaum aktualisiert, um der Version im Index oder der angegebenen Struktur zu entsprechen.". Das setzt voraus, dass Ihre Änderungen in Ihrem Dateisystem * GONE * danach sind. Ohne jede Chance, sie zurückzubekommen. Selbst wenn du sagst, dass sie das nicht tun werden, hinterlässt das immer noch ein sehr schlechtes Gefühl. Ich traue diesem überhaupt nicht *. Entweder ist die Dokumentation wirklich schlecht oder das Standardverhalten von git ist wirklich gefährlich. Man sollte sich nicht auf eine "automatische" Heuristik verlassen können, um zu erkennen, dass Sie in diesem Fall Ihre Änderungen nicht verlieren wollen. – Evi1M4chine

46

Versuche:

git stash 
git checkout -b new-branch 
git stash apply 
+5

Ist das anders, als einfach 'git checkout -b new-branch' zu machen? –

+0

Ich glaube nicht, dass es war, als die Antwort ursprünglich geschrieben wurde, aber ich könnte falsch liegen. Leider habe ich aufgrund meiner Arbeitsumstände die letzten paar Jahre immer wieder benutzt, so dass ich die Genauigkeit jetzt nicht bestätigen kann. –

+2

Oder statt der letzten zwei Schritte: Git Stash Zweig New-Zweig – rethab

12

Zwei Dinge, die Sie tun können:

git stash -u 
git branch sillyname [email protected]{0} 

oder

git checkout -b sillyname 
git commit -am "silly message" 
git checkout - 

(git stash -u < - die -u bedeutet, dass es dauert auch unstaged Änderungen)

(git checkout - < - die Strich ist eine Abkürzung für den vorherigen Zweig, in dem Sie waren)

4

Wenn Sie den GitHub Windows Client (so wie ich) verwenden und nicht festgeschriebene Änderungen vornehmen möchten, die Sie in einen neuen Zweig verschieben möchten, können Sie einfach einen neuen Zweig über den GitHub Client erstellen . Es wird in den neu erstellten Zweig wechseln und Ihre Änderungen beibehalten.

enter image description here

+0

speichert die Änderungen, bevor der neue Zweig erstellt wird, damit er nicht beibehalten wird (Version 223 unter Mac OS) –

Verwandte Themen