Tengo un repositorio git con 2 ramas: master y test.
Existen diferencias entre las ramas maestra y de prueba.
Ambas sucursales tienen todos los cambios comprometidos.
Si lo hago:
git checkout master
prueba de diferencia de git
Aparece una pantalla llena de cambios que muestra las diferencias. Quiero fusionar los cambios en la rama de prueba y también lo hago:
prueba de fusión git
Pero reciba el mensaje "Ya actualizado"
Sin embargo, examinar archivos debajo de cada rama diferente muestra claramente las diferencias.
¿Cuál es el problema aquí y cómo lo resuelvo?
Respuestas:
El mensaje "Ya actualizado" significa que todos los cambios de la sucursal que está intentando fusionar ya se han fusionado con la sucursal en la que se encuentra actualmente. Más específicamente, significa que la rama que está intentando fusionar es una matriz de su rama actual . Felicitaciones, esa es la fusión más fácil que jamás harás. :)
Use
gitk
para echar un vistazo a su repositorio. La etiqueta para la rama "prueba" debe estar en algún lugar debajo de la etiqueta de la rama "maestra".Su sucursal está actualizada con respecto a su matriz. Según la fusión, no hay nuevos cambios en el padre desde la última fusión. Eso no significa que las ramas sean iguales, porque puede tener muchos cambios en su rama de trabajo y parece que sí.
Editar 10/12/2019:
Según Charles Drake en el comentario a esta respuesta, una solución para remediar el problema es:
Esto lo lleva de vuelta al nivel de 'prueba'.
Entonces hazlo:
para forzar cambios de nuevo al repositorio central.
fuente
Esto a menudo me sucede cuando sé que hay cambios en el maestro remoto, por lo que trato de fusionarlos usando
git merge master
. Sin embargo, esto no se fusiona con el maestro remoto, sino con su maestro local.Entonces, antes de hacer la fusión, finalice la compra y luego
git pull
allí. Entonces podrá fusionar los nuevos cambios en su rama.fuente
git fetch
que actualizaría la rama maestra incluso si actualmente estoy en una diferente. Resulta que no. ¡Gracias! Estoy bastante seguro de que hay una opciónfetch
que le permite especificar qué rama obtener.git fetch --all
, pero esto solo busca las ramas, no las tira.git fetch --all && git merge origin/master
. No es necesario actualizar su localmaster
para fusionar cambios remotos.git merge master
y 1 congit merge origin/master
. También me fuimaster
ygit pull
antes de actualizar 2 sucursales. a pesar de que compartían el mismo contenido, la creación de un PR entre las 2 ramas mostró algunos archivos diff. Lo arreglé porgit pull
la bifurcación de destino en la bifurcación de características, que mostró:Already up to date! Merge made by the 'recursive' strategy.
esto dio como resultado la confirmación de fusión sin cambios, pero eliminó los archivos diff inesperados de PR. ¿Alguna idea de por qué existe una diferencia entre fusionar sucursales locales y remotas "equivalentes"?Digamos que tiene una rama
master
con el siguiente historial de confirmación:Ahora, crea una prueba de bifurcación, trabaja en ella y realiza 4 confirmaciones:
master
la cabeza apunta a D, ytest
la cabeza apunta a H.El mensaje "Ya actualizado" aparece cuando el HEAD de la rama en la que se está fusionando es un padre de la cadena de commits de la rama que desea fusionar. Ese es el caso, aquí:
D
es padre deE
.No hay nada que fusionado desde
test
quemaster
, puesto que nada ha cambiado enmaster
desde entonces. Lo que quieres hacer aquí es, literalmente, decirle a Git que tengamaster
la cabeza apuntando a H, para que la rama del maestro tenga el siguiente historial de confirmaciones:Este es un trabajo para el comando Git
reset
. También desea que el directorio de trabajo para reflejar este cambio, por lo que va a hacer un disco de restablecimiento:fuente
git reset --hard
es algo bastante drástico, ¿puede perder confirmaciones? ¿Existe una forma más segura de hacer estos cambios, o son los peligros degit reset --hard
exagerar?--hard
opción es el hecho de que realmente modifica su directorio de trabajo y, como consecuencia, pierde cambios no confirmados. Personalmente, hago ungit status
antes y después de cada comando git ejecutado manualmente para asegurarme de que mi repositorio esté limpio o en el estado esperado.--hard
opción? He estado en esta situación un par de veces y siempre reinicio sin--hard
. Funcionó bien sin el riesgo de perder cambios no comprometidos.Lo que funciona para mí, digamos que tienes branch1 y quieres fusionarlo en branch2.
Abre la línea de comando git, vaya a la carpeta raíz de branch2 y escriba:
Si tiene conflictos, no necesita hacer git push, primero resuelva los conflictos y luego presione.
fuente
Eso debería significar que los commits en la prueba ya están fusionados en master, pero dado que otros commits se realizan en master,
git diff test
aún darían algunas diferencias.fuente
Esto sucede porque su copia local de la sucursal que desea fusionar está desactualizada. Tengo mi sucursal, llamé
MyBranch
y quiero fusionarlaProjectMaster
.¡Pero sé que hay cambios que deben fusionarse!
Aquí está la cosa, cuando escribo
git merge ProjectMaster
escribo, git mira mi copia local de esta rama, que podría no estar actualizada . Para ver si este es el caso, lo primero que digo Git para comprobar y ver si mis ramas no están actualizados a buscar cualquier cambio si lo que usar, eh,fetch
. Luego me subo a la rama que quiero fusionar para ver qué sucede allí ...Ah-ha! Mi copia local está obsoleta por 85 confirmaciones, ¡eso lo explica todo! Ahora,
Pull
elimino los cambios que me faltan, luego saltoMyBranch
e intento fusionar nuevamente.Y ahora tengo otro problema que solucionar ...
fuente
Esto me sucedió porque extrañamente GIT pensó que la sucursal local era diferente de la sucursal remota. Esto era visible en el gráfico de rama: mostraba dos ramas diferentes: remotos / origin / branch_name y branch_name.
La solución fue simplemente eliminar el repositorio local y volver a clonarlo desde el control remoto. De esta manera, GIT comprendería que los controles remotos / origin / branch_name> y branch_name son realmente lo mismo, y podría emitir el
git merge branch_name
.fuente
git merge origin/master
en cambiogit merge master
funcionó para mí. Entonces, para fusionar master en la rama de características, puede usar:fuente
Asegúrese de verificar primero la rama que desea fusionar y luego tire de ella (para que su versión local coincida con la versión remota).
Luego, vuelva a pagar en su sucursal en la que desea realizar la fusión y su fusión git debería funcionar.
fuente
git pull
mientras estaba en la "rama"sucedió a mí y me enviaron a esta página, no estoy seguro si tenía el mismo escenario, pero el mío era yo tratando de "volver a fusionar" esa rama de "prueba".
Así que anteriormente lo fusioné, pero excluyo intencionalmente algunos cambios específicos durante esa fusión, por lo que claramente tiene algunas diferencias entre las ramas. Entonces estaba tratando de volver a fusionarlo porque me doy cuenta / olvido que debería haberlo hecho y quería agregar un cambio / archivo en particular que anteriormente había excluido y esperaba que si volviera a hacer una fusión mostrara todos los cambios que excluí antes , pero estaba equivocado y en su lugar recibo el mensaje "Ya actualizado".
Al leer el comentario / respuesta de @Bombe, tiene razón, y creo que se comporta de esa manera, así que lo que hice fue hacer una copia de seguridad de los archivos en la rama de prueba, luego verificar la rama maestra y pegar manualmente los archivos en ella y confirmar como si se tratara de nuevos cambios.
No estoy seguro de si esta es la forma correcta o podría ayudar a otros que tienen este mismo problema, pero sí proporcionó una solución a mi caso particular.
fuente
git checkout srcBranch -- path/to/file
. Puede usar archivos glob también.checkout srcBranch -- *
y luego miré mis diferenciasSi la fusión de la rama A en la rama B informa "Ya actualizado", lo inverso no siempre es cierto. Es cierto solo si la rama B es descendiente de la rama A, de lo contrario, la rama B simplemente puede tener cambios que no están en A.
Ejemplo:
En este punto, la fusión de A a B informa "Ya actualizado" pero las ramas son diferentes porque la rama B tiene actualizaciones del maestro mientras que la rama A no.
fuente
Enfrenté este escenario usando Git Bash.
Nuestro repositorio tiene múltiples ramas y cada rama tiene un ciclo de confirmación diferente y la fusión ocurre de vez en cuando. Old_Branch se usó como padre para New_Branch
Old_Branch se actualizó con algunos cambios que debían fusionarse con New_Branch
Estaba usando el siguiente comando de extracción sin ninguna rama para obtener todas las fuentes de todas las ramas.
Curiosamente, esto no extrae todos los commits de todas las ramas. Lo había pensado así, ya que lo indicado muestra casi todas las ramas y etiquetas.
Así que para solucionar esto había comprobado que Old_Branch sacó lo último usando
Ahora revisado New_Branch
Lo saqué para estar seguro
Y viola consiguió solucionar los conflictos de Old_Branch a New_Branch :), lo que se esperaba
fuente
Me ha pasado lo mismo. Pero el escenario era un poco diferente, tenía una rama maestra y eliminé release_1 (digamos) de ella. Realizó algunos cambios en la rama release_1 y la fusionó en origen. luego hice ssh y en el servidor remoto volví a pagar release_1 usando el comando git checkout -b release_1, ¡que realmente crea una nueva rama release_! desde el maestro en lugar de verificar la rama existente ya existente release_1 desde el origen. Resolvió el problema eliminando el interruptor "-b"
fuente
Yo tuve el mismo problema. Tuve cambios en el control remoto y todavía mostraba "Ya actualizado". Reclinar el repositorio solucionó el problema para mí.
fuente
Tonto, pero podría suceder. Suponga que el nombre de su sucursal tiene el prefijo de una referencia de problema (por ejemplo
#91-fix-html-markup
), si hace esta fusión:no funcionará según lo previsto porque todo después de que
#
se ignora, porque#
comienza un comentario en línea.En este caso se puede cambiar el nombre de la rama omitiendo
#
o utilizar comillas simples para el nombre de la sucursal:git merge '#91-fix-html-markup'
.fuente