Git Zweig vom aktuell ausgecheckten Master erstellen?

78

Auf einem Server befindet sich ein git-gesteuerter Ordner, in dem der Hauptzweig ausgecheckt ist und ein ganzer Stapel von Dateien geändert und nicht festgeschrieben wurde. Gibt es eine Möglichkeit für mich, die Änderungen in einem separaten Zweig festzuschreiben, damit ich zu einer sauberen Version zurückkehren kann?

Das heißt, ich möchte alle Änderungen dieser Personen effektiv rückgängig machen, sie aber bei einer anderen Gelegenheit speichern. Wenn diese Person ihre Änderungen wünscht, kann sie zu diesem Zweig wechseln.

(Ja, ich weiß, dass Git nicht so funktioniert, aber das ist meine Situation!) Alle Ideen werden sehr geschätzt.

Corydoras
quelle
1
ähnlich wie < stackoverflow.com/questions/1394797/… >. und hey, git funktioniert in deinem Fall sehr gut, ich würde nicht sagen, dass es nicht für einen solchen Workflow ausgelegt ist. es ist!
Stricken
Nur zur Klarstellung erwarte ich, dass die Änderungen niemals verwendet werden, aber ich brauche für alle Fälle eine permanente Aufzeichnung.
Corydoras

Antworten:

136

Zunächst wird der Wechsel zu einem anderen Zweig basierend auf dem aktuellen HEAD folgendermaßen ausgeführt:

git checkout -b newbranch

Übernehmen Sie alle Änderungen (vorausgesetzt, keine neu hinzugefügten Dateien, sonst git adddiese):

git commit -a

Gehen Sie zurück zum Hauptzweig:

git checkout master

Die zuvor nicht festgeschriebenen Änderungen befinden sich alle in der Zweigstelle newbranch, und der Master befindet sich weiterhin in dem Zustand, in dem er ohne diese Änderungen war.

CB Bailey
quelle
5
Erläuterung: Der Inhalt des Arbeitsrepositorys und die bereitgestellten Änderungen gehören keinem Zweig an. Das einfache Erstellen eines neuen Zweigs außerhalb von HEAD (letzte Überarbeitung) reicht aus, damit das neue Commit für den gerade erstellten Zweig fortgesetzt werden kann <newbranch>.
Jakub Narębski
Vielen Dank, ich dachte, der Wechsel zu einem neuen Zweig könnte die Änderungen wegwischen. Aus einem SVN-Hintergrund stammend, hielt ich einen solchen Wechsel nicht für möglich. Testen Sie es jetzt.
Corydoras
14

Diese Methode ist nützlich:

git checkout -B <new_branch> <start point>

Wo:

  • <new_branch>ist dein neuer Zweig (zB my_branch)
  • <start point>ist Ihr Startzweig ( masterin Ihrem Fall)
  • -BErstellt einen neuen Zweig ab <start point>, wenn er bereits vorhanden ist, und setzt ihn dann zurück (er schlägt nicht fehl, -bwenn der Zweig bereits vorhanden ist).
  • Manchmal -mkann es nützlich sein, beim Wechseln von Zweigen anzugeben. Dadurch wird eine Drei-Wege-Zusammenführung zwischen dem aktuellen Zweig und dem Inhalt Ihres Arbeitsbaums durchgeführt (nützlich für die Skripterstellung).

Siehe: man git-checkoutfür weitere Details.

Kenorb
quelle
13

Sie können Ihre Änderungen jederzeit aufbewahren.

git stash
git checkout -b bravenewmaster
git stash apply

Denken Sie auch daran, dass Sie diesen Zweig immer zurückschieben können, wenn Sie sich auf den "falschen" Zweig festlegen, da der Zweig nichts anderes als ein Zeiger auf einen Commit ist.

Michael Krelin - Hacker
quelle
3
Warum sollten Sie sich die Mühe machen, etwas zu verstauen, wenn Sie dieselben Änderungen sofort erneut anwenden möchten? Sie können es genauso gut tun git checkout -b bravenewmaster. Es ist weniger tippend und berührt nicht alle geänderten Dateien unnötig.
CB Bailey
1
Nun, ich habe es nicht versucht, aber ich nahm an, dass gitaus irgendeinem Grund nicht zulässt, git checkout -bwenn es Änderungen gibt. Ansonsten warum fragen? ;-)
Michael Krelin - Hacker
Für das, was ich unter "Ich möchte alle Änderungen dieser Personen effektiv rückgängig machen, aber sie bei einer anderen Gelegenheit speichern, damit diese Person zu ihren Änderungen wechseln kann, kann sie zu diesem Zweig wechseln" ist die Bemerkung, dass das Verstauen allein ohne Verzweigung und Anwenden ausreichen sollte .
Michael Krelin - Hacker
1
Wenn er die Änderungen speichert (anstatt sie vorübergehend zu "verstauen"), ist es wahrscheinlich angemessener, ein Commit (mit einer Nachricht) für einen benannten Zweig zu erstellen, als ein Versteck, das nicht versehentlich gelöscht werden darf. Beides würde jedoch funktionieren.
CB Bailey
1
Natürlich kann ich die Absichten anderer Leute nicht vollständig verstehen, aber ich hatte das Gefühl, dass "ich an dieser Instanz arbeiten möchte, aber Sie haben das verdammt noch mal geändert, würden Sie bitte ausweichen und sich später selbst darum kümmern" ;-)
Michael Krelin - Hacker