OK, yo pensaba que esto era una simple git escenario, ¿qué me estoy perdiendo?
Tengo un master
rama y un feature
rama. Tengo que hacer algún trabajo en master
, algunos en feature
y, a continuación, algunos más en master
. Termino con algo como esto (lexicográfica del pedido implica la orden de commits):
A--B--C------F--G (master)
\
D--E (feature)
Yo no tengo ningún problema para git push origin master
para mantener el control remoto master
actualizados, ni con git push origin feature
(cuando en feature
) para mantener una copia de seguridad remota para mi feature
trabajo. Hasta ahora, estamos bien.
Pero ahora quiero rebase feature
en la parte superior de la F--G
se compromete en el maestro, así que me git checkout feature
y git rebase master
. Sigue siendo buena. Ahora tenemos:
A--B--C------F--G (master)
\
D'--E' (feature)
Problema: el momento quiero copia de seguridad de la nueva rebasada feature
ramificada con git push origin feature
, el empuje es rechazado desde el árbol ha cambiado debido al reajuste. Este problema sólo puede resolverse con git push --force origin feature
.
Odio utilizando --force
sin estar seguro de que lo necesito. Así, lo necesito? ¿El reajuste necesariamente implica que el próximo push
debe ser --force
ful?
Esta rama de la característica no está compartida con otros desarrolladores, así que no tengo problema de facto con el empuje de fuerza, no voy a perder los datos, la pregunta es más bien conceptual.
El problema es que
git push
se supone que la rama remota puede ser remitido a su sucursal local, que es que toda la diferencia entre lo local y remoto de las ramas es en el local para tener un poco de nuevo se compromete al final como que:Al realizar
git rebase
comete D y E se aplican a la nueva base y los nuevos commits son creados. Eso significa que después de reajuste usted tiene algo así como que:En que la situación de la rama remota no puede ser reenviado a los locales. Aunque, en teoría, la rama local se pueden combinar en remoto (obviamente, usted no la necesita en ese caso), pero como
git push
realiza en avance rápido fusiona lanza y el error.Y lo
--force
opción es simplemente ignorar el estado de la rama remota y configuración para confirmar que usted está empujando dentro de ella. Asígit push --force origin feature-branch
simplemente reemplazaorigin/feature-branch
con localfeature-branch
.En mi opinión, reajuste la característica de ramas en
master
y de la fuerza empujando de nuevo a un repositorio remoto está bien siempre y cuando usted es el único que funciona en esa rama.git pull feature-branch
, esta fuerza va a generar una nueva combinación de commit (por la fusión de local y remota de las versiones de la rama de característica). Así que ya sea que usted obtiene una innecesaria de mezcla después del reajuste, o empujar con--force
.push --force
no es un problema), para mantener la cometa de la historia lineal sin ningún tipo de mezcla compromete a todos.$ git push --force origin myBranch
devuelve «Todo lo que hasta la fecha» y seguido inmediatamente porgit checkout myBranch
da el mismo «cambiado a la rama ‘ingresar’ a Su rama está por delante de ‘el origen/característica/ingresar’ por 34 comete.«--force-with-lease
como @hardev sugerido es una gran opción--force-with-lease
es mucho más seguro que--force
, y es la cosa correcta a hacer en este escenario.Lugar de usar -f o –la fuerza de los desarrolladores deben utilizar
¿Por qué? Porque comprueba la rama remota para los cambios que es absolutamente una buena idea. Imaginemos que James y Lisa están trabajando en la misma rama de característica y Lisa ha empujado a un commit. James ahora reajusta su sucursal local y es rechazado cuando tratando de empujar. Por supuesto James piensa que esto es debido a reajuste y usos de la fuerza y la iba a volver a escribir todas Lisa cambios. Si James tenía utiliza la opción –force-con-el contrato de arrendamiento se hubiera recibido una advertencia de que no se comete el hecho por alguien más. No veo por qué alguien haría uso de la opción –force en lugar de –force-con-contrato de arrendamiento cuando se empuja después de un reajuste.
git push --force-with-lease
me ha ahorrado un montón.--force-with-lease
responde a la preocupación de la utilización de--force
Que me gustaría utilizar en su lugar «checkout-b», y es más fácil de entender.
al eliminar a evitar empujar en una salida de la rama que contiene diferentes SHA ID.
Estoy borrando la rama remota en este caso.
push --force
, por lo que es sólo una manera de conseguir alrededor de un repositorio git prevención de--force
. Como tal, no creo que esto es siempre una buena idea – la repo permitepush --force
, o por una buena razón es que la desactiva. Nabi la respuesta es más apropiado si--force
está deshabilitado en el mando a distancia repo, ya que no tiene el riesgo de perder las confirmaciones de otros desarrolladores o causando problemas.Una solución a esto es hacer lo que msysGit del reajuste de mezcla script no – después del reajuste, de mezcla en el antiguo jefe de
feature
con-s ours
. Se termina con la confirmación gráfico:… y el empuje de
feature
será un avance rápido.En otras palabras, usted puede hacer:
(No probado, pero creo que es lo correcto…)
git rebase
(en lugar de la fusión demaster
de nuevo en su rama) es hacer limpia lineal comete la historia. Con su enfoque comete la historia se pone aún peor. Y como reajuste crea un nuevo cometa, sin referencia alguna a sus versiones anteriores, yo no estoy seguro de que el resultado de esta fusión será la adecuada.merge -s ours
es que artificialmente se añade un padre referencia a la versión anterior. Seguro, la historia no tenga un aspecto limpio, pero el interrogador parece ser particularmente molesto por tener que forzar el empuje de lafeature
rama, y esto se pone alrededor de eso. Si desea reajustar, es más o menos uno o el otro. 🙂 Más en general, creo que es interesante que la msysgit proyecto hace esto….ours
estrategia de antes, pero pensaba que sólo se aplica a la situación de conflicto de forma automática la resolución mediante cambios en nuestra rama. Resultó que funciona de forma diferente. Y trabajando de ese modo es muy útil si usted necesita rebasada la versión (por ejemplo, para repo mantenedor para aplicar de forma limpia amaster
), pero quieren evitar la fuerza de empuje (si montón de otras ppl, por alguna razón, está utilizando su rama).Puede o no puede ser el caso de que sólo hay un desarrollador de esta rama, que es ahora (después de que el rebase) no en línea con el origen o característica.
Como tal, me gustaría sugerir a utilizar la siguiente secuencia:
Sí, nueva rama, esto debería solucionar esto sin la opción –force, que creo que en general es una de las principales git inconveniente.
Otros han respondido a su pregunta. Si usted rebase de una rama que se necesita fuerza para empujar esa rama.
De reajuste y un repositorio compartido generalmente no se llevan bien. Esta es la reescritura de la historia. Si los demás están usando esa rama o han ramificado a partir de esa rama, a continuación, reajuste será bastante desagradable.
En general, de reajuste funciona bien para la sucursal local de gestión. De la rama remota de gestión que funciona mejor con explícita fusiones (–no-ff).
También evitar la fusión de maestro en una rama de la característica. En lugar de eso nos rebase maestro, pero con un nuevo nombre de la sucursal (e.g la adición de un sufijo de versión). Esto evita el problema de reajuste en el repositorio compartido.
Mi manera de evitar que la fuerza de empuje es crear una nueva rama y continuo trabajo en el que la nueva rama y después de un poco de estabilidad, quitar la antigua rama que fue rebasada:
Lo que está mal con un
git merge master
en elfeature
rama? Esto para conservar el trabajo que tenía, mientras que lo mantiene separado de la línea principal de la sucursal.Edición: Ah lo siento no leer su declaración del problema. Usted tendrá fuerza a medida que se realiza un
rebase
. Todos los comandos que modifican la historia tendrá la--force
argumento. Esta es una prueba de fallas para evitar la pérdida de trabajo (el antiguoD
yE
se perdería).Así que se realizó una
git rebase
que hizo que el árbol parece (aunque parcialmente oculto comoD
yE
ya no en nombre de la rama):Así, cuando tratando de empujar a su nuevo
feature
rama (conD'
yE'
en ella), perderíaD
yE
.La siguiente me funciona:
git push -f origin branch_name
y no quita nada de mi código.
Pero, si quieres evitar esto, entonces usted puede hacer lo siguiente:
entonces usted puede cherry-pick todos sus envíos a la nueva rama.
git cherry-pick COMMIT ID
y, a continuación, empuje su nueva sucursal.
-f
es un alias para--force
, que es lo que la pregunta está tratando de evitar, si es posible.Para mí siguientes pasos obras:
Después de hacer todo lo anterior, podemos eliminar myFeature rama así por el comando siguiente:
Como el OP no entender el problema, solo busca una mejor solución…
¿Qué tal esto como una práctica ?
Tienen en función de real-desarrollar rama (donde nunca rebase y de la fuerza de empuje, para que sus compañeros la característica de que los desarrolladores no los odio). Aquí, regularmente agarrar los cambios de principal con una combinación. Messier historia, sí, pero la vida es fácil y nadie consigue es interrumpido en su trabajo.
Tener una segunda característica-desarrollar rama, donde uno función de miembro del equipo regularmente empuja a todos los de la característica se compromete a que, de hecho pasa, de hecho forzada. Por lo que casi de manera limpia basada en una bastante reciente maestro de cometer. En función completa, push que se ramifican en la parte superior de la maestra.
Podría ser un patrón de nombre para este método ya.