git: ¿una forma más fácil de hacer una calabaza simple de compromiso único?

El proyecto en el que estoy trabajando requiere que todas las contribuciones de las características sean compromisos únicos, pero aún así me gusta comprometer mi progreso en el path, por lo que generalmente aplasto mis compromisos a medida que los hago.

Digamos que estoy haciendo mi primer compromiso nuevo en la sucursal:

git commit -am "Added new feature" 

A partir de entonces, hasta que envíe mis cambios, lo haré:

 git commit -am "asdfasdasd" git rebase -i HEAD~2 

… y luego aplastar mis compromisos en rebase interactivo.

Hago esto de 10 a 20 veces al día, y parece una cantidad desproporcionadamente alta de pulsaciones de teclas para el efecto aparentemente simple que bash get. ¿Hay una forma mejor / más rápida / más fácil de get los mismos resultados? Si no hay un solo command mágico para hacer esto, entonces creo que lo que estoy buscando es la forma más eficiente. para extraer el compromiso más reciente del historial (¡sin descartar los cambios que contiene!), y simplemente confirmar de nuevo, lo que includeía los cambios de la confirmación revelada, así como los cambios de trabajo.

Use git commit --amend -am "message goes here" (o --amend -a el post de confirmación anterior es un buen punto de partida, o incluso simplemente --amend después de agregar manualmente, etc.). The – --amend toma esta historia de cometer git:

 ...-oXY <-- branch 

y en efecto hace un "restablecimiento suave" para hacer que la branch la label apunte a X modo que el padre del compromiso nuevo vuelva a ser X , lo que da como resultado este historial de compromiso:

  Y [no label, but still in reflog as branch@{1}] / ...-oXZ <-- branch 

Cuando haces tu commit-and-rebase, primero:

 ...-oXYZ <-- branch 

(el nuevo compromiso), entonces:

  YZ [no label, but still in reflog as usual] / ...-oXZ' <-- branch 

donde Z' es el compromiso de squash de Y y Z Entonces estos son diferentes, pero para sus propósitos, probablemente igualmente útiles.

La function de aplastamiento en un único compromiso tiene un valor dudoso. Un poco de recorte innecesario es útil. Perderá información importante acerca de por qué se realizó cada cambio y terminará con una burbuja posiblemente grande y difícil de revisar. Parte del punto de control de la versión es que cinco años más tarde alguien pueda responder la pregunta "¿por qué está aquí esta línea?" Y el aplastamiento pierde esa información. Si a las personas no les gusta revisar muchos cambios, pueden get el efecto squash con la git diff feature master sin perder información futura. Pero probablemente no puedas controlar eso.

Para mitigar este problema, tome la simple medida de trabajar en su function en una sucursal. Esto es algo que debería hacer casi siempre para evitar desorderar al maestro y empujar el trabajo parcialmente completado a otras personas. Trabaja normalmente, cometer normalmente. Cuando tu function esté completa, solo aplasta cuando se fusionen.

  • git checkout -b function / lo que sea
  • … trabajar y comprometerse normalmente …
  • GIT Checkout Master
  • git merge –squash característica / lo que sea
  • git commit

De esta forma tendrá todos los beneficios de una twig de características mientras trabaja, y puede seguir la política de squash.

¿Hay una forma mejor / más rápida / más fácil de get los mismos resultados?

No estoy seguro de si hay una manera más rápida / mejor / más fácil de hacer una calabaza, pero estoy bastante seguro de que otra gran solución para arreglar esto es:

  • V1 usando la bandera --squash de git merge .
  • Restablecimiento de software V2 y confirmación
  • V3 escribe un alias o un script para hacer el trabajo por ti

V1.

En primer lugar, debes restablecer los últimos X commits ( git reset --hard HEAD~3 ) y luego aplicar git merge --squash HEAD@{1} porque HEAD@{1} es donde estaba la twig antes del command anterior.

V2

Puedes comprobar V2, probablemente encontrarás esto más orderado: git reset --soft HEAD~3 && git commit pero personalmente no me gusta.

V3

Por supuesto, hay un escenario donde puedes escribir un alias y automatizar todo el process. Probablemente encontrarás esto útil:

  1. ¡MEJOR !: https://coderwall.com/p/-p2gla
  2. https://github.com/mozilla/pdf.js/wiki/Squashing-Commits
  3. http://inputvalidation.blogspot.ro/2010/12/automatic-squashing-of-last-git-commits.html