2011-09-07 8 views
8

Cuando escribo el código en local, en algún momento confirmo el código que aún no está limpio, o con un mensaje desagradable como revisión temporal.¿Hay algún comando de Git que combine todos nuestros feos commits en uno solo?

Sin embargo, cuando quiero mi código para combinar con los demás, me gustaría única instantánea final que el otro puede ver, (oculta las revisiones que se ven feos)

Ex. I tenedor 0 a mi repositorio local, hago cambio y de prueba y se comprometen con código impuro

0-> 1-> 2-> 3-> 4-> 5-> 6 (código final)

cuando los demás extraen el código, ¿es posible hacer que otros vean solo el estado final? y no ver el árbol de 1..5

Quiero usuarios verán como

0 -------------------> 6

Una forma en que puedo pensar, es hacer un archivo de parche, pero no es lo suficientemente bueno si hay algún archivo que deba eliminarse o crearse.

+0

http://stackoverflow.com/questions/5308816/how-to-use-git-merge-squash – Gerry

Respuesta

-1

utilizo respuesta de @ mark-Longair y @ Charles-Baily a hacer mi trabajo

Let decir que tengo rama ...

master : A --> B --> C 
feature : \-->D --> E --> F 

primera forma, trabajando el directorio es la rama 'característica'

git reset --soft <A-hash> 
git commit -m 

No veremos ningún compromiso anterior en todo, tener que escribir el nuevo mensaje de confirmación

segunda forma, directorio de trabajo es 'característica' rama

git rebase -i 

del editor, el cambio de recoger a calabaza (o s de corto) para todas las confirmaciones, excepto la primera

pick 00bb6f9 D 
s 4a251d9 E 
s 6047df8 F 

Listo. De esta forma, mostrará el mensaje de confirmación anterior que podemos editar como confirmación final.

2

Sí, use git rebase -i, y aplane las confirmaciones. Consulte this para obtener más información y algunos ejemplos.

4

Puede usar reset --soft para comprimir varias confirmaciones en una única y nueva confirmación de limpieza. Con su sucursal en el código final sin cambios por etapas que puede hacer:

git reset --soft <sha1-of-0> 
git commit 

Cuando git commit indicaciones, dar un mensaje claro cometer describir están introduciendo los cambios completos.

2

Suponiendo que todavía no haya presionado sus confirmaciones con el control remoto, existen varias formas de hacerlo.

Una opción es utilizar

git rebase -i 

que le da el editor interactivo de rebase. A continuación, puede marcar todas las confirmaciones excepto la última como 'squash'

3

La forma más flexible de hacer esto es hacer una rebase interactiva para comprimir juntas o modificar sus confirmaciones. Sin embargo, debe tener cuidado de no reescribir ningún historial que ya sea público. Por ejemplo, si está trabajando en la rama master y desea reescribir y linealizar todas las confirmaciones que no están en origin/master (lo que normalmente significa el trabajo que aún no ha realizado), puede hacerlo:

git rebase -i origin/master 

Eso abrirá un editor de texto donde se muestra cada confirmación que tiene que no está en origen/maestro, de la más antigua a la más reciente. Si desea combinar cualquier confirmación con la anterior, puede simplemente cambiar el inicio de la línea de pick a squash. O bien, si desea modificar ese compromiso de alguna manera, puede cambiar pick al edit.

El uso de rebase interactiva es la forma más flexible de hacer lo que usted solicita, y es una herramienta muy útil para conocer, pero en la situación exacta que describe, probablemente sea excesivo. Primero, verifique que la salida de git status esté limpia, de modo que esté seguro de que su área de transición representa el mismo estado que HEAD.A continuación, puede hacer un "reinicio por software" de nuevo en 0, que restablece HEAD a esa confirmación, pero deja su árbol de trabajo y su índice (es decir, el área de ensayo) intactos. Si luego realiza una confirmación, su índice se usará para crear una nueva confirmación con el mismo estado que 6, pero con 0 como padre. es decir

git status # Check that your status is clean 
git reset --soft 0 
git commit -m 'Work that is totally flawless' 
Cuestiones relacionadas