¿Qué hace exactamente la "u"? "git push -u origen maestro" frente a "git push origen maestro"
Aparentemente soy terrible usando git, a pesar de mis mejores intentos por entenderlo.
De kernel.org para git push
:
-tú
--set-upstream
Para cada rama que esté actualizada o enviada con éxito, agregue una referencia ascendente (seguimiento), utilizada por git-pull(1) sin argumentos y otros comandos. Para obtener más información, consulte
branch.<name>.merge
en git-config(1).
Aquí es branch.<name>.merge
de git config
:
branch.<name>.merge
Define, junto con
branch.<name>.remote
, la rama ascendente para la rama dada. Le dice a git fetch/git pull qué rama fusionar y también puede afectar a git push (ver push.default). Cuando está en la rama<name>
, le dice a git que busque la especificación de referencia predeterminada que se marcará para fusionar en FETCH_HEAD. El valor se maneja como la parte remota de una especificación de referencia y debe coincidir con una referencia que se obtiene del control remoto proporcionado por"branch.<name>.remote"
. git pull (que al principio llama a git fetch) utiliza la información de fusión para buscar la rama predeterminada para la fusión. Sin esta opción, git pull por defecto fusiona la primera especificación de referencia obtenida. Especifique varios valores para obtener una combinación de pulpo. Si desea configurar git pull para que se fusione<name>
desde otra rama en el repositorio local, puede señalarbranch.<name>.merge
la rama deseada y usar la configuración especial. (un punto) parabranch.<name>.remote
.
Configuré con éxito un repositorio remoto con github y envié con éxito mi primer compromiso con:
git push -u origin master
Luego, sin darme cuenta, envié con éxito mi segundo compromiso a mi repositorio remoto usando:
git commit -m '[...]'
Sin embargo, pensando incorrectamente que tendría que presionar nuevamente origin
desde master
, ejecuté:
# note: no -u
git push origin master
¿Qué hizo eso? No pareció tener ningún efecto en absoluto. ¿ Lo "deshice" git push -u origin master
?
La clave es "git-pull sin argumentos". Cuando haces un git pull
desde una rama, sin especificar una fuente remota o una rama, git mira la branch.<name>.merge
configuración para saber de dónde extraer. git push -u
establece esta información para la rama que estás presionando.
Para ver la diferencia, usemos una nueva rama 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 (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.
Ahora si sumamos -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 cuenta que la información de seguimiento se ha configurado para que git pull
funcione como se esperaba sin especificar el control remoto o la sucursal.
Actualización: consejos adicionales:
- Como Mark menciona en un comentario, además de
git pull
esta configuración, también afecta el comportamiento predeterminado degit push
. Si tiene el hábito de utilizar-u
para capturar la rama remota que desea rastrear, le recomiendo configurar supush.default
valor de configuración enupstream
. git push -u <remote> HEAD
empujará la rama actual a una rama con el mismo nombre<remote>
(y también configurará el seguimiento para que pueda hacerlogit 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
Haz la última declaración, si olvidas el -u
!
O podrías forzarlo:
git config branch.master.remote origin
git config branch.master.merge refs/heads/master
Si deja que el comando lo haga por usted, seleccionará sus errores, como si escribiera una rama inexistente o no git remote add
; aunque eso podría ser lo que quieres. :)