git - tab - ¿Por qué necesito impulsar explícitamente una nueva sucursal?
git tags best practices (6)
Soy nuevo en git
y estoy practicando. Creé una sucursal local, pero vi que cuando hice git push
mi rama no se cargó en el repositorio. De hecho tuve que hacer: git push -u origin --all
.
¿Por qué es esto? ¿No es una rama un nuevo cambio que debe presionarse de manera predeterminada? ¿Por qué necesito ejecutar el segundo comando?
En primer cheque
Paso-1: git remote -v
// si se encuentra git initialize, entonces eliminar u omitir el paso-2
Paso-2: git remote rm origin
// Luego configura tu dirección de correo electrónico globalmente git
Paso 3: git config --global user.email "[email protected]"
Paso 4: git initial
Paso-5: git commit -m "Initial Project"
// Si ya agregaste el repositorio del proyecto, omite el paso-6
Paso-6: git remote add origin %repo link from bitbucket.org%
Paso-7: git push -u origin master
HEAD es la abreviatura de la rama actual, por lo que git push -u origin HEAD funciona. Ahora para evitar esta escritura cada vez que uso alias:
git config --global alias.pp ''push -u origin HEAD''
Después de esto, cada vez que deseo insertar una rama creada a través de git -b branch, puedo presionar usando:
git pp
Espero que esto ahorre tiempo para alguien!
La razón real es que, en un nuevo repositorio (git init), no hay una rama (no hay master
, no hay rama, cero ramas)
Por lo tanto, cuando está presionando por primera vez un repositorio reverso vacío (generalmente uno vacío ), ese repo ascendente no tiene rama del mismo nombre.
Y:
- la política de inserción predeterminada era ''
matching
'' (insertar todas las ramas del mismo nombre, crearlas si no existen), - la política de inserción predeterminada ahora es "
simple
" (solo inserte la rama actual, y solo si tiene una rama de seguimiento remoto con el mismo nombre en la cadena ascendente, ya que git 1.7.11 )
En ambos casos, dado que el repositorio vacío anterior no tiene rama:
- no hay una rama con nombre coincidente todavía
- no hay ninguna rama en sentido ascendente (con o sin el mismo nombre! Seguimiento o no)
Eso significa que su primer impulso local no tiene idea:
- dónde empujar
- qué empujar (ya que no puede encontrar ninguna rama ascendente registrada como una rama de seguimiento remoto, y / o tener el mismo nombre)
Entonces necesitas al menos hacer un:
git push origin master
Pero si solo haces eso, tú:
- creará una rama
master
en sentido ascendente en el flujo ascendente (ahora repo no vacío): bueno. - no registrará que la rama local ''
master
'' necesita ser empujada hacia arriba (origin
) ''master
'' (rama ascendente): mala.
Es por eso que se recomienda, para el primer impulso, hacer un:
git push -u origin master
Eso registrará origin/master
como una rama de seguimiento remoto , y habilitará la próxima inserción para enviar automáticamente master
a origin/master
.
git checkout master
git push
Y eso también funcionará con las políticas push '' current
'' o '' upstream
''.
En cada caso, después del git push -u origin master
initial git push -u origin master
, un simple git push será suficiente para continuar presionando a master en la rama ascendente derecha.
No pude encontrar una explicación racional por parte de los desarrolladores originales tan rápidamente, pero puedo darte una idea fundamentada basada en unos pocos años de experiencia en Git.
No, no todas las ramas son algo que deseas impulsar al mundo exterior. Podría representar un experimento privado.
Por otra parte, ¿dónde debería git push
enviar todas las ramas? Git puede trabajar con múltiples controles remotos y es posible que desee tener diferentes conjuntos de ramas en cada uno. Por ejemplo, un proyecto central de GitHub repo puede tener sucursales de lanzamiento; un tenedor GitHub puede tener ramas temáticas para su revisión; y un servidor local de Git puede tener ramas que contienen la configuración local. Si git push
empujara todas las ramas al control remoto que rastrea la rama actual, este tipo de esquema sería fácil de arruinar.
Salida de git push
cuando se empuja una nueva rama
> git checkout -b new_branch
Switched to a new branch ''new_branch''
> git push
fatal: The current branch new_branch has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin new_branch
Un simple git push
asume que ya existe una rama remota que la rama local actual está rastreando. Si no existe tal rama remota, y desea crearla, debe especificar que usando la bandera -u
(forma abreviada de --set-upstream
).
¿Por qué esto es así? Creo que los implementadores sintieron que crear una rama en el control remoto es una acción tan importante que sería difícil hacerlo por error. git push
es algo que haces todo el tiempo.
"¿No es una rama un nuevo cambio que debe presionarse de manera predeterminada?" Diría que "un cambio" en Git es un compromiso. Una rama es un puntero a una confirmación. Para mí tiene más sentido pensar en un empujón como algo que empuja compromete a los otros repositorios. Las confirmaciones que se envían vienen determinadas por la rama en la que se encuentra y la relación de seguimiento de esa rama con las sucursales del control remoto.
Puede leer más sobre rastrear ramas en el capítulo Sucursales Remotas del libro Pro Git .
Tu no, mira abajo
Encuentro esta ''característica'' bastante molesta ya que no estoy tratando de lanzar cohetes a la luna, solo empujo mi maldita rama. ¡Probablemente también lo hagas o de lo contrario no estarías aquí!
Aquí está la solución: si quiere que implique implícitamente la rama actual, independientemente de si esa rama existe en origen, simplemente emita este comando una vez y nunca más tendrá que volver a ninguna parte:
git config --global push.default current
Entonces si haces ramas como esta:
git checkout -b my-new-branch
y luego hacer algunos commits y luego hacer un
git push -u
para sacarlos a su origen (estar en esa rama) y creará dicha rama para usted si no existe.
Tenga en cuenta que el bit -u se asegura de que estén vinculados si fuera retirado más tarde de dicha rama. Si no tiene planes para tirar de la rama más tarde (o está bien con otro trazador de líneas si lo hace) -u no es necesario.