Git fundir relatórios “Já atualizados” embora haja uma diferença

Eu tenho um repository git com 2 filiais: master e test.

Existem diferenças entre os ramos mestre e teste.

Ambas as filiais têm todas as alterações confirmadas.

Se eu fizer:

 git checkout master 
teste de diff git

Uma canvas cheia de mudanças aparece mostrando as diferenças. Eu quero mesclar as alterações no ramo de teste e assim:

  teste de mesclagem do git 

Mas receba a mensagem “Já atualizada”

No entanto, examinar arquivos em cada ramificação mostra claramente as diferenças.

Qual é o problema aqui e como resolvo isso?

A mensagem “Já atualizada” significa que todas as alterações do ramo que você está tentando mesclar já foram mescladas ao ramo em que você está no momento. Mais especificamente, significa que o ramo que você está tentando mesclar é um pai de sua ramificação atual . Parabéns, essa é a mescla mais fácil que você já fez. 🙂

Use o gitk para dar uma olhada no seu repository. O label da ramificação “teste” deve estar em algum lugar abaixo do label da ramificação “principal”.

Sua filial está atualizada em relação a seus pais. De acordo com a mesclagem, não há novas alterações no pai desde a última mesclagem. Isso não significa que os ramos são os mesmos, porque você pode ter muitas mudanças em seu ramo de trabalho e parece que você faz.

Isso geralmente acontece quando eu sei que há mudanças no mestre remoto, então eu tento mesclá-las usando o git merge master . No entanto, isso não se mescla com o mestre remoto, mas com o mestre local.

Então, antes de fazer a mesclagem, checkout master, e depois git pull lá. Então você poderá mesclar as novas alterações em seu ramo.

Digamos que você tenha um branch master com o seguinte histórico de commits:

 A -- B -- C -- D 

Agora, você cria um teste de ramificação, trabalha nele e faz 4 commits:

 E -- F -- G -- H / A -- B -- C -- D 

a cabeça do master aponta para D, e a cabeça do test aponta para H.

A mensagem “Já atualizada” aparece quando o HEAD da ramificação em que você está mesclando é pai da cadeia de confirmações da ramificação que você deseja mesclar. Esse é o caso, aqui: D é pai de E

Não há nada para mesclar de test para master , já que nada mudou no master desde então. O que você quer fazer aqui é literalmente dizer ao Git para ter a cabeça do master apontando para H, então o branch do mestre tem o seguinte histórico de commits:

 A -- B -- C -- D -- E -- F -- G -- H 

Este é um trabalho para reset comando Git. Você também deseja que o diretório de trabalho reflita essa alteração, portanto, você fará uma reboot a frio:

 git reset --hard H 

Uma mesclagem é sempre entre o HEAD atual e um ou mais commits (geralmente, cabeça de ramificação ou tag),
e o arquivo de índice deve corresponder à tree de HEAD commit (ou seja, o conteúdo da última confirmação) quando ele for iniciado.
Em outras palavras, o git diff --cached HEAD deve reportar sem alterações.

O commit mesclado já está contido no HEAD . Este é o caso mais simples, chamado “Já atualizado”.

Isso deve significar que os commits no teste já estão mesclados no master, mas como outros commits são feitos no master, o git diff test ainda daria algumas diferenças.

Isso aconteceu comigo porque estranhamente o GIT achava que o ramo local era diferente do ramo remoto. Isso era visível no gráfico de ramificação: ele exibia duas ramificações diferentes: remotes / origin / branch_name e branch_name.

A solução foi simplesmente remover o repository local e cloná-lo novamente do remoto. Desta forma, o GIT entenderia que os remotes / origin / branch_name> e branch_name são realmente os mesmos, e eu poderia emitir o git merge branch_name .

 rm  git clone  cd  git checkout  git pull git checkout master git merge  

Se a mesclagem da ramificação A na filial B relatar “Já atualizada”, a reversão nem sempre é verdadeira. É verdade apenas 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:

  1. Você cria ramificações A e B fora do mestre
  2. Você faz algumas alterações no mestre e mescla essas alterações apenas na ramificação B (não atualizando ou esquecendo de atualizar a ramificação A).
  3. Você faz algumas alterações no ramo A e mescla A com B.

Neste ponto, mesclar os relatórios de A para B “Já está atualizado”, mas as ramificações são diferentes porque a ramificação B tem atualizações do mestre, enquanto a ramificação A não.

Enfrentou esse cenário usando o Git Bash.

Nosso repository tem várias ramificações e cada ramificação tem um ciclo de confirmação diferente e a mesclagem ocorre de vez em quando. Old_Branch foi usado como um pai para New_Branch

