Digamos que tenemos la siguiente situación en Git:
Un repositorio creado:
mkdir GitTest2 cd GitTest2 git init
Algunas modificaciones en el maestro tienen lugar y se comprometen:
echo "On Master" > file git commit -a -m "Initial commit"
Feature1 se bifurcó del master y se realizó algún trabajo:
git branch feature1 git checkout feature1 echo "Feature1" > featureFile git commit -a -m "Commit for feature1"
Mientras tanto, se descubre un error en el código maestro y se establece una rama de revisión:
git checkout master git branch hotfix1 git checkout hotfix1
El error se corrigió en la rama de revisión y se fusionó nuevamente en el maestro (tal vez después de una solicitud de extracción / revisión de código):
echo "Bugfix" > bugfixFile git commit -a -m "Bugfix Commit" git checkout master git merge --no-ff hotfix1
El desarrollo en feature1 continúa:
git checkout feature1
Digamos que necesito la revisión en mi rama de características, tal vez porque el error también ocurre allí. ¿Cómo puedo lograr esto sin duplicar las confirmaciones en mi rama de características?
Quiero evitar obtener dos nuevos commits en mi rama de características que no tienen relación con la implementación de características. Esto me parece especialmente importante si utilizo solicitudes de extracción: todas estas confirmaciones también se incluirán en la solicitud de extracción y deben revisarse aunque esto ya se haya hecho (ya que la revisión ya está en el maestro).
No puedo hacer un git merge master --ff-only
: "fatal: no es posible avanzar rápidamente, abortar", pero no estoy seguro de si esto me ayudó.
fuente
feature1
es completamente local, échale un vistazogit rebase
.git rebase
parece magia negra ...git branch feature1
ygit checkout feature1
podrían combinarse engit checkout -b feature1
y 4. podrían reducirse por completo agit checkout -b hotfix1 master
Respuestas:
¿Cómo fusionamos la rama maestra en la rama característica? Fácil:
No tiene sentido forzar una fusión de avance rápido aquí, ya que no se puede hacer. Te comprometiste tanto en la rama de características como en la rama maestra. Avance rápido es imposible ahora.
Echa un vistazo a GitFlow . Es un modelo de ramificación para git que puede seguirse, e inconscientemente ya lo hizo. También es una extensión de Git que agrega algunos comandos para los nuevos pasos del flujo de trabajo que hacen las cosas automáticamente, que de lo contrario necesitaría hacer manualmente.
Entonces, ¿qué hiciste bien en tu flujo de trabajo? Tiene dos ramas para trabajar, su rama feature1 es básicamente la rama "desarrollo" en el modelo GitFlow.
Creó una rama de revisión de master y la fusionó de nuevo. Y ahora estás atrapado.
El modelo GitFlow le pide que combine la revisión también con la rama de desarrollo, que es "característica1" en su caso.
Entonces la verdadera respuesta sería:
Esto agrega todos los cambios que se realizaron dentro de la revisión a la rama de características, pero solo esos cambios. Pueden entrar en conflicto con otros cambios de desarrollo en la rama, pero no entrarán en conflicto con la rama maestra si finalmente fusiona la rama característica con la rama maestra.
Ten mucho cuidado con el rebase. Solo vuelva a redactar si los cambios que realizó permanecieron locales en su repositorio, por ejemplo, no empujó ninguna rama a otro repositorio. Rebasar es una gran herramienta para que usted organice sus compromisos locales en un orden útil antes de lanzarlo al mundo, pero el rebase posterior arruinará las cosas para los principiantes como usted.
fuente
git merge master
se fusionará a partir de su copia local de master, por lo que incluso si ha hecho unagit pull
en su rama de características después de que otra persona fusionó una rama diferente en master, deberá hacerlogit checkout master
, luegogit pull
,git checkout feature1
nuevamente y ENTONCESgit merge master
.git fetch
andgit merge origin/master
git pull origin master
se fusionará automáticamenteorgin/master
con la rama actualDebería poder volver a basar su rama en master:
Gestiona todos los conflictos que surjan. Cuando llegues a los commits con las correcciones de errores (ya en master), Git dirá que no hubo cambios y que tal vez ya se aplicaron. Luego continúa el rebase (mientras omite los commits ya en master) con
Si realiza una
git log
en su rama de características, verá que la confirmación de corrección de errores aparece solo una vez, y en la parte maestra.Para una discusión más detallada, eche un vistazo a la documentación del libro Git en
git rebase
( https://git-scm.com/docs/git-rebase ) que cubre este caso de uso exacto.================ Editar para contexto adicional ====================
Esta respuesta se proporcionó específicamente para la pregunta formulada por @theomega, teniendo en cuenta su situación particular. Tenga en cuenta esta parte:
Rebasar su rama privada en master es exactamente lo que dará ese resultado. Por el contrario, fusionar master en su rama haría precisamente lo que él específicamente no quiere que suceda : agregar una confirmación que no esté relacionada con la implementación de la función en la que está trabajando a través de su rama.
Para dirigirse a los usuarios que leen el título de la pregunta, omita el contenido real y el contexto de la pregunta, y luego solo lea la respuesta superior a ciegas, suponiendo que siempre se aplique a su (diferente) caso de uso, permítame explicar:
git merge master
la respuesta de @ Sven).Finalmente, si no está satisfecho con el hecho de que esta respuesta no es la más adecuada para su situación a pesar de que fue para @theomega, agregar un comentario a continuación no será particularmente útil: no controlo qué respuesta está seleccionada, solo @theomega lo hace.
fuente
-f
cuando presiona para sobrescribir la rama con la versión con rebase. ¡Ten cuidado!-f
? ¿O mi flujo de trabajo completo es defectuoso porque necesito un-f
?feature1
de Github.master
en una rama privada (menciona "su" rama local). En ese caso,rebase
está bien y es el mismo caso de uso que la "limpieza" que menciona.Según este artículo , debe:
crear una nueva rama que se basa en la nueva versión del maestro
git branch -b newmaster
fusionar su antigua rama de características en una nueva
git checkout newmaster
resolver conflictos en la nueva rama de características
Los dos primeros comandos se pueden combinar con
git checkout -b newmaster
.De esta manera, su historial permanece claro porque no necesita fusiones anteriores. Y no necesita ser tan cauteloso ya que no necesita hacer un cambio de versión de Git.
fuente
git merge
1. fusionar
origin/master
rama afeature
rama2. fusionar
feature
rama aorigin/master
ramafuente
La respuesta de Zimi describe este proceso en general. Aquí están los detalles:
Crea y cambia a una nueva sucursal. Asegúrese de que la nueva rama se base
master
para que incluya las revisiones recientes.Después de cambiar a la nueva rama, combine los cambios de su rama de características existente. Esto agregará sus confirmaciones sin duplicar las confirmaciones de revisión.
En la nueva rama, resuelva cualquier conflicto entre su característica y la rama maestra.
¡Hecho! Ahora use la nueva rama para continuar desarrollando su función.
fuente
Aquí hay un script que puede usar para fusionar su rama maestra en su rama actual.
El script hace lo siguiente:
Guarde este código como un archivo por lotes (.bat) y coloque el script en cualquier lugar de su repositorio. Luego haga clic en él para ejecutarlo y listo.
fuente
Es posible que pueda hacer una "selección de cereza" para extraer exactamente confirmaciones que necesita en su rama de características.
Haga un
git checkout hotfix1
para llegar a la rama hotfix1. Entonces haz ungit log
para obtener el hash SHA-1 (secuencia grande de letras y números aleatorios que identifica de forma exclusiva una confirmación) de la confirmación en cuestión. Copie eso (o los primeros 10 caracteres).Entonces,
git checkout feature1
para volver a su rama de características.Entonces,
git cherry-pick <the SHA-1 hash that you just copied>
Eso tirará de ese compromiso, y solo esa confirmación, a su rama de características. Ese cambio estará en la rama: simplemente lo "seleccionó". Luego, reanude el trabajo, edite, confirme, presione, etc. a su gusto.
Cuando, finalmente, realice otra fusión de una rama en su rama de características (o viceversa), Git reconocerá que ya se ha fusionado en esa confirmación en particular , sabrá que no tiene que volver a hacerlo, y solo "saltearlo".
fuente
git merge
funcione en esta forma de "confirmaciones de repetición" a la que parece estar insinuando ("y simplemente omítala"). Mezclar la selección y la fusión de cerezas aparentemente puede generar problemas; ver: news.ycombinator.com/item?id=3947950Estoy en la rama de características e hice refactorizaciones. Quiero fusionar los cambios maestros ahora a mi rama de características. Estoy muy atrasado. Tenga en cuenta que no quiero extraer los cambios maestros a mi local porque mis ramas de características tienen módulos movidos de un lugar a otro. Descubrí que solo realizar a continuación sin tirar no funciona. dice "Ya actualizado".
Esto funciona a continuación, tenga en cuenta el uso de git merge origin / master:
fuente