Git: ¿cuál es la diferencia entre push.default "emparejar" y "simple"

285

He estado usando git durante un tiempo, pero nunca he tenido que configurar un nuevo repositorio remoto y tengo curiosidad por hacerlo. He estado leyendo tutoriales y estoy confundido sobre cómo hacer que "git push" funcione.

Si simplemente lo uso git push, ¿me pide ver una rama predeterminada (?) A la que señalar? ¿Cuál es la diferencia entre estas dos opciones que me proporciona?

git config --global push.default matching
git config --global push.default simple

La coincidencia simplemente empuja las ramas que tengo en mi repositorio local, y si no coinciden, debo decirle manualmente que empuje las ramas locales nuevas que tengo, ¿correcto? ¿Es esta la mejor práctica para usar o es simplemente la mejor?

Josh
fuente
1
Ahora, si solo pull.defaultestá disponible para actualizar todas esas sucursales localmente
Nogurenn

Respuestas:

367

git push puede empujar todas las ramas o una sola dependiendo de esta configuración:

Empujar todas las ramas

git config --global push.default matching

Empujará todas las ramas a la rama remota y las fusionará. Si no desea empujar todas las ramas, solo puede empujar la rama actual.

Empuje solo la rama actual

git config --global push.default simple

Por lo tanto, es mejor, en mi opinión, usar esta opción y empujar su código rama por rama. Es mejor empujar ramas de forma manual e individual.

Lalit Sachdeva
fuente
16
Me gustó la push.default currentrespuesta de @UpAndAdam. No lo sabía.
alanjds
44
Tenga en cuenta que simpleya no es una opción. En 1.7.8.4(¿y antes?) Se produce un error cuando intenta presionar. pero currenttodavía está disponible
sesenta
@ sixty4bit: estoy usando git versión 1.7.1. Estoy usando tracking-> empujar la rama actual a su rama aguas arriba.
kevinarpe
@ sixty4bit No, se incluyó en una versión posterior de Git, no sé en qué pero (1.7) es viejo como el infierno, incluso para 2016. No recomendaría usar versiones tan antiguas.
Schmoudi
Voto negativo Lo sentimos, pero la descripción de la página vinculada simpleno tiene sentido, contradice esta respuesta y es incorrecta, lo que hace que esta respuesta sea confusa. La página vinculada dice simple"empujará las ramas una por una. Principalmente conectado con la rama actual". ¿Eso significa que empujará las ramas secuencialmente en lugar de en paralelo? ¿Qué significa "mayormente conectado"? Luego, la descripción de simplecontinúa citando la descripción de matching, para lo cual uno pensaría que la descripción matchingtambién se aplica simple. Pero obviamente eso no es cierto.
tvanc
91

De la documentación de GIT: Git Docs

A continuación se muestra la información completa. En resumen, simplesolo presionará el botón current working branche incluso si solo tiene el mismo nombre en el control remoto. Esta es una muy buena configuración para principiantes y se convertirá en el valor predeterminado enGIT 2.0

Mientras matchingque empujará todas las ramas localmente que tengan el mismo nombre en el control remoto. (Sin tener en cuenta su rama de trabajo actual). Esto significa que potencialmente se empujarán muchas ramas diferentes, incluidas aquellas que tal vez ni siquiera quiera compartir.

En mi uso personal, generalmente uso una opción diferente: currentque empuja la rama de trabajo actual (porque siempre me ramifico para cualquier cambio). Pero para un principiante sugeriríasimple

push.default
Define la acción que git push debería tomar si no se especifica explícitamente refspec. Los diferentes valores son adecuados para flujos de trabajo específicos; por ejemplo, en un flujo de trabajo puramente central (es decir, la fuente de búsqueda es igual al destino de inserción), probablemente lo que desea es en sentido ascendente. Los valores posibles son:

nada: no empuje nada (error fuera) a menos que se especifique explícitamente una refspec. Esto está destinado principalmente a las personas que desean evitar errores siendo siempre explícitos.

actual: empuje la rama actual para actualizar una rama con el mismo nombre en el extremo receptor. Funciona en flujos de trabajo centrales y no centrales.

