Eu tenho um servidor Git remoto, aqui está o cenário que eu quero executar:
Para cada bug / recurso, crio um ramo Git diferente
Continuo confirmando meu código nesse ramo do Git com mensagens não oficiais do Git
No repositório superior, precisamos fazer um commit para um bug com a mensagem oficial do Git
Então, como posso mesclar minha ramificação para ramificação remota para que eles obtenham apenas uma confirmação para todos os meus check-ins (eu quero fornecer uma mensagem de confirmação para isso)?
git
git-merge
git-squash
SunnyShah
fonte
fonte
git merge --squash
faz tudo na linha de comando de uma só vez e você só espera que funcione.git rebase -i
abre um editor e permite ajustar a rebase. É mais lento, mas você pode ver o que está fazendo. Além disso, há diferenças entre rebase e mesclagem que são um pouco envolvidas demais para serem abordadas em um comentário.merge --squash
do antigo para o novo e mescle o novo ramo para dominar. O antigo ramo se torna obsoleto.Respostas:
Digamos que seu ramo de correção de bugs seja chamado
bugfix
e você deseja mesclá-lo emmaster
:Isso pegará todos os commits do
bugfix
branch, esmagará-os em 1 commit e os mesclará com omaster
branch.Explicação :
Muda para o seu
master
ramo.Retira todas as confirmações da
bugfix
ramificação e a mescla com sua ramificação atual.Cria um único commit a partir das alterações mescladas.
Omitir o
-m
parâmetro permite modificar uma mensagem de confirmação de rascunho que contém todas as mensagens de suas confirmações esmagadas antes de finalizar sua confirmação.fonte
git commit
(sem-m
param) e poderá modificar uma mensagem de confirmação elaborada contendo todas as mensagens de confirmação que você esmagou.git commit --amend -m '...'
mais tarde.git commit
não mostrará mais a útil mensagem de confirmação contendo todas as mensagens de confirmação que você esmagou. Nesse caso, tentegit commit --file .git/SQUASH_MSG
(via stackoverflow.com/a/11230783/923560 ).git commit -a --author="Author" --message="Issue title #id"
git merge --squash
permite criar uma única confirmação em cima da ramificação atual, cujo efeito é o mesmo que mesclar outra ramificação. Mas ele não produzirá o registro de mesclagem, o que significa que sua solicitação de recebimento como resultado não teria alterações, mas não será marcada como mesclada! Portanto, você precisará apenas excluir o ramo a ser executado.O que finalmente esclareceu isso para mim foi um comentário mostrando que:
é o equivalente a fazer:
Quando eu quero mesclar um ramo de recurso com confirmações 105 (!!) e colocá-los todos compactados em um, não quero
git rebase -i origin/master
porque preciso resolver separadamente conflitos de mesclagem para cada confirmação intermediária (ou pelo menos as que o git não consegue descobrir por si mesmo). Usargit merge --squash
me dá o resultado que eu quero de um único commit para mesclar um ramo de recurso inteiro. E, eu só preciso fazer no máximo uma resolução manual de conflitos.fonte
git merge master
e somente depoisgit merge --squash feature
no ramo mestre.git merge --squash feature
no ramo mestre?Você deseja mesclar com a opção squash. Ou seja, se você quiser fazer um ramo por vez.
Se você deseja mesclar todas as ramificações ao mesmo tempo que as confirmações únicas, primeiro rebase de forma interativa e esmague cada recurso e, em seguida, junte polvo:
Squash em um commit e repita para os outros recursos.
Essa última mesclagem é uma "mesclagem de polvo" porque está mesclando muitos ramos ao mesmo tempo.
Espero que isto ajude
fonte
Se você já tem
git merge bugfix
emmain
, você pode esmagar sua mala comprometer em um com:fonte
git reset --soft HEAD^1
parece desfazer a última confirmação executada antes da mesclagem, pelo menos no caso de a mesclagem ser um avanço rápido.git reset --soft HEAD^<number-of-commits-to-squash>
.Mesclar
newFeature
ramificaçãomaster
com uma confirmação personalizada:Se sim, você faz
git merge --squash newFeature && git commit
você receberá uma mensagem de confirmação que incluirá todas as
newFeature
confirmações de ramificação, que você pode personalizar.Explico-o aqui: https://youtu.be/FQNAIacelT4
fonte
Sei que esta pergunta não é especificamente sobre o Github, mas como o Github é tão amplamente usado e esta é a resposta que eu estava procurando, vou compartilhá-la aqui.
O Github tem a capacidade de realizar mesclagens de squash, dependendo das opções de mesclagem ativadas para o repositório.
Se a mesclagem de squash estiver ativada, a opção "Squash e mesclagem" deve aparecer no menu suspenso no botão "Mesclar".
fonte
Suponha que você trabalhou no recurso / tarefa1 com várias confirmações.
Vá para o ramo do seu projeto (projeto / meu_projeto)
Crie uma nova ramificação (feature / task1_bugfix)
Marge com a
--squash
opçãoCrie uma única confirmação
Empurre seu ramo
fonte
Para Git
Crie um novo recurso
via Terminal / Shell:
Isso não confirma, permite que você revise primeiro.
Em seguida, confirme e finalize o recurso desse novo ramo e exclua / ignore o antigo (o que você fez no desenvolvimento).
fonte
se você receber um erro: Não é possível confirmar porque você possui arquivos não mesclados.
corrigido todos os arquivos de conflito
você também pode usar
fonte
Para esmagar sua filial local antes de pressioná-la:
faça o check-out da filial em questão para trabalhar, se ainda não estiver em check-out.
Encontre o sha do commit mais antigo que você deseja manter.
Crie / efetue o check-out de uma nova ramificação (tmp1) a partir dessa confirmação.
git checkout -b tmp1 <sha1-of-commit>
Mesclar o ramo original no novo esmagamento.
git merge --squash <original branch>
Confirme as alterações que foram criadas pela mesclagem, com uma mensagem de confirmação resumida.
git commit -m <msg>
Faça o checkout do ramo original que você deseja esmagar.
git checkout <branch>
Redefina para o commit original que você deseja manter.
git reset --soft <sha1>
Rebase esse ramo com base no novo ramo tmp1.
git rebase tmp1
É isso aí - agora exclua o ramo tmp1 temporário quando tiver certeza de que está tudo bem.
fonte
Você pode usar a ferramenta que eu criei para facilitar esse processo: git-squash . Por exemplo, para esmagar todas as confirmações na ramificação de recurso ramificada da ramificação principal, escreva:
fonte