Wie kann ich einen lokalen Git-Zweig einfach auf eine Fernbedienung mit einem anderen Namen übertragen?

175

Ich habe mich gefragt, ob es eine einfache Möglichkeit gibt, einen lokalen Zweig mit einem Remote-Zweig mit einem anderen Namen zu verschieben und zu ziehen, ohne immer beide Namen anzugeben.

Beispielsweise:

$ git clone myrepo.git
$ git checkout -b newb
$ ...
$ git commit -m "Some change"
$ git push origin newb:remote_branch_name

Wenn jemand remote_branch_name aktualisiert, kann ich:

$ git pull

Und alles wird zusammengeführt / vorgespult. Wenn ich jedoch Änderungen an meinem lokalen "Neuling" vornehme, kann ich nicht:

$ git push

Stattdessen muss ich:

% git push origin newb:remote_branch_name

Scheint ein wenig albern. Wenn git-pullverwendet wird git-config branch.newb.merge, um zu bestimmen, woher gezogen werden soll, warum kann es keine git-pushähnliche Konfigurationsoption geben? Gibt es dafür eine nette Abkürzung oder soll ich einfach den langen Weg fortsetzen?

jmacdonagh
quelle

Antworten:

93

Sicher. Stellen Sie einfach Ihre push.defaultzu upstreamihren Upstreams zu schieben Zweige (die die gleiche ist , die pullaus, definiert durch ziehen werden branch.newb.merge), anstatt schieben Zweige zu denen passenden Namen (das ist die Standardeinstellung für push.default, matching).

git config push.default upstream

Beachten Sie, dass dies früher trackingnicht upstreamvor Git 1.7.4.2 aufgerufen wurde. Wenn Sie also eine ältere Version von Git verwenden, verwenden Sie trackingstattdessen. Die push.defaultOption wurde in Git 1.6.4 hinzugefügt. Wenn Sie also eine ältere Version verwenden, haben Sie diese Option überhaupt nicht und müssen den Zweig, an den gesendet werden soll, explizit angeben.

Brian Campbell
quelle
Das war's! Dies gilt für alle Zweige, die nachverfolgen, aber das ist in Ordnung. Vielen Dank!
Jmacdonagh
Es würde mich interessieren, ob es eine Abkürzung für den Filialnamen gibt, den ich ausgecheckt habe. Ich möchte vielleicht nur wissen , git push buildserver .:test_thiswo der .Name der lokalen Niederlassung sein soll, den ich nicht unbedingt kenne. Ich könnte es sicher nachschlagen, aber wenn es dafür eine kurze Hand wie den Punkt gäbe, wäre es cool.
Frederick Nord
2
@FrederickNord HEADist die Abkürzung, die Sie suchen. HEADDies verweist auf den aktuell ausgecheckten Zweig oder direkt auf ein bestimmtes Commit, wenn Sie einen abgetrennten Kopf haben.
Brian Campbell
Vielen Dank! Dies hat den Updates were rejected because a pushed branch tip is behind its remoteFehler für mich behoben . Mein lokales Repo war auf dem neuesten Stand, aber die Namen waren einfach anders.
Canhazbits
171

Wenn Sie den ersten Push ausführen , fügen Sie den Parameter -u hinzu :

git push -u origin my_branch:remote_branch

Nachfolgende Pushs gehen dahin, wo Sie wollen.

BEARBEITEN:

Laut Kommentar wird dadurch nur Pull eingerichtet.

git branch --set-upstream

Sollte es tun.

Adam Dymitruk
quelle
7
-usetzt einfach den Upstream, der laut Frage schon gesetzt ist. Er muss einstellen push.default, upstremum pushdie Upstream-Einstellung zu respektieren, da dies standardmäßig nur der pullFall ist.
Brian Campbell
2
Dies scheint nicht zu funktionieren - zumindest nicht auf nie Versionen von Git
Thomas Watson
git branch --set-upstream nur das Pull-Setup "pushRemote" muss danach gesetzt werden.
Woher kam dieser Name vom
Ich denke nicht, dass git branch --set-upstreames notwendig ist. Hinweis: Mein git --versionist 2.17.1.
Gabriel Staples
15

Der Befehl von Adam ist jetzt veraltet. Sie können verwenden:

git branch --set-upstream-to origin/my_remote_branch my_local_branch

um den Upstream-Zweig von my_local_branchzu setzen origin/my_remote_branch.

Job in
quelle
6
Können Sie einen Link bereitstellen, der die Informationen unterstützt, die Sie über -u veraltet teilen? Dokumente für die neueste Version in Bezug auf Push auf git-scm.com scheinen darauf hinzudeuten, dass es aktuell ist. Vielen Dank im Voraus - es könnte für die Leser sehr hilfreich sein, weitere Informationen zu erhalten.
Kay V
Stimmen Sie mit @KayV überein, insbesondere, dass ich diese Meldung erhalten habe, als ich versucht habe, einen neuen Remote-Zweig mit einem anderen Namen als meinem lokalen Zweig zu erstellen: 'Wenn Sie vorhaben, einen neuen lokalen Zweig zu veröffentlichen, der sein Remote-Gegenstück verfolgt, möchten Sie möglicherweise um "git push -u" zu verwenden, um die Upstream-Konfiguration während des Pushs festzulegen. '
FBB
0

Hier ist der Prozess, der für mich funktioniert hat.

git clone original-repo-url
git remote rename origin upstream
git remote add origin new-repo-url

Jetzt ist Ihr neues Repo "Ursprung" und das ursprüngliche Repo ist "Upstream". Bestätigen Sie dies, indem Sie git remote -v ausführen. (Randnotiz: Upstream wird zum Abrufen des ursprünglichen Repos verwendet, um Ihre lokale Kopie mit dem Projekt synchron zu halten, zu dem Sie beitragen möchten, und Origin wird zum Ziehen und Schieben verwendet, da Sie zu Ihrem eigenen Repo beitragen können.)

git push origin master

Jetzt ist der Master Ihres neuen Remote-Repos (auf Github) mit dem ursprünglichen Master synchron, hat jedoch keinen der Feature-Zweige.

git rebase upstream/branch-name
git push origin master

Rebase ist eine intelligente Zusammenführung. Drücken Sie dann erneut auf Master und Sie sehen den ausgewählten Feature-Zweig als Master auf dem neuen Repo.

Optional:

git remote rm upstream
git remote add upstream new-repo-url
urubuz
quelle
0

Ich habe seit einiger Zeit das gleiche Problem. Ich habe endlich eine Reihe von Aussagen, damit ich nicht git push origin local:remotejedes Mal etwas tun muss. Ich folgte diesen:

git branch --set-upstream-to origin/remote_branch_name
git config push.default upstream
git push

Nach dem Einrichten des Upstreams für einen Remote-Zweig mit einem anderen Namen (1. Zeile) und dem anschließenden Festlegen des Upstreams als Standard (2. Zeile) befolgt die 3. Zeile nun diese Regeln und wechselt zum festgelegten Upstream.

Messmanie
quelle