2011-08-30 10 views
5

tenemos la siguiente historiarama Mover a otro punto de la historia

start   master public 
|     | | 
v     v v 
o---o-- ... --o---o---o 

Desafortunadamente hemos hecho algunos commit en el master rama que contiene algunos datos sensibles. Modificamos esto en una rama separada llamada pública. Ahora queremos "cortar" la rama public para obtener un "estado" completo y limpio en public, pero sin las piezas de historial comprometedoras que todavía están contenidas en master. En otras palabras, queremos que la siguiente nueva historia:

start   master 
|     | 
v     v 
o---o-- ... --o---o 
\ 
    o <- public 

Ahora retirar public dará lugar a que el mismo árbol de trabajo como en la situación original, pero sin los detalles del historial sensibles. Posteriormente, usamos la antigua rama master: renómbrala al unsafe y elabora una nueva rama master fuera de la nueva rama public. De esta manera conservamos la vieja historia en unsafe y somos capaces de empujar la rama public al público sin ningún tipo de preocupaciones:

start   unsafe 
|     | 
v     v 
o---o-- ... --o---o 
\ 
    o---o-- ... --o <-- public 
    \   /
    o-- .. --o-- ... --o <-- master 

¿Cuáles son los comandos git derecha para lograr esto?

PD: Por supuesto, podríamos pagar start, hacer una nueva sucursal y comprometer allí el árbol completo de trabajo de la rama public. ¡Pero debe haber una manera diferente, más elegante, más divertida!

+0

@phlipsy esto no está realmente fuera de tema en SU, pero migraré esto a SO tal como se solicita, para que no lo haga tiene que volver a publicar. – DMA57361

+0

Esta información puede ayudar: http://help.github.com/remove-sensitive-data/. – Barend

+0

Eche un vistazo a http://stackoverflow.com/questions/872565/how-do-i-remove-sensitive-files-from-gits-history – Chris

Respuesta

3

La forma correcta de combinar todas las confirmaciones en público en una confirmación (es decir, fusionar varias confirmaciones en una, o eliminar por completo las confirmaciones individuales, etc.) es usar git rebase -i. Lo que habría que hacer es (suponiendo que la primera confirmación tiene una etiqueta start como su gráfico indica):

git checkout public 
git rebase -i start 

una ventana de edición aparece donde se puede modificar el orden de todos los parches simplemente utilizar squash por toda su parches. Después de guardar el archivo y cerrar el editor, git recombinará el historial de parches según lo solicitado. Por supuesto, la rama maestra no cambiará su historia en absoluto.

Para cambiar el nombre de su maestro actual como inseguro y empezar todo el desarrollo ulterior en público, lo haría:

git checkout -b unsafe master # <- creates a new branch "unsafe" 
git checkout master 
git reset --hard public # <- forces master branch to point to public 

Si no se crea la rama unsafe, el restablecimiento completo perderá todos los envíos en el Maestro y ya no podrás acceder a ellos (fácilmente). Así que asegúrese de crear realmente esa rama.

Una alternativa sería la de cambiar el nombre de master a unsafe y luego crear una nueva rama principal:

git branch -m master unsafe # renames master to unsafe 
git checkout -b master public # creates new branch master as a copy of public 

Ambos deben dar lugar a la misma estructura exacta rama. (Por supuesto, el segundo no tiene ese peligro de perder la historia ...)

+0

Tuve que jugar un poco porque no se pueden aplastar todas las confirmaciones (¿Cuál quedará?). Pero finalmente funcionó para mí.¡Gracias, esa es la solución! – phlipsy

+0

Lo probé en nuestro proyecto de la vida real y: ¡Guau! ¡Esta fue la rebase más loca que he hecho en toda mi vida! Esté preparado para ponerse en contacto con todos sus conflictos de fusión de toda la historia de su proyecto. – phlipsy

Cuestiones relacionadas