Pregunta Fuerza "git push" para sobrescribir archivos remotos


Quiero enviar mis archivos locales y tenerlos en un repositorio remoto, sin tener que lidiar con conflictos de fusión. Solo quiero que mi versión local tenga prioridad sobre la remota.

¿Cómo puedo hacer esto con Git?


543
2018-05-09 05:45


origen


Respuestas:


Debería poder forzar su revisión local al repositorio remoto utilizando

git push -f <remote> <branch>

(p.ej. git push -f origin master) Salir <remote> y <branch> obligará empujar todas las ramas locales que han establecido --set-upstream.

Solo se advirtió que si otras personas comparten este repositorio, su historial de revisiones entrará en conflicto con el nuevo. Y si tienen confirmaciones locales después del punto de cambio, se volverán inválidas.

Actualizar: Pensé que agregaría una nota al margen. Si está creando cambios que otros revisarán, entonces no es raro crear una rama con esos cambios y volver a establecer la base periódicamente para mantenerlos actualizados con la rama de desarrollo principal. Simplemente informe a otros desarrolladores que esto sucederá periódicamente para que sepan qué esperar.

Actualización 2: Debido al número cada vez mayor de espectadores, me gustaría agregar algo de información adicional sobre qué hacer cuando su upstream experimenta un empuje de fuerza.

Supongamos que he clonado su repositorio y he agregado algunas confirmaciones como esta:

            D ---- E tema
           /
A ---- B ---- C desarrollo

Pero luego el development rama es golpeada con un rebase, lo que provocará que reciba un error como ese cuando corro git pull:

Desempaquetar objetos: 100% (3/3), hecho.
De <repo-location>
 * desarrollo de la sucursal -> FETCH_HEAD
Auto-fusión de <archivos>
CONFLICTO (contenido): fusionar conflicto en <ubicaciones>
La fusión automática falló; arregla los conflictos y luego compromete el resultado.

Aquí podría solucionar los conflictos y commit, pero eso me dejaría con un historial de compromiso realmente feo:

       C ---- D ---- E ---- Tema F
      / /
A ---- B -------------- Desarrollo de C '

Puede parecer tentador usar git pull --force pero ten cuidado porque eso te dejará con commits varados:

            D ---- E tema

A ---- B ---- C 'desarrollo

Entonces, probablemente la mejor opción es hacer una git pull --rebase. Esto requerirá que resuelva cualquier conflicto como antes, pero para cada paso en lugar de comprometerlo lo usaré git rebase --continue. Al final, el historial de commit se verá mucho mejor:

            D '--- E' tema
           /
A ---- B ---- C 'desarrollo

Actualización 3: También puedes usar el --force-with-lease opción como una fuerza "más segura" empujar, como lo menciona Cupcake en su responder:

Forzar el empuje con un "arrendamiento" permite que el empuje de fuerza falle si hay   son nuevos commits en el control remoto que no esperabas (técnicamente, si   aún no los ha buscado en su sucursal de seguimiento remoto), que   es útil si no desea sobrescribir accidentalmente el de otra persona   comete un compromiso que ni siquiera conocías, y solo quieres   sobrescribe el tuyo:

git push <remote> <branch> --force-with-lease

Puede obtener más detalles sobre cómo usar --force-with-leasepor   leyendo cualquiera de los siguientes:


781
2018-05-09 05:48



Quieres forzar el empuje

Lo que básicamente quiere hacer es forzar el envío de su sucursal local, para sobrescribir el remoto.

Si desea una explicación más detallada de cada uno de los siguientes comandos, vea mi sección de detalles a continuación. Básicamente tienes 4 opciones diferentes para forzar la fuerza con Git:

git push <remote> <branch> -f
git push origin master -f # Example

git push <remote> -f
git push origin -f # Example

git push -f

git push <remote> <branch> --force-with-lease

Si desea una explicación más detallada de cada comando, consulte la sección de respuestas largas a continuación.

Advertencia: El forzar fuerza sobrescribirá la rama remota con el estado de la rama que está presionando. Asegúrese de que esto es lo que realmente desea hacer antes de usarlo, de lo contrario, puede sobrescribir las confirmaciones que realmente desea conservar.

