Por que o git diz "Pull não é possível porque você possui arquivos não mesclados"?

195

Quando tento extrair o diretório do meu projeto no terminal, vejo o seguinte erro:

harsukh@harsukh-desktop:~/Sites/branch1$ git pull origin master
U app/config/app.php
U app/config/database.php
U app/routes.php
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>'
as appropriate to mark resolution, or use 'git commit -a'.

Por que o git diz "Pull is not possible because you have unmerged files"e como posso resolvê-lo?

Harsukh Makwana
fonte
1
No meu caso, acabei de usar esses comandos "git add". então "git commit -m" Test "e no final" git push "Erro removido
Akhzar Nazir
Você simplesmente precisava adicionar "$ git add <file>" ... para atualizar o que será confirmado ou restaurado (para descartar as alterações no diretório de trabalho), depois confirmar "$ git commit" e "$ git push" para concluir a mesclagem.
find_X 29/11/19
Caso isso ajude: notei que apenas fazendo "git add". então cometer não funcionou. Eu tive que adicionar o arquivo individual pelo nome, depois confirmar e puxar / empurrar.
ouonomos 10/03

Respostas:

212

O que está acontecendo atualmente é que você possui um determinado conjunto de arquivos que tentou mesclar anteriormente, mas eles geraram conflitos de mesclagem. Idealmente, se alguém tiver um conflito de mesclagem, ele deve resolvê-los manualmente e confirmar as alterações usando git add file.name && git commit -m "removed merge conflicts". Agora, outro usuário atualizou os arquivos em questão em seu repositório e transferiu suas alterações para o repositório upstream comum.

Acontece que seus conflitos de mesclagem (provavelmente) da última confirmação não foram resolvidos; portanto, seus arquivos não são mesclados corretamente e, portanto, o sinalizador U( unmerged) para os arquivos. Então agora, quando você faz um git pull, o git está exibindo o erro, porque você tem alguma versão do arquivo, que não foi resolvida corretamente.

Para resolver isso, você precisará resolver os conflitos de mesclagem em questão e adicionar e confirmar as alterações antes de poder fazer a git pull.

Reprodução de amostra e resolução do problema:

# Note: commands below in format `CUURENT_WORKING_DIRECTORY $ command params`
Desktop $ cd test

Primeiro, vamos criar a estrutura do repositório

test $ mkdir repo && cd repo && git init && touch file && git add file && git commit -m "msg"
repo $ cd .. && git clone repo repo_clone && cd repo_clone
repo_clone $ echo "text2" >> file && git add file && git commit -m "msg" && cd ../repo
repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone

Agora estamos no repo_clone e, se você fizer um git pull, isso gerará conflitos

repo_clone $ git pull origin master
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/anshulgoyal/Desktop/test/test/repo
 * branch            master     -> FETCH_HEAD
   24d5b2e..1a1aa70  master     -> origin/master
Auto-merging file
CONFLICT (content): Merge conflict in file
Automatic merge failed; fix conflicts and then commit the result.

Se ignorarmos os conflitos no clone e fizermos mais confirmações no repositório original agora,

repo_clone $ cd ../repo
repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone

E então fazemos um git pull, obtemos

repo_clone $ git pull
U   file
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>'
as appropriate to mark resolution, or use 'git commit -a'.

Observe que o fileagora está em um estado não imerso e, se fizermos um git status, podemos ver claramente o mesmo:

repo_clone $ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commit each, respectively.
  (use "git pull" to merge the remote branch into yours)

You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:      file

Portanto, para resolver isso, primeiro precisamos resolver o conflito de mesclagem que ignoramos anteriormente

repo_clone $ vi file

e defina seu conteúdo como

text2
text1
text1

e adicione-o e confirme as alterações

