Erstellen Sie einen Git-Zweig mit aktuellen Änderungen

849

Ich begann meine Arbeit Master - Zweig denken , dass meine Aufgabe leicht sein würde. Nach einer Weile wurde mir klar, dass es mehr Arbeit kosten würde und ich möchte all diese Arbeit in einer neuen Niederlassung erledigen.

Wie kann ich einen neuen Zweig erstellen und all diese Änderungen mitnehmen, ohne den Meister zu beschmutzen ?

willcodejavaforfood
quelle
4
Ja, dies sind doppelte Fragen, aber der Wortlaut ist so unterschiedlich, dass ich denke, dass dies nützlich ist, um ihn beizubehalten. Beachten Sie die Stichworte hier: branch current changesvs existing uncommited branch. Jeder, der Englisch spricht, wird sofort feststellen, dass sie gleich sind, Suchmaschinen jedoch wahrscheinlich nicht. Behalte diese Frage.
Scott Biggs

Antworten:

691

Wenn Sie noch keine Festschreibung vorgenommen hätten, würden nur (1: Zweig) und (3: Kasse) ausreichen.
Oder in einem Befehl:git checkout -b newBranch

Wie in der git resetManpage erwähnt :

$ git branch topic/wip     # (1)
$ git reset --hard HEAD~3  # (2)  NOTE: use $git reset --soft HEAD~3 (explanation below)
$ git checkout topic/wip   # (3)
  1. Sie haben einige Verpflichtungen eingegangen, stellen jedoch fest, dass sie verfrüht waren, in der " master" Branche zu sein. Sie möchten sie in einem Themenzweig weiter polieren, also erstellen Sie einen Zweig " topic/wip" aus dem aktuellen HEAD.
  2. Spulen Sie den masterZweig zurück, um diese drei Commits zu entfernen.
  3. Wechseln Sie zum topic/wipZweig " " und arbeiten Sie weiter.

Hinweis: Aufgrund des "destruktiven" Effekts eines git reset --hardBefehls (er setzt den Index und den Arbeitsbaum zurück. Alle Änderungen an den nachverfolgten Dateien im Arbeitsbaum werden seitdem <commit>verworfen) würde ich lieber gehen mit:

$ git reset --soft HEAD~3  # (2)

Dies würde sicherstellen, dass ich keine private Datei verliere (nicht zum Index hinzugefügt).
Die --softOption berührt weder die Indexdatei noch den Arbeitsbaum (setzt jedoch den Kopf zurück <commit>, genau wie in allen Modi).


Mit Git 2.23+ würde der neue Befehlgit switch den Zweig in einer Zeile erstellen (mit der gleichen Art von reset --hard, also hüte dich vor seiner Wirkung):

git switch -f -c topic/wip HEAD~3
VonC
quelle
6
Es ist wahrscheinlich auch erwähnenswert, dass dies keine gute Idee wäre, wenn Sie Themenmaterial für Ihre Hauptniederlassung in einem Repository festgelegt haben, aus dem andere Personen ziehen. Oder zumindest, wenn Sie einen Reset durchführen müssen, müssen Sie den Leuten sagen, dass Sie das tun, damit die Warnungen von ihrem nächsten Zug kein allzu großer Schock sind.
Andrew Walker
39
Hinweis für zukünftige Leser: Lesen Sie von unten nach oben (oder lesen Sie unbedingt das Ganze). git reset --hardwird Ihre Änderungen zerstören, und wenn sie noch nicht festgeschrieben sind, können sie nicht wiederhergestellt werden! Sie brauchen vielleicht nurgit checkout -b …
Conrad Meyer
3
@ ConradMeyer Guter Punkt. Ich habe die Antwort bearbeitet und die git checkout -berste gesetzt.
VonC
5
Warum Thema / Zweig? Warum nicht nur Filialname, gibt es einen besonderen Grund für diese Benennung? Ich wundere mich nur.
Sam Stoelinga
1
@ Es handelt sich lediglich um eine Namespace-Namenskonvention (eine Möglichkeit zum einfachen Klassifizieren von Zweigen mithilfe hierarchischer Zweignamen zum Definieren von Namespaces): stackoverflow.com/a/2527436/6309 . Zum Beispiel für Probleme: randyfay.com/content/… . Sie müssen keine Hierarchie verwenden, wenn Sie Ihre Zweige nammen. topic_wipwürde auch funktionieren;)
VonC
269

