tag remove crear git interactive rebase squash

remove - git rebase



¿Hay alguna manera de aplastar una cantidad de commits de forma no interactiva? (8)

Aquí hay un trazador de líneas para aplastar los últimos 2 commits. En este ejemplo, se conservará el mensaje de la segunda última confirmación. Puede cambiar el mensaje como lo desee.

git commit -am "$(git log -1 --skip=1 --pretty=%B | xargs && git reset --soft HEAD~2)"

Este comando será muy útil si crea un alias para este comando y usa el alias en su lugar.

Estoy intentando aplastar un rango de commits: HEAD to HEAD ~ 3. ¿Hay una forma rápida de hacerlo, o necesito usar rebase --interactive?


Asegúrate de que tu árbol de trabajo esté limpio, luego

git reset --soft HEAD~3 git commit -m''new commit message''


Para agregar a la respuesta de wilhelmtell encuentro conveniente reiniciar suavemente HEAD ~ 2 y luego modificar la confirmación de HEAD ~ 3:

git reset --soft HEAD~2 git commit --all --amend --no-edit

Esto fusionará todas las confirmaciones con la confirmación HEAD ~ 3 y usará su mensaje de confirmación. Asegúrese de comenzar desde un árbol de trabajo limpio.


Para aplastar todo, ya que la bifurcación se bifurcó desde el maestro:

git reset --soft $(git merge-base --fork-point master) / && git commit --verbose --reedit-message=HEAD --reset-author


Personalmente me gusta solución :

git reset --soft HEAD~3 git commit -m ''new commit message''

Sin embargo, hice un alias con alguna comprobación de errores para que pueda hacer esto:

git squash 3 ''my commit message''

Recomiendo configurar alias que realmente ejecutan scripts para que sea más fácil (a) codificar tus scripts y (b) hacer un trabajo más complejo con la comprobación de errores. A continuación se muestra un script que hace el trabajo de squash y luego debajo que es un script para configurar tus alias de git.

Script para aplastar (squash.sh)

#!/bin/bash # #get number of commits to squash squashCount=$1 #get the commit message shift commitMsg=$@ #regular expression to verify that squash number is an integer regex=''^[0-9]+$'' echo "---------------------------------" echo "Will squash $squashCount commits" echo "Commit message will be ''$commitMsg''" echo "...validating input" if ! [[ $squashCount =~ $regex ]] then echo "Squash count must be an integer." elif [ -z "$commitMsg" ] then echo "Invalid commit message. Make sure string is not empty" else echo "...input looks good" echo "...proceeding to squash" git reset --soft HEAD~$squashCount git commit -m "$commitMsg" echo "...done" fi echo exit 0

Luego, para conectar ese script squash.sh a un git alias, cree otro script para configurar sus alias de git como así ( create_aliases.command o create_aliases.sh ):

#!/bin/sh echo ''-----------------------'' echo ''adding git aliases....'' echo ''-----------------------'' echo git config --global alias.squash "!bash -c ''bash <path to scripts directory>/squash.sh /$1 /$2'' -" #add your other git aliases setup here #and here #etc. echo ''------------------------------------'' echo ''here is your global gitconfig file:'' echo ''------------------------------------'' more ~/.gitconfig echo echo echo ''----------------'' echo ''end of script...'' echo ''----------------''


Puedes acercarte bastante

git rebase --onto HEAD~4 HEAD~ master

Esto supone que estás en el maestro con una historia lineal. No es una calabaza porque descarta los compromisos intermedios. Debería modificar el nuevo HEAD para modificar el mensaje de confirmación.


Solía:

EDITOR="sed -i ''2,/^$/s/^pick/b/s/''" git rebase -i <ref>

Funcionó bastante bien. Simplemente no intente tener un registro de compromiso con una línea que comience con "elegir" :)


Use el siguiente comando para aplastar los últimos 4 commits dentro del último commit:

git squash 4

Con el alias:

squash = !"f() { NL=$1; GIT_EDITOR=/"sed -i ''2,$NL s/pick/squash/;/# This is the 2nd commit message:/,$ {d}''/"; git rebase -i HEAD~$NL; }; f" sq = !git squash $1 sqpsf = !git squash $1 && git psf

Desde https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig