In einem Repo habe ich mehrere Zweige, darunter "Master" und "Entwickeln", die eingerichtet sind, um entfernte Zweige "Ursprung / Master" und "Ursprung / Entwickeln" zu verfolgen.
Kann festgelegt werden, dass sowohl Master als auch Entwicklung gleichzeitig zusammengeführt (schnell vorgespult) werden sollen?
Wenn ich das git pull
jetzt mache, bekomme ich so etwas:
remote: Counting objects: 92, done.
remote: Compressing objects: 100% (56/56), done.
remote: Total 70 (delta 29), reused 28 (delta 8)
Unpacking objects: 100% (70/70), done.
From scm.my-site.com:my-repo
5386563..902fb45 develop -> origin/develop
d637d67..ba81fb2 master -> origin/master
Updating 5386563..902fb45
Fast-forward
Alle Remote-Zweige werden abgerufen, aber nur der Zweig, in dem ich mich gerade befinde, wird mit dem entsprechenden Remote-Zweig zusammengeführt.
Also muss ich tun git checkout master
...
Switched to branch 'master'
Your branch is behind 'origin/master' by 106 commits, and can be fast-forwarded.
... und dann noch git pull
einmal und dann zurück zum Entwickeln, um das gewünschte Ergebnis zu erzielen.
Ich weiß, dass ich Aliase / Skripte erstellen kann, die diese Schritte ausführen. Aber ich möchte das nach Möglichkeit vermeiden, da es fehleranfällig und nicht sehr effizient ist .
Edit: ok lass mich das umformulieren. Mein Ziel war es nicht, das Anpassen von Git durch Skripte / Alias zu entmutigen oder die Stirn zu runzeln. Ich würde nur eine eingebaute Lösung bevorzugen, wenn es existiert :)
git pull origin refs/heads/develop:refs/remotes/origin/develop refs/heads/master:refs/remotes/origin/master
aber das hat dazu geführt, dass der Remote-Master in die Entwicklung integriert wurde.pull
in einenfetch
gefolgt von einemmerge
in jeden Zweig aufteilen .Antworten:
Sie können einen Alias einrichten, der
git fetch
mit refspecs verwendet wird, um Ihre Zweige mit nur einem Befehl schnell zusammenzuführen. Richten Sie dies als Alias in Ihrer Benutzerdatei ein.gitconfig
:Verwendung :
git sync
.Hier ist, warum es funktioniert:
git checkout --quiet HEAD
Überprüft direkt Ihr aktuelles Commit und versetzt Sie in den Status " Abgelöst" . Auf diese Weise, wenn Sie sindmaster
oderdevelop
, Sie lösen Ihre Arbeitskopie von diesem Zweig Zeiger, so dass sie verschoben werden (Git wird nicht zulassen , dass Sie die Zweig Referenzen verschieben , während der Arbeitskopie hat sie ausgecheckt).git fetch origin master:master develop:develop
verwendet refspecs mitfetch
, um diemaster
und -Zweigedevelop
in Ihrem lokalen Repo schnell vorzuspulen . Die Syntax sagt Git im Grunde: "Hier ist eine Referenz des Formulars<source>:<destination>
. Nehmen Sie es<destination>
und spulen Sie es bis zum selben Punkt vor wie<source>
". Die Quellen im Alias sind also die Zweige vonorigin
, während die Ziele die lokalen Repo-Versionen dieser Zweige sind.Schließlich
git checkout --quiet -
checkt die Filiale waren Sie das letzte Mal, unabhängig davon , ob oder ob nicht ein Fehler in den vorherigen Befehlen war. Wenn Sie alsomaster
beim Ausführen eingeschaltetgit sync
waren und alles erfolgreich ist, verlassen Sie den Status des getrennten Kopfes und überprüfen die neu aktualisierten Datenmaster
.Siehe auch meine Antwort auf git: einen lokalen Zweig aktualisieren, ohne ihn auszuchecken? .
quelle
origin/develop
wenn Sie den Alias verwenden? Es wäre nicht sinnvoll, wenn es Ihre lokaledevelop
Niederlassung wäre. Außerdem kann der Zeiger fürmaster
verschoben werden, wenn erdevelop
ausgecheckt ist. Wenn ermaster
ausgecheckt ist, können Sie nicht schnell vorspulen,master
da dies Ihre Arbeitskopie beeinträchtigen würde. Deshalb trennen Sie die Arbeitskopie von ihm zuerst mitgit checkout head
. Ich habe eine andere Antwort gesehen, die es als "auf einem Felsen stehen" beschrieb. Man muss vom Felsen steigen, bevor man ihn bewegen kann.fatal: bad config line xx in file xxx
. was durch das Semikolon verursacht wird. Sie müssen den gesamten Befehl in doppelte Anführungszeichen setzen, um dieses Problem zu vermeiden.Installiere git-up . Sie erhalten den Befehl, mit
git-up
dem alle lokalen Zweige in Ihrem Repository abgerufen werden.quelle
Es scheint, dass es keine eingebaute Option für Git gibt, um in mehrere Zweige zu ziehen. Zumindest nicht in Version 1.8.0. obwohl @ Cupcakes Antwort nah dran ist.
Durch den Kommentar von @ jjlin wurde mir jedoch klar, dass ich zumindest nicht zweimal ziehen muss.
Eine etwas effizientere Sequenz wäre also:
Unweigerlich habe ich einen Alias erstellt, mich aber entschlossen, den Auszug wegzulassen, und mich darauf konzentriert, nur einen anderen Zweig schnell vorzuspulen.
Ohne Tests setzt dieser Alias natürlich voraus, dass ich einen gültigen Namen eines ff'able-Zweigs als erstes Argument gebe und ansonsten ein undefiniertes Verhalten habe. Es ist auch nicht optimal für Anwendungsfälle mit mehr als zwei Zweigen, aber es wird mir das bringen, was ich jetzt brauche.
quelle