Atualizar
Eu fiz um pseudônimo git squash-all
.
Exemplo de utilização : git squash-all "a brand new start"
.
[alias]
squash-all = "!f(){ git reset $(git commit-tree HEAD^{tree} -m \"${1:-A new start}\");};f"
Embargo : lembre-se de fornecer um comentário, caso contrário, a mensagem de confirmação padrão "Um novo começo" seria usada.
Ou você pode criar o alias com o seguinte comando:
git config --global alias.squash-all '!f(){ git reset $(git commit-tree HEAD^{tree} -m "${1:-A new start}");};f'
One Liner
git reset $(git commit-tree HEAD^{tree} -m "A new start")
Nota : aqui "A new start
" é apenas um exemplo, fique à vontade para usar seu próprio idioma.
TL; DR
Não há necessidade de esmagar, use git commit-tree
para criar um commit órfão e siga em frente.
Explicar
crie uma única confirmação via git commit-tree
O que git commit-tree HEAD^{tree} -m "A new start"
faz é:
Cria um novo objeto de confirmação com base no objeto em árvore fornecido e emite o novo ID do objeto de confirmação no stdout. A mensagem de log é lida a partir da entrada padrão, a menos que sejam fornecidas as opções -m ou -F.
A expressão HEAD^{tree}
significa o objeto de árvore correspondente a HEAD
, ou seja, a ponta do seu ramo atual. veja Árvore-objetos e commit-Objects .
redefinir a ramificação atual para o novo commit
Em seguida, git reset
basta redefinir a ramificação atual para o objeto de confirmação recém-criado.
Dessa forma, nada no espaço de trabalho é tocado, nem há necessidade de rebase / squash, o que o torna muito rápido. E o tempo necessário é irrelevante para o tamanho do repositório ou a profundidade do histórico.
Variação: novo repositório a partir de um modelo de projeto
Isso é útil para criar o "commit inicial" em um novo projeto usando outro repositório como modelo / arquétipo / semente / esqueleto. Por exemplo:
cd my-new-project
git init
git fetch --depth=1 -n https://github.com/toolbear/panda.git
git reset --hard $(git commit-tree FETCH_HEAD^{tree} -m "initial commit")
Isso evita adicionar o repositório de modelo como um controle remoto ( origin
ou não) e recolhe o histórico do repositório de modelo no seu commit inicial.