Eu faço um novo ramo master
com:
git checkout -b testbranch
Eu faço 20 commits nele.
Agora eu quero esmagar esses 20 commits. Eu faço isso com:
git rebase -i HEAD~20
E se eu não souber quantos commits? Existe alguma maneira de fazer algo como:
git rebase -i all on this branch
git
version-control
user3803850
fonte
fonte
git rebase -i 58333012713fc168bd70ad00d191b3bdc601fa2d
wich vai fazer um rebase interativo, onde o commitnumber é a última confirmação que permanece inalteradaRespostas:
Outra maneira de esmagar todos os seus commits é redefinir o índice para master:
Isso não é perfeito, pois implica que você sabe de qual ramificação "yourBranch" vem.
Nota: descobrir que o ramo de origem não é fácil / possível com o Git (a maneira visual geralmente é a mais fácil , como visto aqui ).
EDIT: você precisará usar
git push --force
Karlotcha Hoa acrescenta nos comentários :
fonte
YourBranch
está atualmente. Isto irá manterYourBranch
intacta quando você fazreset
git reset $(git merge-base master $(git rev-parse --abbrev-ref HEAD))
usar para usar automaticamente a filial em que está atualmente. E se você usar isso, também poderá usar um alias, pois o comando não depende do nome do ramo.git push --force
(e avise seus colegas se houver várias pessoas trabalhando nesse ramo)Faça check-out da ramificação para a qual você deseja compactar todas as confirmações em uma confirmação. Vamos dizer que é chamado
feature_branch
.git checkout feature_branch
Passo 1:
Faça uma redefinição suave
origin/feature_branch
com suamaster
filial local (dependendo de suas necessidades, você também pode redefinir com origem / mestre). Isso redefinirá todas as confirmações extras nofeature_branch
seu arquivo, mas sem alterar nenhuma alteração no seu arquivo localmente.git reset --soft master
Passo 2:
Adicione todas as alterações no diretório git repo ao novo commit que será criado. E comprometa o mesmo com uma mensagem.
git add -A && git commit -m "commit message goes here"
fonte
-f
bandeira.O que você está fazendo é propenso a erros. Apenas faça:
que rebase automaticamente apenas as confirmações de sua filial no mestre mais recente atual.
fonte
commit -am "the whole thing!"
reset origin/master
método é realmente ruim, pois é o mesmo que fazer confirmações diretamente no master - não há histórico de 'junção de ramo', nenhuma opção de solicitação de recebimento. A resposta por @WaZaA é muito mais de acordo com git normal de fluxo de trabalho eu achoOutra maneira simples de fazer isso: vá no ramo de origem e faça a
merge --squash
. Este comando não faz o commit "esmagado". quando você fizer isso, todas as mensagens de confirmação do yourBranch serão coletadas.fonte
Supondo que você estava ramificação do mestre, você não precisa entrar
yourBranch
na etapa de reset o tempo todo:Explicação :
git rev-list --count HEAD ^master
conta as confirmações desde que você fez sua ramificação de recursos do mestre, por exemplo, 20git reset --soft HEAD~20
fará uma redefinição suave dos últimos 20 commits. Isso deixa suas alterações nos arquivos, mas remove as confirmações.Uso :
No meu .bash_profile, adicionei um alias para
gisquash
fazer isso com um comando:Após redefinir e confirmar, você precisa fazer a
git push --force
.Dica :
Se você estiver usando o Gitlab> = 11.0, não precisará mais fazer isso, pois ele tem uma opção de esmagamento ao mesclar ramificações.
fonte
Com base na leitura de várias perguntas e respostas do Stackoverflow sobre esmagamento, acho que este é um bom argumento para esmagar todos os commits em um ramo:
Isso supõe que o mestre seja o ramo base.
fonte
Solução para pessoas que preferem clicar:
Instale o sourcetree (é grátis)
Verifique como são os seus commits. Provavelmente você tem algo semelhante a este
Clique com o botão direito do mouse em commit pai . No nosso caso, é o ramo principal.
Você pode esmagar o commit com o anterior clicando em um botão. No nosso caso, temos que clicar duas vezes. Você também pode alterar a mensagem de confirmação
Os resultados são impressionantes e estamos prontos para avançar!
Nota lateral: Se você estava enviando suas confirmações parciais para o controle remoto, você deve usar o push forçado após o squash
fonte
Outra solução seria salvar todos os logs de confirmação em um arquivo
git log> branch.log
Agora branch.log terá todos os IDs de confirmação desde o início. Role para baixo e pegue o primeiro commit (isso será difícil no terminal) usando o primeiro commit
git reset --soft
todas as confirmações serão esmagadas
fonte
A redefinição do Git, como mencionado em muitas respostas anteriores, é de longe a melhor e mais simples maneira de alcançar o que você deseja. Eu o uso no seguinte fluxo de trabalho:
(no ramo de desenvolvimento)
fonte
Todo esse git reset, rígido, suave e tudo o mais mencionado aqui provavelmente está funcionando (não funcionou para mim) se você executar as etapas corretamente e algum tipo de gênio.
Se você é o Joe smo médio, tente o seguinte:
Como usar o git merge --squash?
Salvei minha vida, e vou ser a minha squash, usei isso 4 vezes desde que descobri. Simples, limpo e basicamente 1 comamnd. Resumindo:
se você estiver em uma ramificação, vamos chamá-la de "my_new_feature" e desenvolva e sua solicitação de recebimento tem 35 confirmações (ou muitas) e você deseja que seja 1.
A. Certifique-se de que sua ramificação esteja atualizada, Continue desenvolva, obtenha as últimas e mescle e resolva quaisquer conflitos com "my_new_feature"
(esta etapa realmente deve ser executada assim que possível o tempo todo)
B. Receba as últimas novidades sobre o desenvolvimento e ramifique para uma nova ramificação: "my_new_feature_squashed"
C. magia está aqui.
Você quer levar o seu trabalho de "my_new_feature" para "my_new_feature_squashed"
Então, basta fazer (enquanto em seu novo ramo criamos o develop):
git merge --squash my_new_feature
Todas as suas alterações agora estarão em seu novo ramo, fique à vontade para testá-lo e faça apenas um único commit, push, novo PR desse ramo - e aguarde a repetição no dia seguinte.
Você não gosta de codificar? :)
fonte
Você pode usar a ferramenta que eu criei especificamente para esta tarefa:
https://github.com/sheerun/git-squash
Basicamente, você precisa ligar
git squash master
e prontofonte