Eu tenho um repositório git com 2 ramos: master e test.
Existem diferenças entre os ramos mestre e teste.
Ambas as ramificações têm todas as alterações confirmadas.
Se eu fizer:
mestre de verificação geral do git
teste git diff
Uma tela cheia de alterações aparece mostrando as diferenças. Quero mesclar as alterações na ramificação de teste e o mesmo:
teste de mesclagem git
Mas receba a mensagem "Já atualizado"
No entanto, examinar arquivos em cada ramificação diferente mostra claramente as diferenças.
Qual é o problema aqui e como resolvo isso?
Respostas:
A mensagem "Já atualizado" significa que todas as alterações da ramificação que você está tentando mesclar já foram mescladas à ramificação em que você está atualmente. Mais especificamente, significa que o ramo que você está tentando mesclar é o pai do seu ramo atual . Parabéns, essa é a fusão mais fácil que você já fez. :)
Use
gitk
para dar uma olhada no seu repositório. O rótulo do ramo "teste" deve estar em algum lugar abaixo do rótulo do ramo "mestre".Sua filial está atualizada em relação ao pai. De acordo com a mesclagem, não há novas alterações no pai desde a última mesclagem. Isso não significa que as ramificações são as mesmas, porque você pode ter muitas alterações em sua ramificação de trabalho e parece que sim.
Editar 10/12/2019:
Por Charles Drake, no comentário a esta resposta, uma solução para remediar o problema é:
Isso o traz de volta ao nível 'teste'.
Então faça:
para forçar as alterações de volta ao repositório central.
fonte
Isso geralmente acontece comigo quando eu sei que há alterações no mestre remoto, então tento mesclá-las usando
git merge master
. No entanto, isso não se mescla com o mestre remoto, mas com o mestre local.Portanto, antes de fazer a mesclagem, faça o checkout master e depois
git pull
lá. Então, você poderá mesclar as novas alterações em seu ramo.fonte
git fetch
iria atualizar o ramo principal, mesmo se eu estiver atualmente em um diferente. Acontece que não. Obrigado! Tenho certeza de que existe uma opçãofetch
que permite especificar qual ramificação obter.git fetch --all
, mas isso apenas busca os galhos, não os puxa.git fetch --all && git merge origin/master
. Não há necessidade de atualizar seu localmaster
para mesclar alterações remotas.git merge master
e 1 comgit merge origin/master
. Eu também tinha feito check-outmaster
egit pull
antes de atualizar 2 filiais. mesmo que eles tenham compartilhado o mesmo conteúdo, a criação de um PR entre os dois ramos mostrou alguns arquivos diff. Corrigigit pull
o ramo de destino no ramo de recursos, que mostrou:Already up to date! Merge made by the 'recursive' strategy.
isso resultou na consolidação de mesclagem sem alterações, mas removi os arquivos diff inesperados do PR. Alguma idéia de por que existe uma diferença entre mesclar filiais locais e remotas "equivalentes"?Digamos que você tenha uma ramificação
master
com o seguinte histórico de consolidação:Agora, você cria um teste de ramificação, trabalha nele e faz 4 confirmações:
master
A cabeça de D aponta para D e a cabeça de Dtest
aponta para H.A mensagem "Já atualizado" é exibida quando o HEAD da ramificação na qual você está mesclando é um pai da cadeia de confirmações da ramificação que você deseja mesclar. Esse é o caso, aqui:
D
é pai deE
.Não há nada para mesclar
test
paramaster
, pois nada mudoumaster
desde então. O que você quer fazer aqui é literalmente dizer ao Git que tenhamaster
a cabeça para apontar para H, para que o ramo do mestre tenha o seguinte histórico de confirmações:Este é um trabalho para o comando Git
reset
. Você também quer que o diretório de trabalho para reflectir esta alteração, então você vai fazer um disco de redefinição:fonte
git reset --hard
é uma coisa drástica de se fazer, ele pode perder commits? Existe uma maneira mais segura de fazer essas alterações ou os riscos degit reset --hard
superestimados?--hard
opção é o fato de que ele realmente modifica seu diretório de trabalho e, como conseqüência, você perde alterações não confirmadas. Pessoalmente, eu faço umgit status
antes e depois de cada comando git executado manualmente para garantir que meu repo esteja limpo ou no estado esperado.--hard
opção? Eu já estive nessa situação algumas vezes agora e sempre reinicio sem--hard
. Funcionou muito bem sem o risco de perder quaisquer alterações não confirmadas.O que funciona para mim, digamos que você tem branch1 e deseja mesclá-lo em branch2.
Você abre a linha de comando git, vá para a pasta raiz do branch2 e digite:
Se você tiver conflitos, não precisará executar git push, mas primeiro resolva os conflitos e, em seguida, pressione.
fonte
Isso deveria significar que as confirmações no teste já foram mescladas no mestre, mas, como outras confirmações são feitas no mestre,
git diff test
ainda assim haveria algumas diferenças.fonte
Isso acontece porque sua cópia local da ramificação que você deseja mesclar está desatualizada. Chamei meu ramo
MyBranch
e quero fundi-loProjectMaster
.Mas eu sei que existem mudanças que precisam ser mescladas!
Aqui está a coisa, quando eu digito
git merge ProjectMaster
, o git examina minha cópia local desse ramo, que pode não estar atual . Para ver se é esse o caso, primeiro digo ao Git para verificar se meus ramos estão desatualizados e buscar quaisquer alterações, se houver, usandofetch
. Então eu pulo para o ramo que quero mesclar para ver o que está acontecendo lá ...Ah-ha! Minha cópia local está obsoleta por 85 commits, o que explica tudo! Agora,
Pull
descrevo as alterações que estão faltando, depois pulo paraMyBranch
e tente a mesclagem novamente.E agora tenho outro problema para corrigir ...
fonte
Isso aconteceu comigo porque, estranhamente, o GIT achou que o ramo local era diferente do ramo remoto. Isso era visível no gráfico da ramificação: exibia duas ramificações diferentes: controles remotos / origem / nome_da_ ramificação e nome da ramificação.
A solução foi simplesmente remover o repositório local e cloná-lo novamente do controle remoto. Dessa forma, o GIT entenderia que controles remotos / origin / branch_name> e branch_name são realmente os mesmos, e eu poderia emitir o
git merge branch_name
.fonte
git merge origin/master
em vez disso,git merge master
trabalhou para mim. Portanto, para mesclar o mestre no ramo de recursos, você pode usar:fonte
Certifique-se de fazer o checkout do ramo que deseja mesclar primeiro e depois puxá-lo (para que sua versão local corresponda à versão remota).
Em seguida, faça o checkout de volta ao seu ramo em que você deseja fazer a mesclagem e sua mesclagem git deve funcionar.
fonte
git pull
enquanto estava no "branch"aconteceu comigo e foi enviado para esta página, não tendo certeza se eu tinha o mesmo cenário, mas o meu era eu tentando "mesclar novamente" essa ramificação "teste".
Portanto, eu o mesclei anteriormente, mas intencionalmente excluo algumas alterações específicas durante essa mesclagem, para que haja claramente alguma diferença entre os ramos. Eu estava tentando refazer a mesclagem porque percebi / esqueci que deveria e desejei adicionar uma alteração / arquivo específico que eu excluí anteriormente e esperava que, se eu fizesse uma mesclagem novamente, mostrasse todas as alterações excluídas antes , mas eu estava errado e recebo a mensagem "Já atualizado".
Ao ler o comentário / resposta de @ Bombe, ele está certo, e acho que o git se comporta dessa maneira, então o que fiz foi fazer um backup dos arquivos no ramo de teste, fazer check-out do ramo mestre e colar manualmente os arquivos nele e confirmar como se fossem novas mudanças.
não tenho certeza se esse é o caminho certo ou pode ajudar outras pessoas com o mesmo problema, mas forneceu uma solução para o meu caso em particular.
fonte
git checkout srcBranch -- path/to/file
. Também pode usar globs de arquivo.checkout srcBranch -- *
e, em seguida, olhou para meus diffsSe a mesclagem da ramificação A na ramificação B relatar "Já atualizado", o reverso nem sempre será verdadeiro. É verdade somente se o ramo B é descendente do ramo A, caso contrário, o ramo B simplesmente pode ter alterações que não estão em A.
Exemplo:
Nesse momento, a mesclagem dos relatórios A a B "Já está atualizada", mas as ramificações são diferentes porque a ramificação B tem atualizações do mestre, enquanto a ramificação A não.
fonte
Enfrentou esse cenário usando o Git Bash.
Nosso repositório possui várias ramificações e cada ramificação tem um ciclo de consolidação diferente e a mesclagem acontece de vez em quando. Old_Branch foi usado como pai de New_Branch
Old_Branch foi atualizado com algumas alterações que precisavam ser mescladas com New_Branch
Estava usando o comando pull abaixo sem nenhuma ramificação para obter todas as fontes de todas as ramificações.
Estranhamente, isso não tira todos os commits de todos os ramos. Tinha pensado assim, como o indicado mostra quase todos os ramos e tags.
Então, para corrigir isso, o Old_Branch retirou o mais recente usando
Agora check-out New_Branch
Puxou para ter certeza
E a viola conseguiu resolver conflitos de Old_Branch para New_Branch :), o que era esperado
fonte
O mesmo aconteceu comigo. Mas o cenário era um pouco diferente, eu tinha o ramo principal e eu criei o release_1 (digamos) dele. Fez algumas alterações no ramo release_1 e o fundiu na origem. então eu fiz o ssh e, no servidor remoto, saio novamente do release_1 usando o comando git checkout -b release_1 - que na verdade cria uma nova versão do ramo_! do mestre em vez de verificar a ramificação já existente release_1 de origem. Resolvido o problema removendo a opção "-b"
fonte
Eu tive o mesmo problema. Eu tive alterações no controle remoto e ele ainda estava mostrando "Já atualizado". Reclonar o repositório corrigiu o problema para mim.
fonte
Bobo, mas pode acontecer. Suponha que o nome da sua filial seja prefixado com uma referência de problema (por exemplo
#91-fix-html-markup
), se você fizer isso:não funcionará como pretendido, porque tudo depois do
#
é ignorado, porque#
inicia um comentário embutido.Neste caso, você pode renomear o omitindo ramo
#
ou usar aspas simples para cercar o nome de ramo:git merge '#91-fix-html-markup'
.fonte