24 votos

git: calabaza/reparación antes de cometer

Suponga que usted tiene:

A-B-C

Ahora la compilación/prueba falla. La corrección debe combinarse en el A. Mi flujo de trabajo actual es como esto:

$ git commit -m "fixA"

A-B-C-fixA

$ git rebase -i A~1

Y calabaza fixA en A, dan como resultado:

A'-B-C

Hay un comando para hacer algo como:

A-B-C + (index with fix for A)

$ git commit -supperdupper A 

Resultado:

A'-B-C

20voto

Jo Liss Puntos 6692

Muerto a los lectores: Si usted está buscando la solución más fácil para la fijación anterior se confirma, leer la pregunta! Se explica todo. Pero desde Elmarco estaba pidiendo una mancha de la forma, aquí vamos:

Como de Git 1.7.0, hay un --autosquash opción rebase, que hace lo que quiere. También existe la --fixup y --squash opciones para commit para hacer las cosas más fáciles. Con algo de aliasing probablemente, usted puede incluso conseguir todo en un solo comando.

Te sugiero actualizar a la más reciente de Git para el máximo pavor:

git/Documentation/RelNotes $ grep -i -A1 autosquash\\\|fixup *
1.7.0.txt: * "git rebase -i" learned new action "fixup" that squashes the change
1.7.0.txt-   but does not affect existing log message.
--
1.7.0.txt: * "git rebase -i" also learned --autosquash option that is useful
1.7.0.txt:   together with the new "fixup" action.
1.7.0.txt-
--
1.7.3.txt: * "git rebase -i" peeks into rebase.autosquash configuration and acts as
1.7.3.txt:   if you gave --autosquash from the command line.
1.7.3.txt-
--
1.7.4.txt: * "git commit" learned --fixup and --squash options to help later invocation
1.7.4.txt-   of the interactive rebase.
--
1.7.4.txt: * "git rebase --autosquash" can use SHA-1 object names to name which
1.7.4.txt:   commit to fix up (e.g. "fixup! e83c5163").
1.7.4.txt-

3voto

bkeepers Puntos 373

He creado algunos alias para que sea más fácil de usar el git commit --fixup y git commit --squash comandos en git 1.7. Agréguelas a su ~/.gitconfig :

[alias]
  fixup = !sh -c 'REV=$(git rev-parse $1) && git commit --fixup $@ && git rebase -i --autosquash $REV^' -
  squash = !sh -c 'REV=$(git rev-parse $1) && git commit --squash $@ && git rebase -i --autosquash $REV^' -

Uso:

$ git commit -am 'bad commit'
$ git commit -am 'good commit'

$ git add .          # Stage changes to correct the bad commit
$ git fixup HEAD^    # HEAD^ can be replaced by the SHA of the bad commit

El commit malo puede ser varios commits detrás.

3voto

Mika Eloranta Puntos 306

Mi actual git flujo de trabajo es tan --fixup/--squash intensivo, que me escribió una nueva git-fixup comando que se encarga de la mayoría de los molestos bits automáticamente:

  • git fixup muestra los archivos modificados que se agrupan bajo esta última se compromete a que toque la misma archivos
  • git fixup -a compromete a todos esos cambios como --fixup cambios con su correspondiente "padre" se compromete
  • git fixup -r hace un automáticas git rebase --autosquash de toda la corrección que se compromete

Muchos de los cambios son de tal magnitud que sólo los tres comandos anteriores son suficientes para hacer el trabajo, no copiar-pegar de cometer-id o de la lectura a través de la git log encontrar a la derecha --fixup objetivos.

Fuente: https://github.com/ohmu/git-crust

2voto

lanoxx Puntos 1407

Si desea aplastar lo dos últimos se compromete entonces tienes que invocar

git rebase --interactive <3rd last commit>

Deberá escoger el último commit y aplastar la confirmación de la segunda a la última. No puede aplastar el cometer más de una historia.

0voto

Martin OConnor Puntos 1877

Lo que están haciendo es peligroso si está compartiendo la rama en la que se están haciendo cambios con otras personas. En su caso, de la reescritura de cometer Una y cambio de base B y C en la parte superior de la nueva, que es Un objeto completamente nuevo. Cualquier persona que ya había tirado el viejo en sus repositorios podría terminar corrompiendo a sus repositorios como el de la historia en su repositorio tendrá "por arte de magia", se ha cambiado. Sus git no tendría forma de saber que la historia ha sido reescrito.

Debido a este hecho, el Git desarrolladores han intencionalmente no se hizo fácil como usted debe ser consciente de las consecuencias de hacer una operación de ese tipo.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X