Git elimina commits duplicates

Después de jugar con los controles remotos, terminé con todos mis compromisos duplicates. Por ejemplo, en lugar de

C3107 .. C3 C2 C1 

tengo

 C3107 C3107 .. C3 C3 C2 C2 C1 C1 

donde doubled commits tiene los mismos nombres pero hashes diferentes. El problema es que lo noté demasiado tarde y no agregué un buen grupo de compromisos además de eso.

¿Hay alguna forma de eliminar las confirmaciones duplicadas y no las que he agregado?

PD: Si me ayuda, tengo una copy de un repository antes de mis experimentos con controles remotos.

Muchas gracias por adelantado.

ACTUALIZAR Como muchos de ustedes preguntaron aquí es cómo terminó así: Tengo un repo R1 luego creé otro R2. En mi copy local, que estaba actualizada con R1, cambié los orígenes a R2 e intenté impulsar, pero algunos files de gran tamaño fueron rechazados por github. Así que hice git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' que hizo que git pensara que los repositorys son diferentes. Luego presioné todo para que R2 hiciera algunas confirmaciones y decidí volver a cambiar a R1 y cambié el origen de nuevo y presioné. Luego agregué algunos commits más a R1.

Con un poco de magia shell, grepping y mucha confianza, entonces la respuesta es probablemente "sí". ¡Pero estaría demasiado receloso de desorderar todo para aplastar más de 3000 commits con un solo command!

Sin embargo, puede hacerlo (moderadamente) de forma interactiva mediante el uso de rebases interactivos . Es un poco laborioso, pero tienes buen control sobre lo que está sucediendo y obtienes buenos comentarios de git.

git rebase -i #commit id donde quieres comenzar a aplastar #

Esto abrirá una session interactiva. Cambia todo less el primer compromiso en la stack para arreglar o aplastar.

 pick 07520cd Caught file exists issue. # this is last commit fixup 3b71b9f Added README. # fixup will squash the commit # Rebase b041966..3b71b9f onto b041966 # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordenetworking; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out 

Tengo un git koan (koan 8) que te guiará por git rebase -i.

https://github.com/jbremson/git_koans (trabajo en progreso)

~

Y al final decidí a favor de la caza de cerezas.