O que exatamente o "u" faz? "Git push -u origin master" vs "git push origin master"

335

Aparentemente, sou péssimo em usar o git, apesar das minhas melhores tentativas de entender.

Do kernel.org para git push:

-você

--set-upstream

Para cada ramificação atualizada ou enviada com êxito, adicione uma referência upstream (rastreamento), usada pelo git-pull (1) sem argumentos e outros comandos. Para mais informações, consulte branch.<name>.mergegit-config (1).

Aqui está branch.<name>.mergede git config:

branch.<name>.merge

Define, juntamente com branch.<name>.remote, a ramificação upstream para a ramificação especificada. Ele informa ao git fetch / git pull qual ramificação será mesclada e também pode afetar o git push (consulte push.default). Quando na ramificação <name>, ele informa ao git buscar o refspec padrão a ser marcado para mesclar em FETCH_HEAD. O valor é tratado como a parte remota de um refspec e deve corresponder a um ref que é buscado no controle remoto fornecido por "branch.<name>.remote". As informações de mesclagem são usadas pelo git pull (que primeiro chama git fetch) para procurar a ramificação padrão para mesclagem. Sem essa opção, os padrões git pull para mesclar o primeiro refspec buscado. Especifique vários valores para obter uma mesclagem de polvo. Se você deseja configurar o git pull para que ele seja mesclado a <name>partir de outra ramificação no repositório local, você pode apontarbranch.<name>.mergepara o ramo desejado e use a configuração especial. (um período) para branch.<name>.remote.

Configurei com êxito um repositório remoto com o github e enviei com êxito o meu primeiro commit para:

git push -u origin master

Em seguida, involuntariamente, com sucesso, enviei meu segundo commit para meu repositório remoto usando:

git commit -m '[...]'

No entanto, pensando incorretamente que eu precisaria pressionar novamente para originpartir master, executei:

# note: no -u
git push origin master

O que isso fez? Não parecia ter nenhum efeito. Eu "desfiz" git push -u origin master?

Encerramento
fonte
45
I'm apparently terrible at using git, despite my best attempts to understand it.- Nunca alguém me recriou tão bem.
dgo 30/04

Respostas:

336

A chave é "git-pull sem argumento". Quando você faz um git pullde uma ramificação, sem especificar um remoto ou ramificação de origem, o git analisa a branch.<name>.mergeconfiguração para saber de onde extrair. git push -udefine essas informações para o ramo que você está enviando.

Para ver a diferença, vamos usar um novo ramo vazio:

$ git checkout -b test

Primeiro, empurramos sem -u:

$ git push origin test
$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.test.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 "test"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

Agora, se adicionarmos -u:

$ git push -u origin test
Branch test set up to track remote branch test from origin.
Everything up-to-date
$ git pull
Already up-to-date.

Observe que as informações de rastreamento foram configuradas para que git pullfuncionem conforme o esperado sem especificar o controle remoto ou a ramificação.

Atualização: dicas de bônus:

  • Como Mark menciona em um comentário, além de git pull dessa configuração, também afeta o comportamento padrão de git push. Se você tem o hábito de usar -upara capturar a ramificação remota que pretende rastrear, recomendo definir seu push.defaultvalor de configuração como upstream.
  • git push -u <remote> HEADempurrará a ramificação atual para uma ramificação com o mesmo nome <remote>(e também configurará o rastreamento para que você possagit push isso depois).
dahlbyk
fonte
4
git push <remote> <branch>torna as coisas inequívocas . Se você deixar o controle remoto ou o ramo, o git retornará às definições de configuração do ramo, definidas para você git push -u.
Dahlbyk
2
@dahlbyk Fui em frente e marquei você como a resposta, mas esse comentário me confunde um pouco. Na sua resposta, você demonstrou que o git foi confundido depois git push origin test(o que não tem -u). Você então mostrou que git push -u origin test remove a ambiguidade. Existe um erro de digitação ou estou apenas sendo denso novamente?
ClosureCowboy
1
Acho que estamos falando um do outro. :) Quando digo que git push <remote> <branch>é inequívoco, quero dizer o relativo ao git pushqual depende da configuração do ramo. Da mesma forma, git pull <remote> <branch>é inequívoco e git pulldepende da configuração da ramificação. Depois de pressionar -u, ambos git pushe git pullfuncionarão conforme o esperado.
dahlbyk
10
@dahlbyk: Sua resposta é boa, mas em seus comentários acima, você repete um equívoco comum sobre git push- a menos que você push.defaultse defina , git pushusa apenas a configuração de filial upstream para decidir para qual controle remoto enviar, e não a filial remota a ser atualizada.
precisa saber é o seguinte
1
A melhor prática para o git é git push origin mastera mesma para o outro lado do IE. git pull origin master.. Então, se suponha mudança de ramificação, você pode git push origin branch_namee o mesmo no outro lado do IE. git pull origin branch_name
Arpit Vaishnav
87
git push -u origin master

… é o mesmo que:

git push origin master ; git branch --set-upstream master origin/master

Faça a última declaração, se você esquecer o -u!

Ou você pode forçá-lo:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

Se você deixar o comando fazer isso por você, ele detectará seus erros, como se você digitasse um ramo inexistente ou não git remote add ; embora isso possa ser o que você deseja. :)

sabgenton
fonte
1
BTW masteré apenas um exemplo :)
sabgenton
Ok o segundo bit é agora desvalorizou em versões mais recentes para: git branch master -u origin/masterdetalhes @ stackoverflow.com/a/2286030/790359
sabgenton
2
Se você esquecer de usar a -uopção, digite git push -uimediatamente.
Zeekvfu 14/05
1
As versões mais recentes do git indicam que --setup-upstreamserá preterido: # The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to
Bill Hoag
--set-upstream está obsoleto, agora funciona:git branch --set-upstream-to=origin/master master
Alberto Perez
43

Em termos mais simples:

Tecnicamente, o -u sinalizador adiciona uma referência de rastreamento ao servidor upstream para o qual você está enviando.

O importante aqui é que isso permite que você faça um git pullsem fornecer mais argumentos. Por exemplo, depois de fazer um git push -u origin master, você pode ligar mais tarde git pulle o git saberá que você realmente quis dizergit pull origin master .

Caso contrário, você teria que digitar todo o comando.

Adépòjù Olúwáségun
fonte
1
Portanto, se eu definir o -usinalizador para orgin mastercada próximo pull, ele se referirá a ele. E se eu quiser mudar o git pullcomportamento, devo executar git push -u origin some_other_branche git pullagora vou me referir some_other_branch? Obrigado!
Toma Tomov 28/09
1
também podemos usar "git push" em vez de "git push origin master"?
Cegprakash 16/04/19
Sim, você pode @cegprakash. No entanto, você teria feito inicialmente umgit push -u origin master
Adépòjù Olúwáségun 16/04/19
-11

Todos os comandos necessários do git bash para empurrar e puxar para o Github:

git status 
git pull
git add filefullpath

git commit -m "comments for checkin file" 
git push origin branch/master
git remote -v 
git log -2 

Se você deseja editar um arquivo, então:

edit filename.* 

Para ver todas as ramificações e seus commits:

git show-branch
Kamta Mishra
fonte
4
Acho que você respondeu fora do escopo da pergunta.
Adépòjù Olúwáségun 9/02/19