repo_clone $ git add file && git commit -m "resolved merge conflicts"
[master 39c3ba1] resolved merge conflicts
mu 無
fonte
1
Para completar, eu adicionaria a resposta de @ Pawan para usar 'git mergetool' para resolver conflitos. A penúltima etapa pode não ser muito prática ("resolva a mesclagem ... [definindo] ... seu conteúdo para: [algum texto]").
Inegavellyrob
Como alternativa, você pode mesclar usando os conselhos de @ user261. De qualquer maneira, acho que adicionar uma etapa sobre como mesclar em um sentido prático completaria essa resposta.
Inegavellyrob
3
Essa resposta funciona muito bem quando você tem conflitos simples para corrigir em arquivos únicos. Por exemplo, uma ou duas linhas de código diferentes. Se você tiver vários arquivos que foram modificados fortemente, essa é uma correção difícil. Mas isso leva à idéia de que, com o Git, você deve se comprometer frequentemente para evitar conflitos difíceis.
Vaughn D. Taylor
46

Você está tentando adicionar mais uma nova confirmação em sua filial local enquanto o diretório de trabalho não está limpo. Como resultado, o Git se recusa a fazer o pull. Considere os seguintes diagramas para visualizar melhor o cenário:

remoto: A <- B <- C <- D
local: A <- B *
(* indica que você possui vários arquivos que foram modificados, mas não confirmados.)

Existem duas opções para lidar com essa situação. Você pode descartar as alterações em seus arquivos ou retê-las.

Opção um: Jogue fora as alterações
Você pode usar git checkoutpara cada arquivo não mesclado ou git reset --hard HEADredefinir todos os arquivos em sua ramificação para HEAD. A propósito, HEAD em sua filial local é B, sem um asterisco. Se você escolher esta opção, o diagrama se tornará:

remoto: A <- B <- C <- D
local: A <- B

Agora, quando você puxa, pode avançar rapidamente sua ramificação com as alterações do mestre. Depois de puxar, seu ramo ficaria parecido com o mestre:

local: A <- B <- C <- D

Opção 2: Reter as alterações
Se você deseja manter as alterações, primeiro deseje resolver qualquer conflito de mesclagem em cada um dos arquivos. Você pode abrir cada arquivo no seu IDE e procurar os seguintes símbolos:

<<<<<<< HEAD
// sua versão do código
=======
// a versão do código do controle remoto
>>>>>>>

O Git está apresentando duas versões de código. O código contido nos marcadores HEAD é a versão da sua filial local atual. A outra versão é o que vem do controle remoto. Depois de escolher uma versão do código (e remover o outro código junto com os marcadores), você pode adicionar cada arquivo à sua área de preparação digitando git add. A etapa final é confirmar seu resultado digitandogit commit -m com uma mensagem apropriada. Nesse ponto, nosso diagrama se parece com o seguinte:

remoto: A <- B <- C <- D
local: A <- B <- C '

Aqui eu rotulei o commit que acabamos de fazer como C 'porque é diferente do commit C no controle remoto. Agora, se você tentar puxar, receberá um erro de avanço não rápido. O Git não pode reproduzir as alterações no controle remoto em sua ramificação, porque a ramificação e o controle remoto divergiram do commit B. ancestral comum. Nesse ponto, se você deseja puxar, pode fazer outro git mergeou git rebasesua ramificação no controle remoto.

Para dominar o Git, é necessário entender e manipular listas vinculadas unidirecionais. Espero que essa explicação faça você pensar na direção certa sobre o uso do Git.

Tim Biegeleisen
fonte
33

Existe uma solução simples para isso. Mas para isso você precisará primeiro aprender o seguinte

vimdiff

Para remover conflitos, você pode usar

git mergetool

O comando acima basicamente abre arquivo local, arquivo misto, arquivo remoto (3 arquivos no total), para cada arquivo em conflito. Os arquivos local e remoto são apenas para sua referência e, usando-os, você pode escolher o que incluir (ou não) no arquivo misto. E apenas salve e saia do arquivo.

Pawan Seerwani
fonte
2
Eu diria que o vimdiff não é necessário (você pode usar qualquer ferramenta de mesclagem / diff de sua escolha, como o WinMerge ou o FileMerge interno do OSX, etc.). Dito isto, este é um ótimo complemento para a resposta do @ mu.
Inegavellyrob
32

Se você não deseja mesclar as alterações e ainda assim deseja atualizar seu local, execute:

git reset --hard HEAD  

Isso redefinirá seu local com HEAD e, em seguida, puxe seu controle remoto usando git pull.

Se você já comprometeu sua mesclagem localmente (mas ainda não passou para remoto) e deseja revertê-la também:

