Tengo una rama llamada dmgr2 (desarrollo) y quiero extraer de la rama maestra (sitio en vivo) e incorporar todos los cambios en mi rama de desarrollo. ¿Hay una mejor manera de hacer esto? Esto es lo que había planeado hacer, después de confirmar los cambios:
git checkout dmgr2
git pull origin master
esto debería llevar los cambios en vivo a mi rama de desarrollo, ¿o me equivoco?
dev
rama con agit checkout dev
. Entoncesgit pull --rebase origin master
. Si tienes suerte, no habrá conflictos y el desarrollador tendrá los últimos cambios de master.Respuestas:
Los pasos que enumeró funcionarán, pero hay una forma más larga que le brinda más opciones:
El
fetch
comando se puede hacer en cualquier momento antes delmerge
, es decir, puede intercambiar el orden de la búsqueda y el pago, porquefetch
simplemente va al control remoto nombrado (origin
) y le dice: "dame todo lo que tienes que no tengo ", es decir, todos los commits en todas las ramas. Se copian en su repositorio, pero reciben el nombreorigin/branch
de cualquier rama nombradabranch
en el control remoto.En este punto se puede utilizar cualquier espectador (
git log
,gitk
, etc.) para ver "lo que tienen" que no lo hace, y viceversa. A veces esto solo es útil para Warm Fuzzy Feelings ("ah, sí, eso es de hecho lo que quiero") y otras veces es útil para cambiar estrategias por completo ("whoa, todavía no quiero ESO").Finalmente, el
merge
comando toma el commit dado, que puede nombrar comoorigin/master
, y hace lo que sea necesario para incorporar ese commit y sus antepasados, a cualquier rama en la que se encuentre cuando ejecuta elmerge
. Puede insertar--no-ff
o--ff-only
evitar un avance rápido, o fusionar solo si el resultado es un avance rápido, si lo desea.Cuando usas la secuencia:
el
pull
comando indica a git que se ejecutegit fetch
, y luego el equivalente moral degit merge origin/master
. Entonces, esto es casi lo mismo que hacer los dos pasos a mano, pero hay algunas diferencias sutiles que probablemente no le preocupan demasiado. (En particular, elfetch
paso ejecutado solopull
trae , y no actualiza la referencia en su repositorio: 1 cualquier nueva confirmación termina referida solo por la referencia especial ).origin/master
FETCH_HEAD
Si usa la secuencia más explícita
git fetch origin
(luego, opcionalmente, mire a su alrededor) y luegogit merge origin/master
, también puede actualizar su propio localmaster
con el control remoto, con solo unafetch
ejecución en la red:por ejemplo.
1 Esta segunda parte se ha cambiado, digo "arreglado", en git 1.8.4, que ahora actualiza las referencias de "rama remota" de manera oportunista. (Fue, como dicen las notas de la versión, una decisión de diseño deliberada para omitir la actualización, pero resulta que más personas prefieren que git lo actualice. Si desea que la antigua rama remota SHA-1, por defecto, se guarde en y, por lo tanto, recuperable del reflog. Esto también habilita una nueva característica git 1.9 / 2.0 para encontrar rebases ascendentes).
fuente
git checkout
normalmente no es destructivo y normalmente no hay razón para deshacer un archivogit fetch
, por lo que parece que estás preguntando cómo cancelar una confirmación de fusión. La respuesta es la misma que para otras confirmaciones: ya seagit reset
ogit revert
. Para los cambios no publicadosgit reset
suele ser el mejor método; para los cambios que otros ya tienen,git revert
puede ser mejor, pero vea los consejos de Linus Torvald para revertir una fusión: kernel.org/pub/software/scm/git/docs/howto/…gitk
,git log --graph
con o sin--oneline
, etc.) y se puedegit show
ogit show -m
una combinación de cometer, o el usogit diff
. En todos estos casos, está especificando el programa a medida que ingresa el comando en la línea de comandos.Situación : trabajando en mi sucursal local, pero me encanta mantener actualizaciones en la sucursal de desarrollo nombrada
dev
.Solución : por lo general, prefiero hacer:
fuente
Esto funcionó para mí. Para obtener el último código de maestro a mi sucursal
git rebase origin/master
fuente
git fetch origin
primero.Escenario :
Tengo actualización maestra y actualización de mi sucursal, quiero que mi sucursal haga un seguimiento de la maestra con rebase, para mantener todo el historial rastreado correctamente, llamemos a mi sucursal Mybranch
Solución :
(corrección a la última etapa, por cortesía de Tzachi Cohen, usando "-f" obliga a git a "actualizar el historial" en el servidor)
ahora la rama debe estar alineada con el maestro y el rebase, también con la actualización remota, por lo que en el registro de git no hay "detrás" o "adelante", solo necesita eliminar todos los archivos de conflicto local * .orig para mantener la carpeta "limpia"
fuente