2012-04-09 13 views
6

Estoy modificando el código de otra persona (no git). Descargué el original, siguieron mis modificaciones y salté el arma e hice la versión modificada de mi primer compromiso. Esto fue un error, debería haber agregado el código original descargado como mi primer compromiso.(otra más) modificar el historial de git para agregar un primer commit

A continuación, para colmo de males, he añadido el código original como una rama de mi primera edición .. En otras palabras, es un gran lío ahora :(

En términos simples, lo que tengo se parece el gráfico azul de abajo. C5 es el código original real, C1, C2-C6 son mis modificaciones graduales (C4 es redundante). yo prefiero tener el verde sea mi historia.

enter image description here

alguna idea de cómo para modificar el historial para lograr esto?

Gracias muchas,

astuta

+0

corté en C6 y en adelante, pero se supone que cualquier compromiso futuro debe seguir como está. – sly

+0

Me pregunto si puede ser más limpio restaurar cada compromiso en su propia carpeta, y comenzar de cero con un 'init' y luego copiar sobre cada versión y' confirmar' en el orden correcto. No es una solución de git, pero es una solución que en realidad puede ser más rápida. –

+2

Gracias Randolph. Sin embargo, estoy muy interesado en la solución git para aprender sobre ella. (También hay un espejo en línea, pero no compartido, que quiero simplemente presionar y terminar) – sly

Respuesta

9

he hecho esto por completo en la línea de comandos, pero voy a insertar capturas de pantalla de SourceTree para ilustrar lo que está pasando.

En primer lugar obtener los primeros 7 u 8 dígitos de cometer id (50da9c3) de la C5 comprometerse y poner en el portapapeles o en la edición de textos o algo - lo necesitará más adelante

Para la confirmación, aquí es nuestra estado de partida:

enter image description here

Éstos son los pasos para llegar a donde quieres:

Crear una nueva rama no arraigada para empezar a construir comete fuera de la base denominada

git symbolic-ref HEAD refs/heads/base 

Ahora eliminar todos los archivos y directorios de git

git rm --cached -r . 

Ahora que todos los archivos son 'sin seguimiento' eliminarlas del directorio de trabajo local

git clean -d --force 

Ahora cree un comprometerse con nada en él (este será el compromiso en el que se construirá todo lo demás).

git commit --allow-empty -m'Initial Commit' 

Su árbol debe tener este aspecto ahora:

enter image description here

Ahora cereza escoger el c5 cometer (lo que tenías en el portapapeles)

git cherry-pick 50da9c3 

enter image description here

Ahora vuelva a enraizar la rama principal en la rama de base

git rebase --onto base --root master 

enter image description here

ya se puede eliminar la base y ramas C4-C5

git branch -d base 

enter image description here

git branch -D c4-c5branch 

enter image description here

Tenga en cuenta que el 'Commit inicial' es una confirmación vacía sin archivos, por lo que no se deje engañar. El compromiso C5 es en realidad el primer compromiso basado en contenido.

+1

esto fue tremendamente útil. ¡Gracias! – sly

+0

Me alegro de poder ayudar. –

+1

¡otra gracias! – Benoit

Cuestiones relacionadas