framework - git repository
Cómo volver a cometer un compromiso pasado si alguien sobreescribió mi compromiso (3)
La forma más fácil de solucionar este problema suele ser, como sugiere Code_Ninja , usar git cherry-pick
para volver a confirmar sus cambios. Normalmente, el método recomendado por Venkataraman R no funcionará porque Git le dirá que no hay nada que fusionar. (Si funciona, también está bien.) Los detalles exactos dependen de la situación. Para la posteridad, sin embargo, veamos la forma más común en que esto sucede.
Alguien consiguió un conflicto de fusión y al fusionar perdió todos mis cambios.
Esto es muy fácil para el "alguien". Vamos a darle a "alguien" un nombre; Llamémoslo Carl el descuidado. Carl corre:
git merge carls-feature
o tal vez incluso:
git pull
(aunque recomiendo que cualquier principiante, como Carl aquí, evite el git pull
, es mejor que ejecute git merge
directamente, para que pueda tener una idea de lo que está haciendo).
En cualquier caso, Carl ahora ve esto:
Auto-merging somefile.ext
CONFLICT (content): Merge conflict in somefile.ext
El pobre Carl entra en pánico, busca consejos en la web (quizás incluso StackOverflow) y, en lugar de mirar, por ejemplo, Cómo resolver los conflictos de fusión en Git , 1 Carl simplemente ejecuta:
git checkout --ours somefile.ext
git add somefile.ext
git commit
¡Carl acaba de acabar con tu trabajo!
Recuerde, el objetivo de una fusión es combinar el trabajo. Git intentará hacerlo por sí solo, pero a veces Git no puede completar el proceso por sí mismo. En estos casos, Git se detiene y recibe ayuda de su operador humano.
Este operador humano, usted , si usted es el que tiene el conflicto de fusión, está en control total y completo del 100% del resultado de la fusión. Git te creerá, incluso si le dices que el resultado correcto es ignorar por completo el trabajo del otro chico y simplemente tomar tu versión.
(Tenga en cuenta que incluso si Git piensa que ha fusionado correctamente los diferentes cambios de dos personas, Git no siempre lo hace bien. Todavía es su responsabilidad verificar que Git lo hizo bien. Es una buena idea tener algún tipo de sistema de prueba completo que pueda Git está simplemente siguiendo reglas simples de combinación de texto, que funcionan muy bien en muchos casos.)
1 La respuesta aceptada aquí recomienda usar git mergetool
con vimdiff
como herramienta. git mergetool
que no me gusta git mergetool
, y recomiendo leer las otras respuestas también, y experimentar para ver qué funciona mejor para ti. Pero si git mergetool
funciona bien para ti, está bien. Tenga en cuenta que git mergetool
puede usar otras herramientas de combinación que vimdiff
; Si tiene una herramienta de combinación que prefiera, es probable que git mergetool
pueda ejecutarla. El libro Pro Git tiene consejos adicionales, incluido un capítulo sobre fusión avanzada.
Acabo de enfrentar un problema en el que alguien sobrescribió mi compromiso completo y hay muchos otros compromisos además de esto, ahora tengo que volver a cometer ese compromiso en particular. Cualquier ayuda sería apreciada.
Alguien consiguió un conflicto de fusión y al fusionar perdió todos mis cambios. No sé lo que hizo, pero mis cambios no están allí. En la historia, mi compromiso está ahí, pero si veo por encima de su fusión, mis cambios se revertirán.
Ahora no puedo revertir su confirmación de fusión porque contiene muchos archivos, en comparación con mí, tampoco quiero cambiar cada uno de los archivos manualmente. ¿Hay alguna manera de recuperar mis cambios sin afectar los de otros?
Puede crear una rama a partir de su antiguo compromiso y luego seguir el proceso de git para fusionar los cambios del maestro a su rama y manejar el conflicto de combinación.
A continuación los pasos para crear una rama a partir de su antiguo compromiso y pago de la misma.
git branch branchname <sha1 of your old commit>
git checkout branchname
o
git checkout -b branchname <sha1 of your old commit>
Puedes hacerlo escribiendo los siguientes comandos:
$ git reflog
a continuación, seleccione el ID de la confirmación que desea recuperar.
Luego escribe el siguiente comando:
$ git cherry-pick <''ID''>
En lugar de <''ID''>
ingrese la ID del reflog anterior.
Entonces tendrás los cambios de ese compromiso.
Ahora verifica si algo queda por:
$ git status
Si hay algo en la confirmación no organizada, agréguela con los siguientes comandos y confirme:
$ git add -A //Any other option or the name of the file with the path that you want to commit
$ git commit -m "Your message here for that commit"
$ git push
Espero que esta respuesta sea lo que están esperando.