Eu tenho um ramo chamado dmgr2 (desenvolvimento) e quero extrair do ramo mestre (site ativo) e incorporar todas as alterações no meu ramo de desenvolvimento. Existe uma maneira melhor de fazer isso? Aqui está o que eu planejava fazer, depois de fazer alterações:
git checkout dmgr2
git pull origin master
isso deve puxar as alterações dinâmicas para o meu ramo de desenvolvimento, ou eu entendi errado?
dev
ramificar com agit checkout dev
. Entãogit pull --rebase origin master
. Se você tiver sorte, não haverá conflitos e o dev terá as alterações mais recentes do master.Respostas:
As etapas listadas funcionarão, mas há uma maneira mais longa de oferecer mais opções:
O
fetch
comando pode ser feito a qualquer momento antes demerge
, ou seja, você pode trocar a ordem da busca e do checkout, porquefetch
apenas passa para o remote (origin
) e diz: "me dê tudo o que você tem ", ou seja, tudo confirma em todos os ramos. Eles são copiados para o seu repositório, mas com o nomeorigin/branch
de qualquer filial nomeadabranch
no controle remoto.Nesse ponto, você pode usar qualquer visualizador (
git log
,gitk
etc) para ver "o que eles têm" que você não possui e vice-versa. Às vezes, isso é útil apenas para Warm Fuzzy Feelings ("ah, sim, é de fato o que eu quero") e, às vezes, é útil para mudar completamente as estratégias ("whoa, eu não quero isso ainda").Finalmente, o
merge
comando leva o commit fornecido, que você pode nomear comoorigin/master
, e faz o que for necessário para trazer esse commit e seus ancestrais, para qualquer ramo em que você esteja quando executar omerge
. Você pode inserir--no-ff
ou--ff-only
impedir um avanço rápido ou mesclar apenas se o resultado for um avanço rápido, se desejar.Quando você usa a sequência:
o
pull
comando instrui o git a executargit fetch
e, em seguida, o equivalente moral degit merge origin/master
. Portanto, isso é quase o mesmo que executar as duas etapas manualmente, mas existem algumas diferenças sutis que provavelmente não são muito importantes para você. (Em particular, afetch
etapa executadapull
traz apenas a substituiçãoorigin/master
e ela não atualiza a ref no seu repo: 1 qualquer novo commit acaba sendo referido apenas pelaFETCH_HEAD
referência especial .)Se você usar a sequência mais explícita
git fetch origin
(em seguida, opcionalmente, procurar) e, em seguidagit merge origin/master
, também poderá atualizar seu próprio localmaster
com o controle remoto, com apenas umafetch
execução na rede:por exemplo.
1 Esta segunda parte foi alterada - digo "corrigida" - no git 1.8.4, que agora atualiza referências de "ramificação remota" oportunamente. (Foi, como dizem as notas de versão, uma decisão deliberada do projeto de ignorar a atualização, mas acontece que mais pessoas preferem que o git atualize. e, portanto, recuperável a partir do reflog, o que também permite um novo recurso git 1.9 / 2.0 para encontrar rebotes upstream.)
fonte
git checkout
normalmente não é destrutivo e normalmente não há motivo para desfazer umagit fetch
, por isso parece que você está perguntando como recuperar um commit de mesclagem. A resposta é a mesma que para outras confirmações: ougit reset
ougit revert
. Para alterações não publicadasgit reset
é geralmente o melhor método; para mudanças que outras pessoas já têm,git revert
pode ser melhor, mas consulte o conselho de Linus Torvald sobre a reversão de uma mesclagem: kernel.org/pub/software/scm/git/docs/howto/…gitk
,git log --graph
com ou sem--oneline
e assim por diante) e você podegit show
ou podegit show -m
confirmar ou usar uma mesclagemgit diff
. Em todos esses casos, você está especificando o programa ao inserir o comando na linha de comando.Situação : trabalhando em minha filial local, mas gosto de manter as atualizações na ramificação de desenvolvimento denominada
dev
.Solução : Normalmente, prefiro fazer:
fonte
Isso funcionou para mim. Para obter o código mais recente do master para o meu ramo
git rebase origin/master
fonte
git fetch origin
primeiro.Cenário :
Tenho atualização mestre e minha filial atualizando, quero que minha filial acompanhe o mestre com rebasing, mantenha todo o histórico rastreado corretamente, vamos chamar minha filial Mybranch
Solução :
(correção para o último estágio, cortesia de Tzachi Cohen, usar "-f" força o git a "atualizar o histórico" no servidor)
agora o ramo deve estar alinhado com o mestre e reformulado, também com atualização remota, portanto, no log do git, não há "behind" ou "ahead", basta remover todos os arquivos * .orig de conflito local para manter a pasta "limpa"
fonte