Soy nuevo git
y estoy practicando. Creé una sucursal local pero vi que cuando lo hice, git push
mi sucursal no estaba cargada en el repositorio. Tenía que hacer realidad: git push -u origin --all
.
¿Por qué es esto? ¿No es una rama un nuevo cambio que se va a impulsar de forma predeterminada? ¿Por qué necesito ejecutar el segundo comando?
git
version-control
Cratilo
fuente
fuente
push.default
, verman git-config
). Si lo hacegit config --add push.default current
,git push
creará automáticamente la rama en el repositorio remoto si es necesario. Por qué este no es el valor predeterminado se explica en las respuestas.current
' y 'upstream
', consulte mi respuesta anterior stackoverflow.com/a/13751847/6309 .Respuestas:
La razón real es que, en un nuevo repositorio (git init), no hay rama (no
master
, ninguna rama, cero ramas)Entonces, cuando está presionando por primera vez a un repositorio ascendente vacío (generalmente uno desnudo ), ese repositorio ascendente no tiene una rama del mismo nombre.
Y:
matching
' (inserte todas las ramas del mismo nombre, creándolas si no existen),simple
' (inserte solo la rama actual, y solo si tiene una rama de seguimiento remoto con un nombre similar en sentido ascendente, desde git 1.7.11 )En ambos casos, dado que el repositorio vacío ascendente no tiene rama:
Eso significa que su primer impulso local no tiene idea:
Entonces necesita al menos hacer un:
Pero si solo haces eso, tú:
master
rama ascendente en el ascendente (ahora repositorio no vacío): bueno.master
' necesita ser empujada a upstream (origin
) 'master
' (rama ascendente): mal.Es por eso que se recomienda, para el primer impulso, hacer un:
Que registrará
origin/master
como una rama de seguimiento remoto , y permitirá a la próxima empuje para empujar de forma automáticamaster
aorigin/master
.Y eso también funcionará con las políticas de empuje '
current
' o 'upstream
'.En cada caso, después de la inicial
git push -u origin master
, un simple git push será suficiente para continuar empujando master a la rama aguas arriba derecha.fuente
git push
también espera que la rama ya exista?simple
': empuje a cualquier rama ascendente registrada, si esa rama ascendente tiene el mismo nombre que la local. Un simplegit push
será suficiente.git push --set-upstream origin new_branch
ogit push -u origin new_branch
para abreviar. El-all
que utilizó el interrogador omitió nombrar una nueva rama específica al incluir todas las ramas. Esto está cubierto por + Klas Mellbourn en su respuesta.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 no estarías aquí!
Aquí está la solución: si desea que empuje implícitamente la rama actual, independientemente de si esa rama existe en el origen, simplemente emita este comando una vez y nunca más tendrá que volver a hacerlo:
Entonces, si haces ramas como esta:
y luego hacer algunos commits y luego hacer un
para llevarlos al origen (estar en esa rama) y creará dicha rama para ti si no existe.
Tenga en cuenta que el bit -u se asegura de que estén vinculados si fuera a extraerlo de dicha rama. Si no tiene planes de tirar de la rama más tarde (o si está de acuerdo con otro revestimiento si lo hace) -u no es necesario.
fuente
git push -u
Salida de
git push
al empujar una nueva ramaUn simple
git push
supone que ya existe una rama remota que la rama local actual está rastreando. Si no existe tal rama remota, y desea crearla, debe especificar eso utilizando el indicador-u
(forma corta de--set-upstream
).¿Por qué esto es así? Supongo que los implementadores sintieron que crear una rama en el control remoto es una acción tan importante que debería ser difícil hacerlo por error.
git push
es algo que haces todo el tiempo."¿No es una rama un nuevo cambio que se va a impulsar de forma predeterminada?" Yo 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 empuje como algo que empuja los compromisos a los otros repositorios. Las confirmaciones que se envían están determinadas por la rama en la que se encuentra y la relación de seguimiento de esa rama con las ramas en el control remoto.
Puede leer más sobre el seguimiento de ramas en el capítulo Ramas remotas del libro Pro Git .
fuente
fatal
recibí un mensaje pero ya había hecho una confirmación en la rama. ¿Importa esto?git push -u origin
copió al repositorio remoto.fatal
mensaje como el que mencionas en la respuesta. ¿Esta diferencia depende del hecho de que le haya enviado algo a la sucursal?fatal
mensaje. Supongo que la diferencia depende exactamente de qué implementación de git está utilizando. Mi salida es de 1.8.1.msysgit.1 ejecutándose en Windows 8.No pude encontrar una justificación de los desarrolladores originales tan rápido, pero puedo darle una suposición educada basada en algunos años de experiencia en Git.
No, no todas las sucursales son algo que desea impulsar al mundo exterior. Podría representar un experimento privado.
Además, ¿a dónde deben
git push
enviar todas las sucursales? Git puede funcionar con múltiples controles remotos y es posible que desee tener diferentes conjuntos de ramas en cada uno. Por ejemplo, un proyecto central del repositorio de GitHub puede tener sucursales de lanzamiento; una bifurcación de GitHub puede tener ramas temáticas para su revisión; y un servidor Git local puede tener ramas que contengan configuración local. Sigit push
empujaría todas las ramas al control remoto que rastrea la rama actual, este tipo de esquema sería fácil de arruinar.fuente
It might represent a private experiment
Ok, pero ¿cuál es el gran problema? La rama "principal" en la que todos están trabajando,master
es decir, no se ve afectada. A menos que quieras mantener oculto el código fuente 2)git push, without a remote, pushes to the current branch's remote
Te perdí aquí :(git fetch
cientos de ramas a medias trabajando cada vez. 2) Me refiero algit push
comportamiento predeterminado de. Le informa al control remoto que la rama actual está rastreando, si la hay.HEAD es la abreviatura de la rama actual, por lo que git push -u origin HEAD funciona. Ahora para evitar este tipeo cada vez que uso un alias:
git config --global alias.pp 'push -u origin HEAD'
Después de esto, cada vez que quiero empujar una rama creada a través de git -b branch, puedo empujarla usando:
git pp
Espero que esto ahorre tiempo para alguien!
fuente
En el primer cheque
Paso 1:
git remote -v
// si se encuentra git initialize, luego elimine u omita 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 agrega el repositorio del proyecto, omita el paso 6
Paso 6:
git remote add origin %repo link from bitbucket.org%
Paso 7:
git push -u origin master
fuente
Acabo de experimentar una mayor permutación de este problema.
Tenía una sucursal nombrada
feat/XYZ-1234-some-description
porque estaba trabajando en el problema 123 de Jira. Durante el trabajo, creé un nuevo problema de Jira para rastrear un trabajo más pequeño, y cuando llegué a empujar decidí empujar a un nombre de sucursal con este nuevo número de problema en:Esto me dio el error que se discute en este hilo SO. Pero como estaba tratando de pasar a un nombre de sucursal diferente de mi sucursal actual, mi problema era diferente al descrito aquí. Terminé cambiando el nombre de mi sucursal local antes de poder impulsarla:
Después de un poco más de lectura alrededor me di cuenta de que podría haber establecido una
src
en elgit push
, ya sea para el nombre de la rama actual, o simplementeHEAD
en su caso:fuente
Si habilita para impulsar nuevos cambios desde su nueva sucursal la primera vez. Y debajo del error:
Para empujar la rama actual y configurar el control remoto como ascendente, use
fuente