Estou tentando reprimir uma série de commits - HEAD to HEAD ~ 3. Existe uma maneira rápida de fazer isso ou preciso usar rebase --interactive?
git
interactive
rebase
squash
Phillip
fonte
fonte
Respostas:
Certifique-se de que sua árvore de trabalho esteja limpa, então
fonte
git reset --soft HEAD~3 && git commit -m "my message"
git config alias.mysquash '!f(){ git reset --soft HEAD~$1 && git commit ${2:+-m "$2"}; };f'
.git mysquash 3 'some message'
funcionará, mas eu também ajustei paragit musquash 3
omitir totalmente o sinalizador -m para que você obtenha agit commit
IU interativa nesse caso.Pessoalmente, gosto da solução de wilhelmtell :
No entanto, criei um alias com algumas verificações de erro para que você possa fazer isso:
Eu recomendo configurar aliases que realmente executem scripts para que seja mais fácil (a) codificar seus scripts e (b) fazer um trabalho mais complexo com verificação de erros. Abaixo está um script que faz o trabalho do squash e abaixo dele está um script para configurar seus aliases git.
Script para esmagar (squash.sh)
Então, para conectar aquele script squash.sh a um alias git, faça outro script para configurar seus aliases git como este ( create_aliases.command ou create_aliases.sh ):
fonte
$PATH
namedgit-squash.sh
e receberá automaticamente o alias degit squash
. Não mudei sua resposta, apenas para o caso de haver um motivo para usar ocreate-aiases.sh
script que não conheço.Para adicionar à resposta de wilhelmtell , acho conveniente fazer uma reinicialização suave para
HEAD~2
e, em seguida, alterar o commit deHEAD~3
:Isso irá mesclar todos os commits para o
HEAD~3
commit e usar sua mensagem de commit. Certifique-se de começar de uma árvore de trabalho limpa.fonte
Eu usei:
Funcionou muito bem. Só não tente ter um log de commit com uma linha que começa com "pick" :)
fonte
Use o seguinte comando para esmagar os últimos 4 commits dentro do último commit:
Com o alias:
De https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig
fonte
Aqui está uma linha para esmagar os últimos 2 commits. Neste exemplo, a mensagem do penúltimo commit será retida. Você pode alterar a mensagem como desejar.
Este comando será muito útil se você criar um alias para este comando e usar o alias em seu lugar.
fonte
Para esmagar tudo desde que o galho foi bifurcado do mestre:
fonte
--reedit-message=HEAD
irá usar a mensagem do último commit que não faz parte do squashing . Provavelmente não é o que você deseja. Em vez disso, para obter a mensagem do primeiro commit a ser incluído , (1) substituaHEAD
pelo hash do commit que você deseja que a mensagem, ou (2) pule para o primeiro commit a ser incluído egit commit --amend --reedit-message=HEAD
. Isso é o que a resposta harmoniosa faz.Você pode chegar bem perto com
Isso pressupõe que você está no mestre com um histórico linear. Não é bem um squash porque descarta os commits intermediários. Você precisaria alterar o novo HEAD para modificar a mensagem de confirmação.
fonte
HEAD~4
como pai.