git reset --hard HEAD~1 
Santosh
fonte
6

Se você deseja obter uma ramificação remota para executar localmente (por exemplo, para fins de revisão ou teste) e quando tiver $ git pullconflitos de mesclagem local:

$ git checkout REMOTE-BRANCH
$ git pull  (you get local merge conflicts)
$ git reset --hard HEAD (discards local conflicts, and resets to remote branch HEAD)
$ git pull (now get remote branch updates without local conflicts)
user5245397
fonte
5

Você tem alguns arquivos localmente que precisam ser mesclados antes de poder puxar. Você pode fazer o check-out dos arquivos e puxar para substituir os arquivos locais.

git checkout app/config/app.php app/config/database.php app/routes.php
git pull origin master
usuario
fonte
A mesclagem combina o conteúdo de dois arquivos. Atualmente, seus arquivos locais diferem dos do servidor remoto. A mesclagem deve ser feita no servidor remoto. Portanto, se você preparar seus arquivos editados e enviá-los, suas alterações serão adicionadas aos arquivos no repositório. Seus arquivos estarão sincronizados e você poderá puxar o projeto inteiro com outras alterações. Achei o livro de ajuda do git muito útil quando comecei a usar o git. Você pode encontrá-lo aqui: git-scm.com/book/en/Getting-Started
Nick
Note que eu não sou o OP. "Mesclar arquivos" é uma terminologia incorreta. Estritamente falando, você mescla confirmações, não arquivos.
Jb0bs
Ah sim, é verdade, minhas desculpas. Eu estava tentando dar uma resposta simples
Nick
Bem, se você tiver conflitos ao mesclar uma confirmação, sim, você terá arquivos conflitantes e não mesclados e precisará mesclá-los.
Edward Thomson
3

Passos a seguir:

step-1 : git reset --hard HEAD  (if you want to reset it to head)
step-2 : git checkout Master 
step-3 : git branch -D <branch Name>
(Remote Branch name where you want to get pull) 
step-4 : git checkout <branch name>
step-5 : git pull. (now you will not get any
error)

Obrigado, Sarbasish

Sarbasish Mishra
fonte
2

Havia o mesmo problema comigo.
No meu caso, as etapas são as seguintes:

  1. Removidos todos os arquivos que estavam sendo iniciados com o símbolo U (não imerso) . Como-

U   project/app/pages/file1/file.ts
U   project/www/assets/file1/file-name.html
  1. Código pull do mestre

$ git pull origin master
  1. Verificado o status

 $ git status

Aqui está a mensagem que apareceu -
e tem 2 e 1 comprometimento diferente cada, respectivamente.
(use "git pull" to merge the remote branch into yours)
Você tem caminhos não imersos.
(fix conflicts and run "git commit")

Caminhos não imersos:
(use "git add ..." para marcar a resolução)

both modified:   project/app/pages/file1/file.ts
both modified:   project/www/assets/file1/file-name.html
  1. Adicionadas todas as novas alterações -

    $ git add project/app/pages/file1/file.ts
project/www/assets/file1/file-name.html
  1. Confirmar alterações no cabeçalho

$ git commit -am "resolved conflict of the app."
  1. Empurrou o código -

$ git push origin master

Qual turno pode ser resolvido com esta imagem - insira a descrição da imagem aqui

S.Yadav
fonte
1

Quando ocorre um conflito de mesclagem, você pode abrir um arquivo individual. Você receberá os símbolos "<<<<<<< ou >>>>>>>". Referem-se às suas alterações e às alterações presentes no controle remoto. Você pode editar manualmente a peça necessária. depois disso, salve o arquivo e faça: git add

Os conflitos de mesclagem serão resolvidos.

dfordevy
fonte
-1

Basta executar este comando:

git reset --hard
Grace Green
fonte
3
Você deve explicar o que o comando faz, porque algumas pessoas vão ser muito desapontado se tentar descobrir o que suprimiu todos os seus atuais mudanças locais: /
Joseph Budin
Isso funciona se você apenas copiar suas alterações em uma fonte temporária externa. Se você tiver apenas alguns arquivos, por exemplo, arquivos de configuração para um projeto, é perfeito. Execute o comando e, em seguida, reverta suas alterações. Funciona para mim!
Cwiggo