Eu crio uma nova ramificação no Git:
git branch my_branch
Empurre-o:
git push origin my_branch
Agora digamos que alguém fez algumas alterações no servidor e eu quero retirar origin/my_branch
. Eu faço:
git pull
Mas eu entendo:
You asked me to pull without telling me which branch you
want to merge with, and 'branch.my_branch.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.
If you often merge with the same branch, you may want to
use something like the following in your configuration file:
[branch "my_branch"]
remote = <nickname>
merge = <remote-ref>
[remote "<nickname>"]
url = <url>
fetch = <refspec>
See git-config(1) for details.
Aprendi que posso fazê-lo funcionar com:
git branch --set-upstream my_branch origin/my_branch
Mas por que preciso fazer isso para cada ramo que eu criar? Não é óbvio que, se eu my_branch
entrar origin/my_branch
, eu gostaria de origin/my_branch
entrar my_branch
? Como posso tornar esse comportamento padrão?
git
git-branch
Ram Rachum
fonte
fonte
branch.autosetupmerge
significa que a configuração upstream para uma nova ramificação é definida automaticamente somente ao criar uma ramificação a partir de uma ramificação de rastreamento remoto (por exemplo<remote-name>/<branch-name>
) (consulte git-config (1) ). Você provavelmente está criando suas ramificações a partir de ramificações locais existentes. Se você estiver efetivamente ramificando diretamente da ponta de uma ramificação remota (apesar de estar em uma ramificação local), poderá usargit branch my_branch <remote-name>/<branch-name>
para definir automaticamente a configuração upstream.--set-upstream
opção está obsoleta. Você deve usar--track
ou em--set-upstream-to
vez disso.--set-upstream
for descontinuado, talvez os devs git devam removê-lo da mensagem de ajuda que é exibida quando você executagit push
sem opções e sem o montante configurado.git branch --set-upstream
está obsoleto.git push --set-upstream
não é.Respostas:
Um atalho, que não depende da lembrança da sintaxe para
git branch --set-upstream
1, é o seguinte:... a primeira vez que você empurra esse galho. Ou, para enviar para a ramificação atual para uma ramificação com o mesmo nome (útil para um alias):
Você só precisa usar
-u
uma vez, e isso configura a associação entre sua filial e aorigin
da mesma maneira quegit branch --set-upstream
faz.Pessoalmente, acho bom ter que estabelecer essa associação entre sua filial e a filial remota explicitamente. É uma pena que as regras sejam diferentes para
git push
egit pull
.1 Pode parecer bobagem, mas eu frequentemente esqueço de especificar o ramo atual, assumindo que esse é o padrão - não é, e os resultados são mais confusos :)
Atualização 11/10/2012 : Aparentemente, não sou a única pessoa que achou fácil errar! Agradecemos ao VonC por apontar que o git 1.8.0 apresenta o mais óbvio
git branch --set-upstream-to
, que pode ser usado da seguinte maneira, se você estiver no ramomy_branch
:... ou com a opção curta:
Essa alteração e seu raciocínio estão descritos nas notas de lançamento do git 1.8.0, candidato a lançamento 1 :
fonte
-u
primeira vez que você enviar, poderá executá-lo novamente com essa bandeira e ela começará a rastrear.alias gpo="git push --set-upstream origin $(git branch | awk '/^\* / { print $2 }')"
Você pode fazer isso acontecer com menos digitação. Primeiro, mude a maneira como seu push funciona:
Isso inferirá a
origin my_branch
parte, assim você pode fazer:O que criará a ramificação remota com o mesmo nome e a rastreará.
fonte
origin
ao executargit push -u
para uma ramificação recém-criada no repositório recém-criado? A suposição de que o repositório foi clonado para que o ramo atual tenha seu controle remoto definidoorigin
?pull
precisará especificar de onde. As-u
configura o rastreamento ramo entre a origem eo seu repositório local.push
- o que derrota todo o ponto dessa questão. Em suma, não há uma boa resposta. O fato de os desenvolvedores do Git insistirem em manter essa experiência estranha de usuário (AUX) em face da dissidência generalizada da comunidade é ... esclarecedor. E desanimador. (Principalmente desencorajar.)Você pode simplesmente
em primeiro lugar. Se você definir
branch.autosetupmerge
oubranch.autosetuprebase
(o meu favorito) paraalways
(o padrão étrue
),my-branch
rastreará automaticamenteorigin/whatever
.Veja
git help config
.fonte
git checkout -t origin/whatever
, que também escolhewhatever
como o novo nome do ramo. Muito conveniente!-u
/--set-upstream
.git checkout -t origin/whatever
não funciona para mim ao tentar criar um novo ramo:fatal: Cannot update paths and switch to branch 'whatever' at the same time.
git checkout -b my-branch origin/whatever
também tem o mesmo erro (Eu estou tentando criar um novo ramo que não existe no local ou remoto):fatal: Cannot update paths and switch to branch 'whatever' at the same time.
Este é o meu uso mais comum para The Fuck .
Além disso, é divertido digitar palavrões no seu terminal.
fonte
Você pode configurar o upstream mais simples de duas maneiras. Primeiro quando você cria a ramificação:
ou depois de criar uma ramificação, você pode usar este comando.
Você também pode ramificar, fazer check-out e configurar o upstream em um único comando:
Minha preferência pessoal é fazer isso em um comando de duas etapas:
fonte
git branch -u origin/my-branch
, posso executargit pull
para baixar minhas alterações.git checkout -t origin/my-branch
sem o-b my-branch
, ele inferirá automaticamentemy-branch
o nome da filial local. No entanto, como o @Spongman mencionou, este comando não funcionará seorigin/my-branch
não existir primeiro.git push -u origin/my-branch
falha para mim comfatal: 'origin/my-branch' does not appear to be a git repository
. Isso funciona:git push -u origin my-branch
Você pode usar:
que vinculará a ramificação upstream sempre que você criar ou efetuar checkout de uma nova ramificação.
Consulte https://felipec.wordpress.com/2013/09/01/advanced-git-concepts-the-upstream-tracking-branch/
Isso também funciona com
branch.autosetuprebase
, se você seguir um fluxo de trabalho mais focado em rebase, mas não o use a menos que saiba o que está fazendo, pois o padrão de comportamento do pull será rebase, o que pode causar resultados estranhos.fonte
--set-upstream
mensagem #master
. 2. Corragit checkout -b new_branch
. 3. Adicione uma confirmação a esse ramo. 4git push origin new_branch
. Isso empurra os comprometimentos para amaster
ramificação na origem (em vez de para uma nova ramificação na origem chamadanew_branch
).A propósito, o atalho para enviar a ramificação atual para um controle remoto com o mesmo nome:
fonte
Eu pessoalmente uso estes alias seguintes no bash
no arquivo ~ / .gitconfig
e no arquivo ~ / .bashrc ou ~ / .zshrc
fonte
git pushup
que sempre envia a ramificação atual à origem. Eu sempre pode apenas usargit pushup
em vez degit push
👍Se o abaixo não funcionar:
Você também deve atualizar a configuração local do seu projeto, pois é possível que seu projeto tenha configurações locais do git:
fonte
Você também pode dizer explicitamente ao git pull qual ramificação remota puxar (conforme mencionado na mensagem de erro):
git pull <remote-name> <remote-branch>
No entanto, tenha cuidado com isso: se você estiver em um ramo diferente e fizer um puxão explícito, o refspec que você puxará será mesclado no galho em que você está!
fonte
Pelo que vale a pena, se você estiver tentando rastrear um ramo que já existe no controle remoto (por exemplo, origin / somebranch), mas ainda não o fez check-out localmente, você pode:
Nota: '-t' é a versão abreviada da opção '--track'.
Isso cria a mesma associação logo de cara.
fonte
git checkout somebranch
é equivalente.git fetch
imediatamente?git fetch
ougit pull
. Eu nunca achei isso um problema, no entanto.fonte
Eu uso esse alias do Git em vez de copiar / colar a sugestão do Git sempre: https://gist.github.com/ekilah/88a880c84a50b73bd306
Fonte copiada abaixo (adicione isso ao seu
~/.gitconfig
arquivo):fonte
Você pode configurar um alias realmente bom que possa lidar com isso sem a sintaxe excessivamente detalhada.
Eu tenho o seguinte alias em
~/.gitconfig
:Depois de fazer uma confirmação em uma nova ramificação, você pode enviar sua nova ramificação simplesmente digitando o comando:
fonte
po
?push origin
? o que acontecerá se isso for executado várias vezes?git push -f
alias configuradogit pf
, então eu o uso assim que a origem já tiver sido enviada.HEAD
Para quem procura um alias que funcione
git pull
, é isso que eu uso:Agora sempre que você obtiver:
Apenas corra:
E você está pronto para ir
fonte
Porque o git tem a capacidade legal de enviar / puxar ramificações diferentes para diferentes repositórios "upstream". Você pode até usar repositórios separados para empurrar e puxar - no mesmo ramo. Isso pode criar um fluxo distribuído em vários níveis; posso ver isso sendo útil em projetos como o kernel do Linux. O Git foi originalmente desenvolvido para ser usado nesse projeto.
Como conseqüência, ele não assume que repositório sua filial deve rastrear.
Por outro lado, a maioria das pessoas não usa o git dessa maneira, portanto pode ser uma boa opção para uma opção padrão.
O Git geralmente é de nível bastante baixo e pode ser frustrante. No entanto, existem GUIs e deve ser fácil escrever scripts auxiliar se você ainda quiser usá-lo no shell.
fonte
Você também pode fazer
git push -u origin $(current_branch)
fonte
Eu meio que re-descobri
legit
por causa desse problema (apenas OS X). Agora, tudo o que uso ao ramificar são esses dois comandos:legit publish [<branch>]
Publica ramificação especificada no controle remoto. (pseudónimo:pub
)legit unpublish <branch>
Remove a ramificação especificada do controle remoto. (pseudónimo:unp
)O SublimeGit vem com
legit
suporte por padrão, o que torna toda a rotina de ramificação tão fácil quanto pressionar Ctrl-b.fonte
Usamos o phabricator e não pressionamos usando o git. Eu tive que criar o alias do bash que funciona no Linux / mac
Salve
fonte
Aqui está um alias do bash para o git push, que é seguro para executar a cada push e alternará automaticamente entre a configuração upstream para o primeiro push e a execução de push normais depois disso.
Correio Original
fonte