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

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

De kernel.org para git push:

- u

-- set-upstream

para cada ramo que esteja atualizado ou empurrado com sucesso, adicione a referência upstream (tracking), usada por git-pull(1) e outros comandos. Para mais informações, consulte branch.<name>.merge no git-config (1).

Aqui está ... git config:

branch.<name>.merge

define, juntamente com branch.<name>.remote, o ramo a montante para o ramo dado. Ele diz ao git fetch/git pull qual ramo para se fundir e também pode afetar o git push (Veja push.padrao). Quando estiver no branch <name>, diz ao git para obter o refspec predefinido para ser marcado para a junção no FETCH_HEAD. O valor é tratado como a parte remota de um refspec, e deve corresponder a um ref que é obtido a partir do remoto dado por "branch.<name>.remote". A informação da junção é usada pelo git pull (que no início chama git obter) para procurar a ramificação predefinida para a junção. Sem esta opção, o Git puxa por omissão para juntar o primeiro repspec obtido. Indique vários valores para obter a junção de um polvo. Se quiser configurar o git pull de modo a que ele se funde em <name> a partir de outra ramificação no repositório local, poderá apontar branch.<name>.merge para a ramificação desejada e usar a opção especial . (a period) for branch.<name>.remote.

criei com sucesso um repositório remoto com o github, e consegui forçar o meu primeiro commit para ele. com:

git push -u origin master
Então, sem querer, adiei o meu segundo compromisso para o meu repositório remoto usando:
git commit -m '[...]'
No entanto, pensando erradamente que teria de empurrar de novo para origin de master, corri:

# note: no -u
git push origin master
O que é que isso fez? Não parecia ter qualquer efeito. Eu "desfiz"?

 222
git
Author: ClosureCowboy, 2011-04-18

4 answers

A chave é "argumento-menos git-pull". Quando você faz um git pull a partir de um branch, sem especificar um remoto de origem ou branch, o git olha para a configuração branch.<name>.merge para saber de onde puxar. Define esta informação para o ramo que estás a empurrar.

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.

Note que a informação de localização foi criada para que git pull funcione como é esperado sem indicar o comando remoto ou ramificação.

Actualização: dicas de bónus:

  • Como Mark menciona em um comentário, Além de git pull Esta configuração também afeta o comportamento padrão de git push. Se tiver o hábito de usar -u para capturar o ramo remoto que pretende seguir, recomendo que defina o seu valor de configuração para push.default.
  • {[14] } irá empurrar o ramo actual para um ramo com o mesmo nome em <remote> (e também configurar o seguimento para que possa fazer Depois disso).
 240
Author: dahlbyk, 2016-07-12 14:33:27
git push -u origin master

É o mesmo que:

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

Faz a última declaração se te esqueceres do -u!

ou podes forçá-lo.:

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

Se você deixar o comando fazer se para você ele escolherá seus erros como se você digitou um ramo inexistente ou você não git remote add, embora isso possa ser o que você quer :).

 56
Author: sabgenton, 2018-02-23 10:53:24

Em termos mais simples:

Tecnicamente, a bandeira {[[0]} adiciona uma referência de seguimento ao servidor a que estás a empurrar.

O que é importante aqui é que isto permite-lhe fazer um {[[1]} sem fornecer mais argumentos. Por exemplo, uma vez que você faça um git push -u origin master, você pode mais tarde chamar git pull e git saberá que você realmente quis dizer git pull origin master.

Caso contrário, teria que digitar todo o comando.
 4
Author: Adepoju Oluwasegun, 2018-08-28 21:55:31

Todos os comandos Git bash necessários 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 quiser editar um ficheiro, então:

edit filename.* 

Ver todos os ramos e os seus commits:

git show-branch
 -7
Author: Kamta Mishra, 2016-04-15 16:19:36