La respuesta corta
Siempre y cuando esté haciendo una fusión de avance rápido , simplemente puede usar
git fetch <remote> <sourceBranch>:<destinationBranch>
Ejemplos:
# Merge local branch foo into local branch master,
# without having to checkout master first.
# Here `.` means to use the local repository as the "remote":
git fetch . foo:master
# Merge remote branch origin/foo into local branch foo,
# without having to checkout foo first:
git fetch origin foo:foo
Si bien la respuesta de Amber también funcionará en casos de avance rápido, el uso git fetch
de esta manera en su lugar es un poco más seguro que simplemente mover la referencia de rama a la fuerza, ya que git fetch
evitará automáticamente el avance no acelerado accidental siempre que no lo use +
en el refspec.
La larga respuesta
No puede fusionar una rama B en la rama A sin desproteger A primero si daría como resultado una fusión que no sea de avance rápido. Esto se debe a que se necesita una copia de trabajo para resolver posibles conflictos.
Sin embargo, en el caso de las fusiones de avance rápido, esto es posible porque tales fusiones nunca pueden generar conflictos, por definición. Para hacer esto sin verificar primero una rama, puede usar git fetch
una refspec.
Aquí hay un ejemplo de actualización master
(no permitir cambios que no sean de avance rápido) si tiene otra rama feature
desprotegida:
git fetch upstream master:master
Este caso de uso es tan común, que probablemente desee crear un alias en su archivo de configuración de git, como este:
[alias]
sync = !sh -c 'git checkout --quiet HEAD; git fetch upstream master:master; git checkout --quiet -'
Lo que hace este alias es lo siguiente:
git checkout HEAD
: esto pone su copia de trabajo en un estado de cabeza separada. Esto es útil si desea actualizar master
mientras lo tiene desprotegido. Creo que fue necesario hacerlo porque, de lo contrario, la referencia de la rama master
no se moverá, pero no recuerdo si eso realmente está fuera de mi alcance.
git fetch upstream master:master
: esto adelanta rápidamente su local master
al mismo lugar que upstream/master
.
git checkout -
desprotege su rama desprotegida anteriormente (eso es lo que -
hace en este caso).
La sintaxis de git fetch
fusiones de avance rápido (no)
Si desea que el fetch
comando falle si la actualización no es de avance rápido, simplemente use una especificación de referencia del formulario
git fetch <remote> <remoteBranch>:<localBranch>
Si desea permitir actualizaciones que no sean de avance rápido, entonces agregue un +
al frente de la especificación de referencia:
git fetch <remote> +<remoteBranch>:<localBranch>
Tenga en cuenta que puede pasar su repositorio local como el parámetro "remoto" usando .
:
git fetch . <sourceBranch>:<destinationBranch>
La documentación
De la git fetch
documentación que explica esta sintaxis (énfasis mío):
<refspec>
El formato de un <refspec>
parámetro es un plus opcional +
, seguido de la referencia de origen <src>
, seguido de dos puntos :
, seguido de la referencia de destino <dst>
.
La referencia remota que coincide <src>
se obtiene, y si <dst>
no es una cadena vacía, la referencia local que coincide se reenvía rápidamente mediante<src>
. Si+
se usa elplus opcional, la referencia local se actualiza incluso si no da como resultado una actualización de avance rápido.
Ver también
Git checkout y fusionar sin tocar el árbol de trabajo
Fusionar sin cambiar el directorio de trabajo