ascendente: empuje la rama actual de vuelta a la rama cuyos cambios generalmente se integran en la rama actual (que se llama @ {ascendente}). Este modo solo tiene sentido si está presionando al mismo repositorio desde el que normalmente extraería (es decir, flujo de trabajo central).

simple: en el flujo de trabajo centralizado, trabaje como ascendente con una seguridad adicional para negarse a presionar si el nombre de la rama ascendente es diferente del local.

Cuando presione a un control remoto que sea diferente del control remoto desde el que normalmente tira, trabaje como actual. Esta es la opción más segura y es adecuada para principiantes.

Este modo se convertirá en el predeterminado en Git 2.0.

coincidencia: empuje todas las ramas que tengan el mismo nombre en ambos extremos. Esto hace que el repositorio que está presionando recuerde el conjunto de ramas que se expulsarán (por ejemplo, si siempre empuja maint y master allí y no hay otras ramas, el repositorio al que empuje tendrá estas dos ramas, y su maint y master local será empujado allí).

Para utilizar este modo de manera efectiva, debe asegurarse de que todas las ramas que empujaría estén listas para ser expulsadas antes de ejecutar git push, ya que el objetivo de este modo es permitirle empujar todas las ramas de una sola vez. Si generalmente termina el trabajo en una sola rama y elimina el resultado, mientras que otras ramas están sin terminar, este modo no es para usted. Además, este modo no es adecuado para ingresar a un repositorio central compartido, ya que otras personas pueden agregar nuevas ramas allí o actualizar la punta de las ramas existentes fuera de su control.

Actualmente es el valor predeterminado, pero Git 2.0 cambiará el valor predeterminado a simple.

UpAndAdam
fuente
sí, pero supongo que incluso con la configuración push.default que si hace "$ git push origin master ", solo empujará la rama actual al origen a la rama en el origen con el mismo nombre ... ¿verdad? debe mencionar que también hay un control remoto predeterminado
Alexander Mills, el
1
No estoy seguro de entender a qué te refieres. En CUALQUIER MODO si dices git push origin masterque hará lo mismo. El punto de los modos y los valores predeterminados generalmente es lo que sucede cuando simplemente dice git pushy no le dice un control remoto o una rama. ¿Qué configuración predeterminada? te refieres a la configuración predeterminada de push.default? la configuración predeterminada en qué versión de git ... si no la recibe, su comentario es extremadamente vago.
UpAndAdam
'push.default Define la acción que git push debería tomar si no se da explícitamente ninguna especificación de referencia' si dice git push origin master le está dando más información y aún podría no hacer lo que usted describe; dependiendo de la especificación de referencia que configures .. git-scm.com/book/en/v2/Git-Internals-The-Refspec
UpAndAdam
2

Notas de la versión de Git v2.0

Notas de compatibilidad con versiones anteriores

Cuando git push [$there]no dice qué presionar, hemos utilizado la semántica tradicional "coincidente" hasta el momento (todas sus ramas se enviaron al control remoto siempre que ya haya ramas del mismo nombre). En Git 2.0, el valor predeterminado ahora es la semántica "simple", que empuja:

  • solo la bifurcación actual a la bifurcación con el mismo nombre, y solo cuando la bifurcación actual se configura para integrarse con esa bifurcación remota, si está presionando hacia el mismo remoto desde el que obtiene; o

  • solo la rama actual a la rama con el mismo nombre, si está presionando a un control remoto que no es donde normalmente obtiene

Puede usar la variable de configuración "push.default" para cambiar esto. Si usted es un veterano que quiere seguir usando la semántica "coincidente", puede establecer la variable en "coincidente", por ejemplo. Lea la documentación para otras posibilidades.

Cuando git add -uy git add -Ase ejecutan dentro de un subdirectorio sin especificar qué rutas agregar en la línea de comando, operan en todo el árbol para mantener la coherencia con git commit -aotros comandos (estos comandos solían operar solo en el subdirectorio actual). Diga git add -u .o git add -A .si desea limitar la operación al directorio actual.

git add <path>es lo mismo que git add -A <path>ahora, por lo que git add dir/notará las rutas que eliminó del directorio y registrará la eliminación. En versiones anteriores de Git, git add <path>solía ignorar las eliminaciones. Puede decir git add --ignore-removal <path>que agregue solo rutas agregadas o modificadas <path>, si realmente lo desea.

CodeWizard
fuente