Aparentemente soy terrible al usar git, a pesar de mis mejores intentos de entenderlo.
De kernel.org para git push
:
-u
--set-upstream
Para cada rama que esté actualizada o que se haya enviado correctamente, 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í viene 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 fetch que la especificación de referencia predeterminada se marque para fusionarse 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"
. La información de fusión es utilizada por git pull (que al principio llama a git fetch) para buscar la rama predeterminada para la fusión. Sin esta opción, los valores predeterminados de git pull para fusionar la primera refspec obtenida. Especifique múltiples valores para obtener una fusión de pulpo. Si desea configurar git pull para que se fusione con<name>
otra rama en el repositorio local, puede apuntarbranch.<name>.merge
a la rama deseada, y use la configuración especial. (un punto) parabranch.<name>.remote
.
Configuré con éxito un repositorio remoto con github, y empujé con éxito mi primer compromiso con:
git push -u origin master
Luego, sin saberlo, empujé con éxito mi segundo commit a mi repositorio remoto usando:
git commit -m '[...]'
Sin embargo, pensando erróneamente que tendría que empujar de nuevo a origin
partir master
, me encontré:
# note: no -u
git push origin master
¿Qué hizo eso? No parecía tener ningún efecto en absoluto. ¿"Deshacer" git push -u origin master
?
I'm apparently terrible at using git, despite my best attempts to understand it.
- Nunca tuve a alguien que me recreara tan bien.Respuestas:
La clave es "argumento sin argumento". Cuando haces una
git pull
desde una rama, sin especificar una fuente remota o rama, git mira labranch.<name>.merge
configuración para saber de dónde sacarla.git push -u
establece esta información para la rama que está presionando.Para ver la diferencia, usemos una nueva rama vacía:
Primero, empujamos sin
-u
:Ahora si agregamos
-u
:Tenga en cuenta 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:
git pull
esta configuración también afecta el comportamiento predeterminado degit push
. Si tiene la costumbre de usar-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 del mismo nombre<remote>
(y también configurará el seguimiento para que pueda hacerlogit push
después de eso).fuente
git push <remote> <branch>
hace que las cosas no sean ambiguas . Si deja el control remoto o la rama, git vuelve a las configuraciones de configuración de la rama, que están configuradas para ustedgit push -u
.git push origin test
(que no tiene-u
). Luego demostró que esogit push -u origin test
elimina la ambigüedad. ¿Hay algún error tipográfico o solo estoy volviendo a ser denso?git push <remote> <branch>
que no es ambiguo, me refiero a lo relativo a logit push
que se basa en la configuración de la rama. Del mismo modo,git pull <remote> <branch>
es inequívoco y segit pull
basa en la configuración de la rama. Una vez que ha empujado con-u
tantogit push
ygit pull
funcionará como se espera.git push
- a menos que establezcapush.default
a sí mismo,git push
sólo utiliza la configuración derivada ascendente para decidir qué distancia para empujar a, no la rama remota de actualización.git push origin master
y lo mismo para el otro lado de IE.git pull origin master
.. Entonces, si suponemos un cambio de rama, entonces puedegit push origin branch_name
y lo mismo para el otro lado IE.git pull origin branch_name
… es lo mismo que:
Haga la última declaración, si olvida el
-u
!O podrías forzarlo:
Si deja que el comando lo haga por usted, seleccionará sus errores, como si escribió una rama inexistente o no lo hizo
git remote add
; aunque eso podría ser lo que quieres. :)fuente
master
es solo un ejemplo :)git branch master -u origin/master
detalles @ stackoverflow.com/a/2286030/790359-u
opción, escribagit push -u
inmediatamente estará bien.--setup-upstream
quedarán en desuso:The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to
git branch --set-upstream-to=origin/master master
En términos más simples:
Técnicamente, el
-u
indicador agrega una referencia de seguimiento al servidor ascendente al que está presionando.Lo importante aquí es que esto le permite hacer una
git pull
sin proporcionar más argumentos. Por ejemplo, una vez que haces ungit push -u origin master
, puedes llamar más tardegit pull
y git sabrá que realmente quisiste decirgit pull origin master
.De lo contrario, tendría que escribir todo el comando.
fuente
-u
bandera enorgin master
cada próximo tirón, me referiré a ella. ¿Y si quiero cambiar elgit pull
comportamiento que debo ejecutargit push -u origin some_other_branch
ygit pull
ahora me referirésome_other_branch
? ¡Gracias!git push -u origin master
Todos los comandos necesarios de git bash para empujar y tirar en Github:
Si desea editar un archivo, entonces:
Para ver todas las ramas y sus commits:
fuente