Wie in dieser Frage angegeben: Git: Erstellen Sie einen Zweig aus nicht getaggten / nicht festgeschriebenen Änderungen auf master : stash ist nicht erforderlich.

Benutz einfach:

git checkout -b topic/newbranch

Nicht festgeschriebene Arbeiten werden in die neue Niederlassung übernommen.

Wenn Sie versuchen zu pushen, erhalten Sie die folgende Meldung

fatal: Die aktuelle Verzweigungsfunktion / NEWBRANCH hat keine vorgelagerte Verzweigung. Verwenden Sie, um den aktuellen Zweig zu pushen und die Fernbedienung als Upstream einzustellen

git push --set-upstream origin feature/feature/NEWBRANCH

Gehen Sie einfach wie vorgeschlagen vor, um den Zweig remote zu erstellen:

git push --set-upstream origin feature/feature/NEWBRANCH

EeKay
quelle
3
Der Fehler "Kein Upstream-Zweig" wird nur angezeigt, wenn Sie den neuen Zweig pushen, nicht, wenn Sie die neue Arbeit festschreiben.
Sam
2
@sam Ich habe die Antwort entsprechend geändert
Nick Kennedy
73

Folge diesen Schritten:

  1. Erstellen Sie einen neuen Zweig:

    git branch newfeature
    
  2. Kasse neuer Zweig: (Dadurch wird Ihre Arbeit nicht zurückgesetzt.)

    git checkout newfeature
    
  3. Legen Sie jetzt Ihre Arbeit an diesem neuen Zweig fest:

    git commit -s
    

Wenn Sie die obigen Schritte ausführen, bleibt Ihr ursprünglicher Zweig sauber und Sie müssen kein 'git reset --hard' durchführen.

AvadhP
quelle
3
Was machen die '-s' in Schritt 3?
Scott Biggs
12
@ScottBiggs Es ist unnötig, aber eine Praxis, der einige Leute folgen. Es ist die Abkürzung für "--signoff" und fügt Ihren Benutzernamen zum Commit hinzu, damit zukünftige Personen, die sich die Protokolle ansehen , wissen, dass Sie dieses Commit geduldet haben.
Frank Bryce
5
Schöne Antwort, aber keine Notwendigkeit -sin Schritt 3.
Mohammed Ali
Ich habe etwas Neues aus dem Kommentar gelernt. Danke @FrankBryce
Kasparov92
30

Da Sie noch keine Commits vorgenommen haben, können Sie alle Ihre Änderungen im Stash speichern, erstellen und zu einem neuen Zweig wechseln und diese Änderungen dann wieder in Ihren Arbeitsbaum einfügen:

git stash  # save local modifications to new stash
git checkout -b topic/newbranch
git stash pop  # apply stash and remove it from the stash list
Äther
quelle
9
oder wie VonC 'git checkout -b newbranch' hervorhob und das
Versteck übersprang
@will: Ich dachte, dass das Erstellen eines neuen Zweigs alle nicht festgeschriebenen Änderungen überschreiben würde, aber wenn dies nicht der Fall ist, können Sie den Stash überspringen.
Ether
1
Ich habe es versucht und es hat gut funktioniert, Git ist sehr nachdenklich und überschreibt keine lokalen Änderungen
Willcodejavaforfood
2
Ich nehme an, es war ein Tippfehler, aber nur ein Heads-up, git stash pushdas kein Befehl ist. Sie möchten vermutlich git stashoder verwenden git stash save. Wenn Sie nicht verfolgte Dateien in den Vorrat aufnehmen möchten, verwenden Sie die --include-untrackedOption. Wenn Sie sowohl nicht verfolgte als auch ignorierte Dateien in den Stash aufnehmen möchten, verwenden Sie --addstattdessen die Option.
Sechs
Falls Sie den Zweig bereits erstellt haben, ist dies hilfreich.
Sicher
13

So fügen Sie einem neuen Zweig neue Änderungen hinzu und drücken auf Remote:

git branch branch/name
git checkout branch/name
git push origin branch/name

Oft vergesse ich, den Ursprungsteil hinzuzufügen, um zu pushen, und bin verwirrt, warum ich den neuen Zweig / Commit in Bitbucket nicht sehe

Patrick Schaefer
quelle