O que faz exactamente o "u"? "git push-u origin master" vs "git push origin master"
De kernel.org para git push
:
Aqui está ...- 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).
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á apontarbranch.<name>.merge
para a ramificação desejada e usar a opção especial . (a period) forbranch.<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"?
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 degit 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 parapush.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).
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 :).
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
.
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