Como posso enviar facilmente uma ramificação Git local para um controle remoto com um nome diferente?

175

Fiquei me perguntando se existe uma maneira fácil de empurrar e puxar uma ramificação local com uma ramificação remota com um nome diferente sem sempre especificar os dois nomes.

Por exemplo:

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

Agora, se alguém atualizar remote_branch_name, eu posso:

$ git pull

E tudo é mesclado / encaminhado rapidamente. No entanto, se eu fizer alterações no meu "newb" local, não posso:

$ git push

Em vez disso, tenho que:

% git push origin newb:remote_branch_name

Parece um pouco bobo. Se git-pullusa git-config branch.newb.mergepara determinar de onde retirar, por que não poderia git-pushter uma opção de configuração semelhante? Existe um bom atalho para isso ou devo continuar o longo caminho?

jmacdonagh
fonte

Respostas:

93

Certo. Basta definir suas push.defaultpara upstreampara empurrar ramos para suas upstreams (que é a mesma que pullvai puxar, definida por branch.newb.merge), ao invés de empurrar ramos para os correspondentes no nome (que é a configuração padrão para push.default, matching).

git config push.default upstream

Observe que isso costumava ser chamado trackingnão upstreamantes do Git 1.7.4.2; portanto, se você estiver usando uma versão mais antiga do Git, use-o tracking. A push.defaultopção foi adicionada no Git 1.6.4, portanto, se você estiver em uma versão mais antiga que essa, não terá essa opção e precisará especificar explicitamente o ramo para o qual enviar.

Brian Campbell
fonte
Foi isso! Isso se aplica a todos os ramos que estão rastreando, mas tudo bem. Obrigado!
precisa saber é o seguinte
Gostaria de saber se existe uma abreviação para o nome da filial que eu fiz check-out. Eu poderia apenas querer git push buildserver .:test_thisonde .deve ser o nome da filial local que eu não sei necessariamente. Eu poderia procurar, com certeza, mas se houvesse uma mão curta, como o ponto, por isso, seria legal.
Frederick Nord
2
@FrederickNord HEADé a abreviação que você está procurando. HEADé o que aponta para o ramo atualmente com check-out ou diretamente para um commit específico, se você tiver um cabeçalho desanexado.
Brian Campbell
Obrigado! Isso corrigiu o Updates were rejected because a pushed branch tip is behind its remoteerro para mim. Meu repo local estava atualizado, mas os nomes eram apenas diferentes.
Canhazbits
171

Ao fazer o push inicial, adicione o parâmetro -u :

git push -u origin my_branch:remote_branch

Os empurrões subsequentes irão para onde você quiser.

EDITAR:

Conforme o comentário, isso apenas configura a atração.

git branch --set-upstream

deve fazê-lo.

Adam Dymitruk
fonte
7
-uapenas define o upstream, que de acordo com a pergunta, já está definido. Ele precisa conjunto push.defaultpara upstrema fim de obter pusha respeitar a definição a montante, uma vez que por padrão, somente pullo faz.
Brian Campbell
2
Este não parece trabalho - pelo menos não em nunca versões do git
Thomas Watson
git branch --set-upstream somente a configuração pull "pushRemote" precisa ser definida após isso.
partir de
Eu não acho git branch --set-upstreamnecessário. Nota: meu git --versioné 2.17.1.
Gabriel Staples
15

O comando de Adam agora está obsoleto. Você pode usar:

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

para definir a ramificação upstream de my_local_branchpara origin/my_remote_branch.

jobin
fonte
6
Você pode fornecer um link que suporte as informações que você compartilha sobre a exclusão de -u? Os documentos da versão mais recente sobre push no git-scm.com parecem sugerir que é atual. Agradecemos antecipadamente - pode ser muito útil para os leitores acompanharem mais informações.
26716 Kay Kay V
Concordo com o @KayV, especialmente porque recebi esta mensagem ao tentar criar uma nova filial remota com um nome diferente da minha filial local: 'Se você planeja enviar uma nova filial local que rastreie sua contraparte remota, convém para usar "git push -u" para definir a configuração upstream à medida que você pressiona. '
FBB
0

Aqui está o processo que funcionou para mim.

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

Agora seu novo repo será 'origin' e o repo original será 'upstream'. Confirme executando git remote -v. (Observação: o upstream é usado para buscar no repositório original - para manter sua cópia local sincronizada com o projeto no qual você deseja contribuir - e a origem é usada para puxar e empurrar, já que você pode contribuir para seu próprio repositório).

git push origin master

Agora, o novo mestre de seu repo remoto (no Github) estará sincronizado com o mestre original, mas não terá nenhuma das ramificações de recursos.

git rebase upstream/branch-name
git push origin master

Rebase é uma fusão inteligente. Em seguida, pressione para dominar novamente e você verá o ramo do recurso selecionado como mestre no novo repositório.

Opcional:

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

Estou com o mesmo problema há algum tempo. Finalmente tenho um conjunto de declarações, então não preciso fazer isso o git push origin local:remotetempo todo. Eu segui estes:

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

Depois de configurar o upstream para uma ramificação remota com nome diferente (1ª linha) e, depois, configurá-lo como padrão (2ª linha), a 3ª linha agora obedecerá a essas regras e enviará para o upstream configurado.

messmania
fonte