Essa questão diz respeito não apenas a como realizar essa tarefa, mas se é uma boa ou má prática com o Git.
Considere que localmente eu trabalho mais na ramificação principal, mas criei uma ramificação tópica que chamarei de "topical_xFeature". No processo de trabalhar em "topical_xFeature" e alternar entre fazer outros trabalhos na ramificação principal, verifica-se que fiz mais de um commit na ramificação "topical_xFeature", mas entre cada commit, não fiz nenhum empurrar.
Primeiro , você consideraria essa má prática? Não seria mais sensato manter um commit por ramificação por push? Em que casos seria bom ter vários commits em uma ramificação antes de um push ser feito?
Segundo , como melhor realizo a inserção de vários commit na ramificação topical_xFeature na ramificação mestre para um push? É um incômodo não se preocupar com isso e apenas fazer o push onde vários commits são empurrados, ou é menos irritante, de alguma forma, mesclar os commits em um e depois empurrar? Mais uma vez, como fazer isso?
fonte
git branch -d topic
. Por que o git não é capaz de identificar que todas as alterações foram mescladas?git branch -D topic
excluí-lo à força.É assim que geralmente sigo para combinar vários Commits em um único commit antes de enviar o código por push.
Para conseguir isso, sugiro que você use o conceito de ' squash ' fornecido pelo GIT.
Siga os passos abaixo.
1) git rebase -i master (em vez de master, você também pode usar um commit específico)
abra o editor interativo rebase, onde ele mostrará todos os seus commits. Basicamente, onde você precisa identificar as confirmações que deseja mesclar em uma única confirmação.
Imagine que esses são seus commits e mostrem algo assim no editor.
É importante observar que esses commits estão listados na ordem oposta à que você normalmente os vê usando o comando log. Significa que o commit mais antigo será mostrado primeiro.
2) Altere 'pick' para 'squash' para as últimas alterações confirmadas. algo como mostrado abaixo. Fazendo isso, seus dois últimos commits serão mesclados com o primeiro.
Você também pode usar o formato abreviado se tiver muitos commits para combinar:
para editar use 'i', ele permitirá que o editor seja inserido. Lembre-se de que a maioria das confirmações (mais antigas) não pode ser esmagada, pois não há confirmação anterior com a qual combinar. Portanto, ele deve ser escolhido ou 'p'. Use 'Esc' para sair do modo de inserção.
3) Agora, salve o editor com o seguinte comando. : wq
Quando você salva isso, você tem uma única confirmação que introduz as alterações das três confirmações anteriores.
Espero que isso ajude você.
fonte
git rebase -i HEAD~2
fosse um lugar útil para eu começar. Então esta resposta foi útil. Então, meugit status
show "Sua ramificação e 'origem / recurso / xyz' divergiram e têm 1 e 1 confirmações diferentes cada, respectivamente." Então, eu precisavagit push origin feature/xyz --force-with-lease
ver stackoverflow.com/a/59309553/470749 e freecodecamp.org/forum/t/…Primeiro : nada diz para você ter apenas uma confirmação por filial por envio: um envio é um mecanismo de publicação que permite publicar um histórico local (por exemplo, uma coleção de confirmações) em um repositório remoto.
Segundo : um
git merge --no-ff topical_xFeature
gravaria no master como um único commit do seu tópico de trabalho, antes de enviarmaster
.(Dessa forma, você fica
topical_xFeature
por aqui para mais evoluções, que podem ser gravadasmaster
como um único novo commit na próxima mesclagem --no-ff.Se livrar-
topical_xFeature
se do objetivogit merge --squash
é a opção certa, conforme detalhado em Brian Campbell da resposta .)fonte
--squash
não--no-ff
é o que você quer.--no-ff
criaria uma consolidação de mesclagem, mas também deixaria todas as confirmações detopical_xFeature
.topical_feature
branch por aí e apenas gravar um único commit nomaster
branch.Alterne para o ramo principal e verifique se está atualizado.
git fetch
isso pode ser necessário (dependendo da sua configuração do git) para receber atualizações sobre a origem / mestreMesclar o ramo do recurso no ramo mestre.
Redefina a ramificação principal para o estado de origem.
O Git agora considera todas as mudanças como mudanças não-estágios. Podemos adicionar essas alterações como uma confirmação. Adicionando. também adicionará arquivos não rastreados.
Ref: https://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit
fonte
Primeiro escolha qual commit você deseja que tudo ocorra.
Redefinir para a cabeça selecionada (eu escolhi
HEAD@{2}
)git status
(só pra ter certeza)Adicione seu novo commit
Nota:
HEAD@{0}
&HEAD@{1}
Agora estão mesclados em 1 confirmação, isso também pode ser feito para várias confirmações.git reflog
novamente deve exibir:fonte
Uma ferramenta para automatizar várias confirmações em um
como diz Kondal Kolipaka . Usando "git rebase -i"
A lógica do "git rebase"
Ao usar "git rebase -i", o git gera o arquivo git-rebase-todo no diretório .git / rebase-merge atual e chama o editor git para permitir que os usuários editem o arquivo git-rebase-todo para processamento. Portanto, a ferramenta precisa atender:
Modifique o editor git padrão
Portanto, a ferramenta precisa alterar o editor git e processar o arquivo git-rebase-todo. A ferramenta usando python abaixo:
Ref: https://liwugang.github.io/2019/12/30/git_commits_en.html
fonte