Git pull después de actualización forzada

Acabo de aplastar algunos compromisos con git rebase e hice git push --force (esto es malo, lo sé).

Ahora otros programadores tienen una historia diferente, y cuando lo hacen git pull , git se fusionará. ¿Hay una manera de solucionar esto, excepto para hacer rm my-repo; git clone git@example.org:my-repo.git rm my-repo; git clone git@example.org:my-repo.git ?

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

175
22 марта '12 в 1:30 2012-03-22 01:30 iblue se establece el 22 de marzo de '12 a la 1:30 a.m. 2012-03-22 01:30
@ 2 respuestas

Para obtener nuevos compromisos

 git fetch 

Restablecer

Puede restablecer la confirmación en una rama local con git reset .

Para cambiar el commit de la sucursal local:

 git reset origin/master --hard 

Ten cuidado, porque los documentos

Restablece el índice y el árbol de trabajo. Cualquier cambio en los archivos monitoreados en el árbol de trabajo se ha descartado desde entonces.

Si desea guardar todos los cambios que tiene localmente, haga --soft reset. que actualiza el historial de confirmación de la rama, pero no cambia ningún archivo en el directorio de trabajo (y puede corregirlos).

Rebase

Puedes jugar tus confirmaciones locales sobre cualquier otro pestillo / rama usando git rebase

 git rebase -i origin/master 

Esto activará la redirección en línea, donde puede elegir cómo usar cada confirmación individual que no esté en la historia que está reorganizando.

Si elimina (utilizando git push -f ) que se eliminaron en el historial local, se mostrarán como confirmaciones para volver a aplicar - deberán eliminarse como parte de la rebase o simplemente se volverán a incluir en el historial de la sucursal, y nuevamente aparece en el historial eliminado la próxima vez que haga clic.

Use el git command --help help para obtener información más detallada y ejemplos sobre cualquiera de los comandos anteriores (u otros).

293
22 марта '12 в 1:36 2012-03-22 01:36 la respuesta se da AD7six 22 de marzo de 2012 a la 1:36 2012-03-22 01:36

Esto no solucionará las ramas que ya tienen un código que no necesita (vea a continuación cómo hacerlo), pero si extrajeron alguna rama y ahora quieren que esté limpia (y no "adelante" del 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 Puedes combinar todo esto poniendo entre ellos.

Nota 2: Florian mencionó esto en el comentario, pero ¿quién lee los comentarios cuando busca respuestas?

border=0

Nota 3: Si tiene ramas infectadas, puede crear nuevas basadas en una nueva "rama silenciosa" y solo enlazar la cereza.

Ejemplo:

 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, una nueva característica: su sucursal sin compromisos adicionales (posiblemente malos).

8
29 авг. Responder Tom Prats 29 de agosto 2013-08-29 19:32 '13 a las 19:32 2013-08-29 19:32

Otras preguntas sobre etiquetas de o hacer una pregunta