2012-03-21 22 views
192

Acabo de aplastar algunos commits con git rebase e hice un git push --force (que es malo, lo sé).Git tirar después de la actualización forzada

Ahora los otros ingenieros de software tienen una historia diferente y cuando hacen un git pull, Git se fusionará. ¿Hay alguna manera de arreglar esto, excepto haciendo un rm my-repo; git clone [email protected]:my-repo.git?

Necesito algo como lo contrario de git push --force, pero git pull --force no dio los resultados previstos.

+10

pueden borrar su rama y volver a crearla también, sin tener que eliminar todo el repositorio: 'git checkout master && git branch -D test && git checkout -b test origin/test' – Florian

+1

Posible duplicado de [Force Git to sobrescribir los archivos locales en pull] (http://stackoverflow.com/questions/1125968/force-git-to-overwrite-local-files-on-pull) – gpoo

Respuesta

318

a recibir las nuevas confirmaciones

git fetch 

Restablecer

Puede restablecer el commit de una rama local utilizando git reset.

Para cambiar la confirmación de una rama local:

git reset origin/master --hard 

Tenga cuidado sin embargo, como la documentación que pone:

Restablece el índice y el árbol de trabajo. Cualquier cambio en los archivos rastreados en el árbol de trabajo desde < commit> se descarta.

Si desea conservar los cambios que tenga localmente, realice un reinicio --soft. Lo cual actualizará el historial de confirmaciones para la sucursal, pero no cambiará ningún archivo en el directorio de trabajo (y luego podrá confirmarlos).

Rebase

Puede reproducir sus commits locales en la parte superior de cualquier otro commit/rama usando git rebase:

git rebase -i origin/master 

Este invocarán rebase en modo interactivo donde se puede elegir la forma de aplicar cada una compromiso individual que no está en la historia sobre la que se basa.

Si las confirmaciones que eliminó (con git push -f) ya se han insertado en el historial local, se mostrarán como confirmaciones que se volverán a aplicar; tendrían que eliminarse como parte de la rebase o simplemente se volverán a -incluido en la historia de la sucursal- y reaparecer en el historial remoto en la siguiente inserción.

Utilice la ayuda git command --help para obtener más detalles y ejemplos sobre cualquiera de los comandos anteriores (u otros).

+0

¿Qué pasa si ya hicieron algunas confirmaciones locales? – iblue

+0

@iblue elige entre perder todos los cambios, eliminar el historial de confirmaciones pero mantener los cambios en el archivo o intentar aplicar cada confirmación en la parte superior del nuevo encabezado. La opción más simple es probablemente un restablecimiento suave. – AD7six

+0

@iblue Cuando su colega usa 'git reabse origen/master ', y mientras tanto, ya tenían algo de commit antes, git escribirá su compromiso al final de su commit. – Tim

11

Esto no arreglará las ramas que ya tienen el código que no quiere en ellas (ver a continuación cómo hacerlo), pero si han sacado una rama y ahora quieren que esté limpia (y no "por delante" de origen/alguna rama) entonces simplemente:

git checkout some-branch # where some-branch can be replaced by any other branch 
git branch base-branch -D # where base-branch is the one with the squashed commits 
git checkout -b base-branch origin/base-branch # recreating branch with correct commits 

Nota: se pueden combinar todos estos poniendo & & entre ellos

Nota 2: Florian mencionó esto en un comentario, pero que lee comentarios al buscar respuestas?

Nota 3: Si tiene ramas contaminadas, puede crear nuevas basadas en la nueva "rama tonta" y simplemente se compromete con la recolección.

Ex:

git checkout feature-old # some branch with the extra commits 
git log     # gives commits (write down the id of the ones you want) 
git checkout base-branch # after you have already cleaned your local copy of it as above 
git checkout -b feature-new # make a new branch for your feature 
git cherry-pick asdfasd # where asdfasd is one of the commit ids you want 
# repeat previous step for each commit id 
git branch feature-old -D # delete the old branch 

ahora cuentan nuevo es su rama sin el extra (posiblemente mal) comete!

+0

Esto es lo que realmente quería. Alguien reescribió la rama principal (por Dios sabe qué razón) pero no tuve cambios locales en ella que quisiera comprometer ni nada. Así que todo lo que tuve que hacer fue eliminar mi rama maestra local (lo que me pareció realmente extraño) y hacer una salida de nuevo. ¡Gracias! –

+0

@ peter-mortensen Las ediciones deben ser sustanciales de acuerdo con https://stackoverflow.com/help/editing –

Cuestiones relacionadas