Uso de git como intermediario de almacenamiento (y mantenimiento de un historial de logging rico y sensato)

Desarrollo en 4 máquinas, 1 en casa, 2 en el trabajo – windows / linux. A menudo quiero usar mi repository git solo para mover el código, código en flujo. Esto también cubre mi caso de uso para hacer una copy de security del código en un repository remoto respaldado por banda central.

No deseo dejar ningún comentario o insert el logging de compromiso cuando lo estoy usando para este propósito. En otras palabras, los loggings de confirmación solo deben representar deltas que son correcciones de function o error. Como git es una razor suiza, ¿cuáles son algunas de las forms de lograr mi caso de uso?

Si vas a demostrar el caso de uso, enumera los commands y algunos comentarios si hay múltiples enfoques.

Algún comentario de comprimir múltiples commits en uno solo en el historial de logging también sería útil, ya que he dejado un rastro de commit tal como está: D

editar

Si conoce forms complementarias (a las respuestas ya presentadas) de lograr dichos casos de uso, por favor proporcione una respuesta. Lo convertiré en una wiki comunitaria si hay muchas buenas respuestas.

Como dice la otra respuesta, es probable que desee crear una nueva twig para su trabajo en curso actual, ya que está cometiendo con tanta frecuencia. Esta twig es la que empuja y tira entre sus repositorys privados. Puede crear esa twig con:

git checkout -b wip master 

Luego, cuando quieras comprometerte, solo hazlo con un:

 git commit -m "Work in progress" 

… o algo similar.

Si está contento de que quiera agrupar todos los cambios en la twig wip en una única confirmación, puede hacer:

 git checkout master # Rather than create a merge commit or a fast-forward, stage the # effect that the merge would have to the tree: git merge --squash wip # Check that that looks sensible: git diff --cached # Now commit and write a proper commit message describing the changes: git commit 

Después de eso, deberías tener un único compromiso nuevo en el master que agrupa todos los cambios que hiciste en wip . Si haces lo mismo posteriormente, solo deberías get los cambios adicionales que la fusión introduciría como una única confirmación, por lo que no tienes que preocuparte por volver a utilizar wip . Por supuesto, puede haber algunos conflictos que resolver.


Creo que ese enfoque (usos sucesivos de git merge --squash wip ) funcionaría, pero, si fueras tú, probablemente no lo haría en la práctica. Eso es porque me gustaría dejar atrás las twigs temáticas para las nuevas características que decidí fusionar en master y poder ver esas fusiones. En cambio, probablemente tomaría un enfoque un poco más complicado:

  • Trabaja en la twig wip , creando muchos pequeños commits.
  • Deténgase cuando haya algunos cambios que tengan sentido lógico juntos y que puedan agruparse en commits y fusionarse en master.
  • Piense en un nombre para esa nueva function o cambio representado por esos cambios, por ejemplo, add-menu-bar .
  • Cree una nueva twig de trabajo en progreso basada en el wip actual, por ejemplo con: git checkout -b wip2
  • Utilice la database interactiva para reorderar y aplastar sus confirmaciones de modo que aquellos que formarán parte de add-menu-bar sean los primeros en la historia después de la divergencia del maestro: git rebase -i master . Tenga en count que esto está reescribiendo la nueva twig wip2 y deja la twig original wip como estaba.
  • Encuentre el nombre del object (SHA1sum) del último commit en esa twig que desea que esté en la twig de tema add-menu-bar , digamos que es f414f31 . A continuación, cree la twig de tema en esa confirmación: git branch add-menu-bar f414f31
  • Ahora fusione esa nueva twig de tema en master con git checkout master && git merge --no-ff add-menu-bar .
  • Empuje su nuevo master a cualquier lugar que necesite.
  • Regrese a wip2 y vuelva a wip2 base en el nuevo maestro: git checkout wip2 && git rebase master .

Ahora trabajas en la nueva twig wip2 lugar, y esa es la que empujas y tiras entre tus repositorys. La razón para crear una nueva twig de trabajo en progreso es que no tiene que preocuparse por la tarea de forzar la twig wip original a los otros repositorys, volver a configurar o restablecer la twig allí, etc., etc.

Puede crear una sucursal y pasar esa twig entre sus instancias. Cuando elimine la twig, desaparecerá. puedes usar git rebase -i para fusionar tus múltiples, fluxxy commits en un menor número de buenos commits. Puedes leer sobre esto en cualquier lugar.

Con git y rebase puede adquirir el hábito de comprometerse "todo el time", generalmente cada vez que algo funciona (o incluso si no funciona y quiere volver al estado "mal conocido"). Luego, cuando tengas algo cerca de hacer, puedes queuepsarlos en una única confirmación, o múltiples (si te tomas el time para asegurarte de que cada confirmación se sostenga por sí misma).


La forma habitual es git rebase -i HEAD~20 (donde 20 es el número de confirmaciones que desea realizar) y cambiar pick to squash donde desea combinar commits. Probablemente haya herramientas que harán esto automáticamente.

La function de bonificación de git, git bisect para descubrir qué compromiso de 10 líneas es el que te rompió. 🙂

squashing es probablemente lo que quieres

Puede squash commits en merge (incluye pull) o rebase (también interactivo)

 git merge --squash git rebase -i