Old_Branch foi atualizado com algumas alterações que precisavam ser mescladas com New_Branch

Estava usando o comando abaixo pull sem qualquer ramificação para obter todas as fonts de todos os ramos.

origem do git pull

Estranhamente, isso não tira todos os commits de todos os branches. Pensei nisso assim como o indicado mostra quase todos os ramos e tags.

Então, para consertar isso tinha verificado o Old_Branch puxou o mais recente usando

git checkout Old_Branch

git puxar origem Old_Branch

Agora check-out New_Branch

git checkout New_Branch

Puxou para ter certeza

git puxar origem New_Branch

git merge Old_Branch

E viola tem conflitos para corrigir a partir de Old_Branch para New_Branch 🙂 que era esperado

Aconteceu comigo e foi enviado para esta página, não tenho certeza se eu tinha o mesmo cenário, mas o meu era eu tentando “re-mesclar” essa ramificação “teste”.

Então, eu já mesclei isso, mas excluo intencionalmente algumas alterações específicas durante essa mesclagem, portanto, há claramente diferenças entre as ramificações. Eu estava tentando re-mesclar porque eu percebi / esqueci que eu deveria ter e queria adicionar uma alteração / arquivo particular que eu havia excluído anteriormente e eu estava esperando que se eu fizesse uma mesclagem novamente mostraria todas as mudanças que eu excluí antes , mas eu estava errado e recebo a mensagem “Já atualizada”.

Ao ler o comentário / resposta do @ Bombe, ele está certo, e git acho que se comporta dessa maneira, então o que eu fiz foi fazer backup dos arquivos no branch de teste, então finalizar o branch master e manualmente colar os arquivos nele e commit como se fossem novas mudanças.

Não tenho certeza se este é o caminho certo ou se poderia ajudar outras pessoas com esse mesmo problema, mas forneceu uma solução para o meu caso particular.

Isso acontece porque sua cópia local da ramificação que você deseja mesclar está desatualizada. Eu tenho meu ramo, chamado MyBranch e quero mesclar isso no ProjectMaster .

 _>git status On branch MyBranch-Issue2 Your branch is up-to-date with 'origin/MyBranch-Issue2'. nothing to commit, working tree clean _>git merge ProjectMaster Already up-to-date. 

Mas eu sei que existem mudanças que precisam ser mescladas!

Aqui está a coisa, quando eu digito git merge ProjectMaster , git olha para minha cópia local desta ramificação, que pode não ser atual . Para ver se este é o caso, eu primeiro digo ao Git para checar e ver se minhas ramificações estão desatualizadas e buscar quaisquer mudanças, se assim for usando, uh, fetch . Então eu pulo no twig que quero mesclar para ver o que está acontecendo lá …

 _>git fetch origin _>git checkout ProjectMaster Switched to branch ProjectMaster **Your branch is behind 'origin/ProjectMaster' by 85 commits, and can be fast-forwarded.** (use "git pull" to update your local branch) 

Ah-ha! Minha cópia local é obsoleta por 85 commits, isso explica tudo! Agora, eu MyBranch para baixo as mudanças que estão faltando, em seguida, pule para MyBranch e tente a mesclagem novamente.

 _>git pull Updating 669f825..5b49912 Fast-forward _>git checkout MyBranch-Issue2 Switched to branch MyBranch-Issue2 Your branch is up-to-date with 'origin/MyBranch-Issue2'. _>git merge ProjectMaster Auto-merging Runbooks/File1.ps1 CONFLICT (content): Merge conflict in Runbooks/Runbooks/File1.ps1 Automatic merge failed; fix conflicts and then commit the result. 

E agora eu tenho outro problema para corrigir …

O que funciona para mim, digamos que você tenha branch1 e você queira mesclá-lo em branch2.

Você abre a linha de comando do git, vai para a pasta raiz do branch2 e digita:

 git checkout branch1 git pull branch1 git checkout branch2 git merge branch1 git push 

Se você tem comflicts você não precisa fazer git push, mas primeiro resolver os conflitos e depois empurrar.

O mesmo aconteceu comigo. Mas o cenário era um pouco diferente, eu tinha um branch master, e obtive o release_1 (digamos) disso. Fez algumas alterações na ramificação release_1 e fundiu-a na origem. então eu fiz o ssh e no servidor remoto eu novamente finalizo o release_1 usando o comando git checkout -b release_1 – que realmente esculpe um novo branch release_! do mestre, em vez de verificar a filial existente release_1 da origem. Resolvido o problema removendo o comutador “-b”

git merge origin/master vez disso o git merge master funcionou para mim. Então, para mesclar o mestre no ramo de resources, você pode usar:

 git checkout feature_branch git merge origin/master