¿Qué hace exactamente la "u"? "Git push -u origin master" vs "git push origin master"

Aparentemente soy terrible al usar git, a pesar de mis mejores bashs de entenderlo.

De kernel.org para git push :

-u

–set-upstream

Para cada twig que esté actualizada o presionada con éxito, agregue una reference en sentido ascendente (seguimiento), utilizada por el command sin argumento git-pull (1) y otros commands. Para get más información, consulte branch.<name>.merge en git-config (1).

Aquí está la branch.<name>.merge de git config :

branch.<name>.merge

Define, junto con la branch.<name>.remote , la twig ascendente para la twig dada. Le dice a git fetch / git pull qué twig fusionar y también puede afectar a git push (ver push.default). Cuando está en la twig <name> , le dice a git fetch el refspec por defecto que se marque para fusionarse en FETCH_HEAD. El valor se maneja como la parte remota de un refspec, y debe coincidir con un ref que se obtiene desde el control remoto dado por "branch.<name>.remote" . La información de combinación es utilizada por git pull (que al principio llama a git fetch) para search la twig pnetworkingeterminada para la fusión. Sin esta opción, git pull por defecto fusiona el primer refspec obtenido. Especifique valores múltiples para get una fusión de pulpo. Si desea configurar git pull para que se fusione con <name> desde otra twig en el repository local, puede apuntar branch.<name>.merge a la twig deseada, y usar la configuration especial. (un período) para la branch.<name>.remote .

Con éxito configuré un repository remoto con github, y logré mi primer compromiso con él con éxito:

 git push -u origin master 

Luego, involuntariamente empujé mi segunda confirmación a mi repository remoto usando:

 git commit -m '[...]' 

Sin embargo, al pensar incorrectamente que tendría que volver a presionar al origin desde el master , ejecuté:

 # note: no -u git push origin master 

¿Qué hizo eso? No pareció tener ningún efecto en absoluto. ¿He "deshacer" git push -u origin master ?

La key es "sin arguments git-pull". Cuando haces un git pull desde una twig, sin especificar un origen remoto o una twig, git mira la branch.<name>.merge setting para saber de dónde sacar. git push -u establece esta información para la twig que está presionando.

Para ver la diferencia, usemos una nueva twig vacía:

 $ git checkout -b test 

Primero, empujamos sin -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 (eg '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. 

Ahora si agregamos -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. 

Tenga en count que la información de seguimiento se ha configurado para que git pull funcione como se espera sin especificar el control remoto o la sucursal.

Actualización: consejos de bonificación:

  • Como Mark menciona en un comentario, además de git pull esta configuration también afecta el comportamiento pnetworkingeterminado de git push . Si adquiere el hábito de utilizar -u para capturar la twig remota que desea rastrear, le recomiendo que configure su valor de configuration push.default la push.default .
  • git push -u <remote> HEAD desplazará la twig actual a una twig del mismo nombre en <remote> (y también configurará el seguimiento para que pueda hacer git push después de eso).
  git push -u origin master 

Es lo mismo que:

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

Haga la última statement si olvida el -u !

O podrías forzarlo:

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

Si dejas que el command lo haga, si lo haces recogerá tus errores como si escribieras una twig inexistente o no git remote add , aunque eso podría ser lo que quieres :).

Todos los commands de git bash necesarios para empujar y tirar en 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 

Si quieres editar un file, entonces:

 edit filename.* 

Para ver todas las twigs y sus compromisos:

 git show-branch