2010-02-02 12 views
24

Ich habe hier herum gesucht, um nach einer Antwort zu suchen, und es scheint, dass ich nur falsche Annahmen darüber machen kann, wie git Zweige funktionieren sollen.Untracked Dateien zwischen den Zweigen in Git

Ich habe meine master Zweig und ich habe eine Feature-Zweig namens profiles erstellt, wo ich einige spezifische Arbeit zu Profilen tun. Während ich an Profilen arbeitete, habe ich 5 oder 6 Dateien geändert und weitere 5 oder 6 neue Dateien hinzugefügt. Ich musste zurück in den Zweig master wechseln, um einen schnellen Fehler zu beheben, und bemerkte, dass alle neuen Dateien und geänderten Dateien darin enthalten waren. Ich denke, das macht Sinn, da git nicht entfernte Dateien aus dem Zweig master entfernt und sie für meinen Zweig profiles zurückbringt, da sie tatsächlich nicht geparkt sind. Aber was ist mit den Änderungen an bestehenden Dateien? Warum tauchen sie im Master-Zweig auf?

Was ist die beste Vorgehensweise hier. Ich bin noch nicht bereit, die Änderungen lokal zu übernehmen. Sollte ich all diese Änderungen einfach verdecken, wechseln Sie zu master, machen Sie den kleinen Fehler, wechseln Sie zurück zu profiles, dann wenden Sie das Versteck erneut an?

Jede Hilfe wird geschätzt. Danke

Antwort

33

"Ich bin noch nicht bereit, die Änderungen lokal zu übernehmen."

Commits in git sind lokale Dinge, die nach Belieben rückgängig gemacht, wiederhergestellt und wieder hergestellt werden können. Nur wenn Sie das Commit irgendwo hinschieben, müssen Sie darauf achten.

Plus, Commits sind sichtbar für lokale Tools wie gitk, und können Diffs von ihnen genommen haben und kann auf andere Commits etc. rebased werden. Es ist ein sehr mächtiges Werkzeug. Lernen Sie, es zu benutzen.

ich häufig:

git add .; git commit -a -m 'WIP' 

einfach alles in der aktuellen Arbeit Baum bunkern, wenn ich glaube, ich unterbrochen werden könnte. Wenn ich noch ein paar Änderungen mache, benutze ich:

um meine "WIP" Commit in-Place zu aktualisieren. Als ich für die reale endlich bereit bin zu begehen, ich habe gerade:

git reset --soft HEAD~; git reset 

und jetzt kann ich sorgfältig kontrollieren, was die letzte sein wird begehen.

+1

Ich habe eine schreckliche Erinnerung und mag Git verwenden, um zu sehen, wo ich auf meiner Arbeit bin (und mit magit ist es noch einfacher, und ist in meinem Workflow integriert). Wirklich, Ihre Lösung macht jedoch mehr Sinn. Begib dich einfach öfter. Ich muss meinen Workflow ein wenig optimieren. Danke – Clarence

+2

Nur zur Klarstellung, gibt es einen beabsichtigten Unterschied zwischen 'git reset --soft HEAD ~; git reset' und 'git reset HEAD ^'? Soweit ich das sehen kann, setzen beide HEAD und den Index auf das Elternelement des "WIP" -Commits zurück, das bereit ist, ein echtes Commit zu machen, indem einige oder alle Änderungen des Arbeitsbaums verwendet werden, aber vielleicht habe ich eine Feinheit verpasst. –

+2

@Charles Bailey: "--soft berührt weder die Indexdatei noch den Arbeitsbaum, sondern verlangt, dass sie in einer guten Reihenfolge sind. Dadurch bleiben alle geänderten Dateien" Änderungen festgeschrieben ", wie der Git-Status sagen würde es." Wenn du "git reset HEAD ^" verwendest, bekommst du das nicht fatal: Kann während der Zusammenführung keinen Soft-Reset durchführen. – maletin

5

Sie sind nicht in der Master-Zweig angezeigt - wenn Sie einen harten Reset und eine saubere, würden sie verschwinden. Git bewahrt lediglich Ihre lokalen Änderungen, wenn Sie Zweige wechseln.

Dies ist normalerweise nützlich; Sie haben vielleicht bemerkt, dass Sie diese Änderungen an einen anderen Zweig als den, an dem Sie sich gerade befinden, senden möchten. Wenn die Änderungen mit dem Unterschied zwischen den beiden Zweigen in Konflikt stehen, würde git sich weigern, die Zweige zu wechseln.

Sie haben Recht mit dem besten Ansatz, obwohl - Zweige sauber wechseln ist nach meiner Erfahrung eine der häufigsten Anwendungen von git stash.

3

Es klingt wie Sie den Zweig mit git branch profiles erstellt, aber er schaltet nicht auf sie, so Waren Sie in master, und es wurde die Änderungen Datei, wenn Sie eine begangen hat.

Nachdem Sie die Verzweigung erstellt haben, müssen Sie explizit mit git checkout darauf umschalten (erstellen Sie einfach eine neue Zweigstelle und wechseln Sie in einem Schritt mit git checkout -b).

Wenn Sie Änderungen haben Sie nicht wollen, zu verlieren (auf den aktuellen Zweig oder begehen), sondern in den anderen Zweig setzen, tun:

git add -A 
git stash 
git checkout <other branch> 
git stash pop 

Weitere Informationen über git stash von git-scm.com verfügbar ist

Verwandte Themen