Detalles de fuerza de empuje

Especificando el control remoto y la ramificación

Puede especificar completamente ramas específicas y un control remoto. los -f bandera es la versión corta de --force

git push <remote> <branch> --force
git push <remote> <branch> -f

Omitiendo la rama

Cuando se omite la bifurcación de bifurcar para empujar, Git lo resolverá en función de la configuración. En las versiones de Git posteriores a la versión 2.0, un nuevo repositorio tendrá configuraciones predeterminadas para impulsar la sucursal que está prestada actualmente:

git push <remote> --force

mientras que antes de 2.0, los nuevos repos tendrán configuraciones predeterminadas para enviar múltiples sucursales locales. La configuración en cuestión es la remote.<remote>.push y push.default configuraciones (ver a continuación).

Omitir el control remoto y la rama

Cuando se omiten tanto el control remoto como la bifurcación, el comportamiento de solo git push --force está determinado por tu push.default Configuración de configuración de Git:

git push --force
  • A partir de Git 2.0, la configuración predeterminada, simple, básicamente solo empujará su rama actual a su contraparte remota en sentido ascendente. El control remoto está determinado por la rama branch.<remote>.remote configuración, y por defecto al repositorio de origen en caso contrario.

  • Antes de la versión 2.0 de Git, la configuración predeterminada, matching, básicamente solo empuja todas sus sucursales locales a las sucursales con el mismo nombre en el control remoto (que por defecto es de origen).

Puedes leer más push.default ajustes leyendo git help config o una versión en línea de la página de manual de git-config (1).

Forzar el empuje de forma más segura con --force-with-lease

Forzar empujar con un "arrendamiento" permite que el empuje de fuerza falle si hay nuevos compromisos en el control remoto que no esperaba (técnicamente, si aún no los ha buscado en su rama de seguimiento remoto), lo cual es útil si no desea sobrescribir accidentalmente las confirmaciones de otra persona que ni siquiera conocía y solo desea sobrescribir la suya propia:

git push <remote> <branch> --force-with-lease

Puede obtener más detalles sobre cómo usar --force-with-lease leyendo cualquiera de los siguientes:


100
2017-07-15 21:21



Otra opción (para evitar cualquier presión forzada que pueda ser problemática para otros contribuyentes) es:

  • pon tus nuevos commits en una rama dedicada
  • reinicia tu master en origin/master
  • fusionar su rama dedicada a master, siempre manteniendo las confirmaciones de la rama dedicada (es decir, creando nuevas revisiones además de master que reflejará su rama dedicada).
    Ver "git comando para hacer una rama como otra"para estrategias para simular una git merge --strategy=theirs.

De esta forma, puede enviar el maestro al control remoto sin tener que forzar nada.


25
2018-05-09 06:00



git push -f es un poco destructivo porque restablece los cambios remotos que haya realizado cualquier otra persona en el equipo. Una opción más segura es {git push --force-with-lease}.

Lo que {--force-with-lease} hace es negarse a actualizar una rama a menos que sea el estado que esperamos; es decir, nadie ha actualizado la rama en sentido ascendente. En la práctica, esto funciona comprobando que el ref ascendente es lo que esperamos, porque los refs son hash y codifican implícitamente la cadena de progenitores en su valor. Puedes decirle {--force-with-lease} exactamente lo que debes verificar, pero por defecto verificará la referencia remota actual. Lo que esto significa en la práctica es que cuando Alicia actualiza su bifurcación y la envía al repositorio remoto, se actualizará el encabezado de referencia de la sucursal. Ahora, a menos que Bob haga una extracción desde el control remoto, su referencia local al control remoto estará desactualizada. Cuando vaya a presionar usando {--force-with-lease}, git revisará la referencia local contra el nuevo control remoto y se rehusará a forzar el empuje. {--force-with-lease} efectivamente solo le permite forzar el empuje si nadie más ha empujado los cambios al control remoto mientras tanto. Es {--force} con el cinturón de seguridad puesto.


2
2017-07-05 11:32