Em uma tentativa de alcançar o nirvana do git, estou passando o dia aprendendo como aproveitar o rebase para situações em que atualmente faço a fusão.
Ao percorrer o que considero ser um fluxo git 101 (que explico abaixo), preciso fazer isso push --force
ao empurrar minhas alterações de volta à origem.
Eu não sou o único - eu sei que isso é um terreno coberto (ver 1 , 2 , 3 , 4 , 5 ), e entendo as razões técnicas pelas quais uma força é necessária. Meu problema é este --- há muitas (muitas) entradas de blog elogiando o rebase e como isso mudou suas vidas (ver 1 , 2 , 3 , 4 para listar alguns), mas nenhum deles menciona que push --force
faz parte do seu fluxo. No entanto, quase todas as respostas às questões de stackoverflow existentes dizem coisas como "sim, se você vai rebase, você tem que usar push --force
".
Dado o número e religiosidade dos defensores do rebase, tenho que acreditar que o uso de 'push --force' não é uma parte inerente de um fluxo de rebase e que, se alguém frequentemente tiver que forçar seus empurrões, eles estão fazendo algo errado .
push --force
é uma coisa ruim .
Então aqui está o meu fluxo. De que forma eu poderia alcançar os mesmos resultados sem uma força?
Exemplo Simples
Duas filiais:
- v1.0 - um branch de lançamento, contém apenas patches
- master - tudo para o próximo lançamento principal.
Eu tenho alguns commits de patch e alguns commits para o próximo lançamento.
Eu gostaria de incorporar os patches ao meu mestre para que eles não se percam no próximo lançamento. Pré-iluminação, eu simplesmente:
git checkout master
git merge v1.0
Mas agora estou tentando
git checkout master
git rebase v1.0
Então agora estou aqui:
Hora de:
git push
Sem dados.
fonte
@CodeGnome está certo. Você não deve realocar o master no branch v1.0, mas o branch v1.0 no master, isso fará toda a diferença.
Crie um novo branch que aponte para v1.0, mova esse novo branch para cima do master e então integre a nova versão dos patches V1.0 ao branch master. Você vai acabar com algo como:
Esta forma de usar o rebase é recomendada pela documentação oficial do git .
Acho que você está certo sobre
git push --force
: você só deve usá-lo se cometeu um erro e empurrou algo que não queria.fonte
master
e não se importam em mesclar o próprio branch de recursos, isso pode ser feito com:git checkout my-branch; git rebase master; git checkout master; git merge my-branch
Você tem que forçar o push se você rebase, e você já publicou suas alterações, certo?
Eu uso um monte de rebase, mas publico em algo privado onde um push forçado não importa (por exemplo: meu próprio clone no GitHub, como parte de uma solicitação pull), ou eu faço o rebase antes de fazer push pela primeira vez.
Este é o coração do fluxo de trabalho em que você usa rebase, mas não force muito o push: não publique coisas até que estejam prontas, não faça o rebase depois de empurrar.
fonte
rebase
puxou novas mudanças em seu branch de tópico, mas quando você completou as alterações daquele branch, vocêmerge
o branch de volta ao branch de desenvolvimento principal.Acho que há um bom caso de uso para esse padrão rebase-e-force-push que não é resultado de um push incorreto: trabalhar em um branch de recurso sozinho em vários locais (computadores). Eu faço isso com frequência, já que às vezes trabalho no escritório em meu desktop e às vezes em casa / local do cliente em meu laptop. Eu preciso fazer o rebase ocasionalmente para acompanhar o branch principal e / ou para tornar as fusões mais limpas, mas também preciso forçar o push quando deixo uma máquina para ir trabalhar em outra (onde eu apenas puxo). Funciona perfeitamente, contanto que eu seja o único trabalhando no galho.
fonte
Aqui está o que eu uso (assumindo que o nome do seu branch seja foobar ):
fonte
git
não é sem personalidadegit merge -s ours origin/<branch>
foi o que corrigiu para nóstl; dr mesclar com branches compartilhados, rebase com branches individuais.
--force-with-lease
é uma alternativa mais segura à força e deve ajudá-lo a alcançar o dito nirvana git sem a natureza destrutiva da força.Uma regra geral que vi funcionar para fluxos de trabalho de várias equipes é usar
merge
para branches compartilhados (ou seja, master ou development) e usarrebase
ao trabalhar em seu próprio branch de recurso. Aqui está um ciclo de vida típico de um ramo de recursoUma versão em inglês simples do que fizemos aqui:
force-with-lease
A 4ª etapa é MUITO importante e uma das principais razões pelas quais comecei a defender o uso de rebase.
force-with-lease
verifica o remoto para ver se algum novo commit foi adicionado. Se o seugit push
foi provado ser destrutivo, ele não vai empurrar!Espero que isso dê a alguém mais confiança para usar o rebase.
fonte