La mejor manera de mover las solicitudes de extracción a otra rama en git
Frecuentes
Visto 1,349 veces
0
Tengo dos ramas, master
y dev
y master
debe ser un subconjunto de dev
. Tengo algunos compromisos que se hicieron para master
al que necesito mudarme dev
. Sin embargo, algunas de las malas confirmaciones en master
ocurrió entre otras confirmaciones válidas.
Así que actualmente se ve algo como esto:
master
A - B - C - D - E - F - G - H - I
dev
A - B - - - - - E - - - G
\
- - - J - K - L
Pero necesito que quede así:
master
A - B - - - - - E - - - G
dev
A - B E G
\ / \ / \
C - D F H - I - J - K - L
Entonces, en esencia, necesito obtener C-D
, F
y H-I
movido de master
a dev
.
Básicamente, si hago una diferencia entre master
y dev
, necesito detenerme master
todo lo que no esta en dev
, y quítelo de master
.
Es un poco complicado, lo sé, principalmente porque cambiamos los procesos a mitad de camino. Y para ser honesto, estoy tratando de averiguar cómo llegó a este estado para empezar. Ni siquiera estoy seguro de en qué punto dev
fue ramificado master
.
Así que solo estoy tratando de encontrar la mejor manera de limpiar el desorden en este punto, y en el futuro, esto no debería ser un problema (ahora que hemos "arreglado" nuestro proceso).
He mirado cherry-pick
, merge
y rebase
, pero no estoy seguro de cuál es apropiado aquí. Yo original estaba pensando cherry-pick
, pero desde master
debe ser un subconjunto de dev
, me preguntaba si un merge
or rebase
es más apropiado aquí.
Además, solo para su información, nadie está trabajando directamente desde ninguna de estas sucursales, y están trabajando desde sus propias bifurcaciones, si eso hace una diferencia en la solución.
Actualizar:
Así que lo hice git log
of master
y dev
:
git checkout master
git log --graph --oneline --all --abbrev-commit --decorate > ../master.txt
git checkout dev
git log --graph --oneline --all --abbrev-commit --decorate > ../dev.txt
Y luego hizo una comparación de los dos gráficos. Esto me dio una imagen mucho mejor (y afortunadamente, mucho más clara) de lo que había sucedido:
--->* de80f1b (HEAD, origin/master, origin/HEAD, master) Merge pull request #168 from nebula101/support-lf-newlines
|\
| * 8b6e985 (origin/pr/168) Add support for the LF line ending
* | b966002 Merge pull request #170 from nebula101/fc_alphanumeric
|\ \
| * | 7bf0c25 (origin/pr/170) Add NNID
| * | 060671d Add XBox360 and PSN to fc tool
* | | 8089053 Merge pull request #169 from nebula101/small-changes
|\ \ \
| * | | 7ef0317 (origin/pr/169) Update noticeboard header text
| * | | ebe7d80 Add festive avatars
| * | | 06dc673 Add 'Austria' to the list of countries
| * | | e04d1a5 Fix a small typo
| * | | d08d254 Fix images in view_view.asp
| * | | 761c09c Fix items_list.asp
| * | | 45096b7 Add Halloween avatars
| * | | c05806f Fix age in profiles
| * | | 5afdcbd Fix a typo in noticeboard_responses.asp
| * | | e254a33 Chenge 'CNB edit should alert users' default
| | |/
| |/|
--->| | | * 3e3e829 (origin/dev, dev, AngelWings666-master) Merge pull request #181 from Quintinius/master
| | | * 2165f08 (Quntinius-master) Merge pull request #183 from jeradrose/dev
| | | |\
....
Básicamente, la única diferencia son las líneas marcadas con --->
, y la HEAD
es master
está en la línea superior, y el HEAD
es dev
es esa línea inferior marcada.
En otras palabras, lo único que se hace es que tres solicitudes de extracción (8b6e985
, 7ef0317
y 7bf0c25
) se fusionaron para master
en lugar de dev
.
Creo que la vista en GitHub me estaba confundiendo, porque las confirmaciones realizadas como parte de esas solicitudes de incorporación de cambios se realizaron antes (cronológicamente), pero no se confirmaron hasta el final, cuando se fusionaron.
Entonces, ¿qué debo hacer para mover esas tres solicitudes de incorporación de cambios a dev
? Sé cómo mover el HEAD
del maestro antes de estas confirmaciones, simplemente no estoy seguro de cuál es la mejor manera de hacer que esas solicitudes de incorporación de cambios se transfieran a dev
.
2 Respuestas
1
OK, no sé nada de github, pero para hacer esto en tu propio repositorio local:
Primero, asegurémonos de que haya marcadores (nombres de ramas o etiquetas) en las confirmaciones de solicitud de extracción, que son las que están justo "antes" de la confirmación de fusión que las trae, en el lado "derecho" de la salida del registro gráfico. Hay tres de esos (números 169, 170 y 168 en un orden ligeramente extraño). son compromisos 8b6e985
(# 168), 7bf0c25
(# 170), y 7ef0317
(#169).
Da la casualidad de que todos ya tienen buenos marcadores, origin/pr/168
, origin/pr/170
y origin/pr/169
. Entonces, el paso 1 es: verifique que las etiquetas existan, las hay, hecho.
Ahora, arreglemos master
y luego fuerza-empuje el resultado de nuevo a origin
(esto supone que nadie más los ha recogido, o si lo han hecho, saben cómo recuperarse del empuje forzado):
git status # make sure everything is clean
git show master~3 # make sure this is the right commit
Suponiendo que se vean bien, sigamos master
y dile a git que lo reinicie (con --hard
) A master~3
, es decir, haga una copia de seguridad de tres confirmaciones principales del lado izquierdo:
git checkout master
git reset --hard master~3
Ahora hemos "eliminado" las tres confirmaciones de combinación de la rama master
, haciendo que la etiqueta apunte tres nodos más atrás en el gráfico. Esas tres confirmaciones de combinación ya no son accesibles por los nombres HEAD
or master
. Todavía son accesibles por los nombres origin/master
y origin/HEAD
pero estamos a punto de cambiar eso:
git push -f origin master # anyone else using this is out of luck
Asumiendo origin
permite este tipo de empuje forzado, ahora también tiene las tres confirmaciones de combinación inaccesibles (y es probable que las recolecte basura rápidamente). Esto también cambia nuestra copia de origin/master
al menos, y probablemente origin/HEAD
también, por lo que ahora no podemos ver las fusiones (aunque todavía están allí y permanecerán durante ~ 90 días debido a las entradas de reflog).
Aparte: ¿y si eso no funciona? Si el repositorio remoto no permite la inserción forzada, tendrá que "revertir las fusiones". Esto se puede hacer con git revert
, es un poco molesto ya que hace que volver a fusionarse sea mucho más difícil. Dejemos eso fuera de esta respuesta. :-)
Por último, quieres hacer FAQ se fusiona para llevar esas cadenas de confirmación a dev
. Así que súbete a la rama dev
:
git checkout dev
y luego realizar las fusiones. Puede haber algún método más automático que pueda usar con solicitudes de extracción y github, pero esto funcionará:
git merge origin/pr/169 # bring in pull request 169's chain of commits
# do any fixing-up required, here - usually the merge will just work
# automatically and make a commit for you
git merge origin/pr/170 # bring in #170's single commit
# and fix-up if needed here, too
git merge origin/pr/168 # bring in #168's single commit
# and again here
De hecho, si lo desea, puede fusionar los tres a la vez con una "fusión de pulpo". En lugar de tres comandos de combinación separados, usaría uno:
git merge origin/pr/169 origin/pr/170 origin/pr/168
Las fusiones de pulpo se describen (aunque no muy bien) en el documentación de git-merge.
respondido 27 nov., 13:21
0
Primero revisa el master
rama:
git checkout master
Luego mira el registro para ver las confirmaciones de la rama:
git log
Ahora verás tus confirmaciones en la lista, junto con el hash de cada confirmación:
cometer a0b6aa63955aa4dc9a2154e0a0de3b2e8ee6bef2 Autor: Kevin Bowersox Fecha: lun 25 de noviembre 09:51:14 2013 -0500
Commit to update
cometer d132fc724a7f749168a95383a3b376b1c4f699ef Autor: Kevin Bowersox Fecha: lun 25 de noviembre 09:34:40 2013 -0500
removed interceptor
Copie el hash de las confirmaciones a las que desea pasar dev
:
. Por ejemplo, el segundo hash de confirmación es: d132fc724a7f749168a95383a3b376b1c4f699ef
Ahora cambie a la dev
rama:
git checkout dev
Luego use cherry-pick para fusionar selectivamente la confirmación del maestro
git cherry-pick d132fc724a7f749168a95383a3b376b1c4f699ef
respondido 27 nov., 13:18
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas git github merge or haz tu propia pregunta.
Estoy confundido por todo el movimiento hacia arriba y hacia abajo en sus dibujos, y el hecho de que haya etiquetado las ramas de esa manera con letras (A, B, etc.) que son iguales en
master
ydev
pero tienen diferentes padres:E
tiene un solo padre en ambos casos, pero a veces esD
y avecesB
. - torekNo hay confirmaciones enumeradas que tengan ambos
master
ydev
como el padre. En eldev
diagrama, estoy mostrando ambosmaster
(ruta superior) ydev
(ruta inferior), para mostrar que dev contiene confirmaciones que se originaron en ambosmaster
ydev
. En cuanto a las subidas y bajadas en el diagrama de "cómo debería verse", también estoy confundido sobre cómo llegó a este estado, pero independientemente, esta es la forma en que debe ser para reflejar con precisión lo que realmente está en producción: - es decir, C, D, F, H e I no están en producción, pero están en elmaster
rama, y esto es lo que estoy tratando de limpiar. - Jerad RoseTodavía estoy confundido. ¡Los commits no tienen ramas! Las confirmaciones tienen ID de confirmación principales, en forma de SHA-1 de "nombre verdadero". Un nombre de rama se resuelve en una sola confirmación, por ejemplo,
branch
podría resolver a222c4dd303570d096f0346c3cd1dff6ea2c84f83
. Ese SHA-1 es el "nombre verdadero" de la confirmación, y esa confirmación tiene algunos ID principales que le indican cómo se creó la confirmación. Esos son inmutables, puedes hacer un copia de la confirmación con algo(s) cambiado(s) (eso es lo quecherry-pick
lo hace), pero eso le da una confirmación diferente, con un "nombre verdadero" SHA-1 diferente. - torekSin embargo, ¿puede una rama tener compromisos? Veo lo que dices, y admito que todavía no tengo una comprensión sólida de cómo funciona git debajo de la superficie, obviamente tú sí. Pero no se obsesione demasiado con la precisión de los diagramas. Básicamente,
master
ydev
actualmente tengo las confirmaciones como se muestra en el primer diagrama (según GitHub), y necesito actualizarlas a las confirmaciones como se muestra en el segundo diagrama. - Jerad RoseLas ramas hacen que las confirmaciones sean "alcanzables": puede dibujar un gráfico (un tipo de teoría de gráficos, Gráfico acíclico dirigido) de confirmaciones, con cada confirmación un nodo gráfico y sus padres apuntando a otros nodos, y luego las etiquetas de las ramas son el camino. usted elige un punto de partida para recorrer el gráfico resultante. Quizás los diagramas son una cosa de github (no uso github, solo git sin formato). De todos modos, en general, si tienes un gráfico que no te gusta y quieres dibujar uno nuevo diferente, la forma de hacerlo es con
cherry-pick
y (cuando sea necesario)merge
.git rebase -i
es solo un script de shell que ejecuta esos comandos, por ejemplo. - torek