Um novo ramo master
é criado, como chamamos test
.
Existem vários desenvolvedores que se comprometem master
ou criam outros ramos e depois se fundem master
.
Digamos que o trabalho test
esteja demorando vários dias e você deseja manter-se test
atualizado continuamente com confirmações dentro master
.
Eu faria git pull origin master
de test
.
Pergunta 1: Essa é a abordagem correta? Outros desenvolvedores poderiam ter trabalhado facilmente nos mesmos arquivos que eu trabalhei.
Meu trabalho test
está concluído e estou pronto para mesclá-lo novamente master
. Aqui estão as duas maneiras em que consigo pensar:
UMA:
git checkout test
git pull origin master
git push origin test
git checkout master
git pull origin test
B:
git checkout test
git pull origin master
git checkout master
git merge test
Eu não estou usando --rebase
porque, pelo que entendi, o rebase obterá as alterações master
e empilhará as minhas, portanto, poderá sobrescrever as alterações feitas por outras pessoas.
Pergunta 2: Qual desses dois métodos está correto? Qual a diferença aí?
O objetivo de tudo isso é manter minha test
ramificação atualizada com as coisas acontecendo master
e, mais tarde, eu poderia fundi-las novamente na master
esperança de manter a linha do tempo o mais linear possível.
Respostas:
Como eu faria isso
Se eu tenho uma filial local de uma remota, não me sinto à vontade para mesclar outras ramificações além desta com o remoto. Além disso, eu não pressionaria minhas alterações, até estar feliz com o que quero pressionar e também não pressionaria nada, que são apenas para mim e meu repositório local. Na sua descrição, parece que
test
é apenas para você? Portanto, não há razão para publicá-lo.O git sempre tenta respeitar as suas e as outras mudanças, e o fará
--rebase
. Eu não acho que posso explicar isso adequadamente, então dê uma olhada no livro Git - Rebasing ou pronto para git: Introdução a rebasing para uma pequena descrição. É um recurso bem legalfonte
git merge test
me dáfatal: 'test' does not point to a commit
. Eu tenho que procurargit log
o ponto de confirmação no ramo de teste, voltar para o ramo principal e, em seguida, fazergit merge 0f37d3154abbf52a4cbbbb5109f08af6a7567234
.test
deve existir. Claro, você pode usar o hash de confirmação, mas geralmente é mais fácil usar o nome da ramificação. Internamente, apenas recupera o hash doHEAD
ramo.Esta é uma pergunta muito prática, mas todas as respostas acima não são práticas.
Gostar
Essa abordagem tem dois problemas :
É inseguro, porque não sabemos se existem conflitos entre a ramificação de teste e a ramificação principal.
Ele "espremeria" todos os commits de teste em um commit de mesclagem no master; isto é, no ramo principal, não podemos ver todos os logs de alterações do ramo de teste.
Portanto, quando suspeitamos que haveria alguns conflitos, podemos ter as seguintes operações git:
Teste
merge
antescommit
, evite um commit rápido--no-ff
,Se um conflito for encontrado, podemos correr
git status
para verificar detalhes sobre os conflitos e tentar resolverDepois de resolvermos os conflitos, ou se não houver conflito, nós
commit
epush
elesMas dessa maneira perderá o histórico de alterações registrado na ramificação de teste e tornaria difícil a ramificação principal para outros desenvolvedores entenderem a história do projeto.
Portanto, o melhor método é o que devemos usar em
rebase
vez demerge
(suponha que, neste momento, resolvamos os conflitos de ramificação).A seguir, é apresentado um exemplo simples, para operações avançadas, consulte http://git-scm.com/book/en/v2/Git-Branching-Rebasing
Sim, quando você tiver concluído, todas as confirmações da ramificação Teste serão movidas para a cabeça da ramificação Mestre. O principal benefício do rebase é que você obtém um histórico de projeto linear e muito mais limpo.
A única coisa que você precisa evitar é: nunca use
rebase
em ramo público, como ramo mestre.Nunca faça operações como as seguintes:
Detalhes para https://www.atlassian.com/git/tutorials/merging-vs-rebasing/the-golden-rule-of-rebasing
apêndice:
fonte
Nem uma recuperação nem uma mesclagem devem substituir as alterações de ninguém (a menos que você opte por fazer isso ao resolver um conflito).
A abordagem usual durante o desenvolvimento é
Quando você estiver pronto para voltar ao master,
Se você está preocupado com a quebra de algo na mesclagem,
git merge --abort
existe para você.Usar push e pull como meio de mesclagem é bobagem. Também não sei por que você está empurrando o teste para a origem.
fonte
git stash
serve.Primeiro, tornaria o ramo a ser mesclado o mais limpo possível. Execute seus testes, verifique se o estado está como você deseja. Limpe os novos commits pelo git squash .
Além da resposta do KingCrunches , sugiro usar
Você pode ter feito muitas confirmações na outra ramificação, que deve ser apenas uma confirmação na ramificação principal. Para manter o histórico de confirmação o mais limpo possível, você pode compactar todos os seus commit no ramo de teste em um commit no ramo mestre (veja também: Git: Squash ou não squash? ). Em seguida, você também pode reescrever a mensagem de confirmação para algo muito expressivo. Algo fácil de ler e entender, sem se aprofundar no código.
editar: você pode estar interessado em
Então, no GitHub, acabo fazendo o seguinte para um ramo de recursos
mybranch
:Receba as últimas informações de origem
Encontre o hash da base de mesclagem:
Agora, verifique se apenas o primeiro é
pick
o restantes
:Em seguida, escolha uma boa mensagem de confirmação e envie para o GitHub. Faça a solicitação de recebimento então.
Após a mesclagem da solicitação pull, você pode excluí-la localmente:
e no GitHub
fonte
Tópico antigo, mas não encontrei o meu jeito de fazê-lo. Pode ser valioso para alguém que trabalha com rebase e deseja mesclar todas as confirmações de uma ramificação (recurso) sobre o mestre. Se houver um conflito no caminho, você poderá resolvê-los para cada confirmação. Você mantém controle total durante o processo e pode abortar a qualquer momento.
Atualize o Master e o Branch:
Mesclar ramificação sobre o mestre:
Opcional: Se você tiver conflitos durante o Rebase:
Primeiro, resolva o conflito no arquivo. Então:
Empurre seu ramo rebased:
Agora você tem duas opções:
Feito.
fonte
Esse é o fluxo de trabalho que eu uso no meu trabalho com a equipe. O cenário é como você descreveu. Primeiro, quando eu termino de trabalhar,
test
eu me refiz com o master para obter o que foi adicionado ao master durante o tempo em que trabalhei notest
ramo.git pull -r upstream master
Isso fará com que as alterações sejam dominadas desde que você bifurcou o
test
ramificação e as aplique e, em seguida, aplique as alterações feitas para testar "em cima" do estado atual do mestre. Pode haver conflitos aqui, se as outras pessoas fizeram alterações nos mesmos arquivos que você editou no teste. Se houver, você precisará corrigi-los manualmente e confirmar. Depois de fazer isso, será bom mudar para o ramo principal e entrartest
sem problemas.fonte
Após a mesclagem, se o arquivo for alterado, quando você o mesclar, ocorrerá o erro "Resolver conflito"
Então, primeiro você precisa resolver todos os seus conflitos, confirmar novamente todas as alterações e pressionar
É melhor fazer quem fez alterações no ramo de teste, porque ele sabia que mudanças ele fez.
fonte
Eu usaria o método rebase. Principalmente porque reflete perfeitamente seu caso semanticamente, ie. o que você quer fazer é atualizar o estado do seu ramo atual e "fingir" como se fosse baseado no mais recente.
Portanto, sem sequer verificar
master
, eu faria:Obviamente, apenas buscar a origem não atualiza o estado local
master
(pois não realiza uma mesclagem), mas é perfeitamente aceitável para o nosso propósito - queremos evitar a alternância, para economizar tempo.fonte
A resposta do @ KingCrunch deve funcionar em muitos casos. Um problema que pode surgir é que você pode estar em uma máquina diferente que precisa extrair as últimas informações do teste. Então, eu recomendo puxar o teste primeiro. A revisão é assim:
fonte
Você precisa fazer o check-out da ramificação para puxar, pois puxar significa mesclar no mestre e você precisa de uma árvore de trabalho para mesclar.
Não há necessidade de verificar primeiro; rebase faz a coisa certa com dois argumentos
Por padrão, o git push empurra todos os ramos existentes aqui e no controle remoto
fonte
Como o título diz "Melhor maneira", acho uma boa idéia considerar a estratégia de mesclagem de paciência .
De: https://git-scm.com/docs/merge-strategies
Uso:
Alias do Git
Eu sempre uso um alias para isso, por exemplo, execute uma vez:
Agora você pode fazer:
fonte
Este é do GitLab: basta seguir as instruções:
fonte
Responderei conforme desenvolver e destacar ramos,
se você estiver no ramo de recursos e precisar atualizá-lo com os comandos develop use abaixo: git checkout desenvolva git pull git checkout feature / xyz git merge develop
Agora, seu recurso está atualizado com o Develop. Você pode enviar suas alterações.
fonte