Erro Git no commit após a mesclagem - fatal: não é possível fazer um commit parcial durante uma mesclagem

280

Corri um git pullque terminou em um conflito. Resolvi o conflito e agora está tudo bem (usei o mergetool também).

Ao confirmar o arquivo resolvido, git commit file.php -m "message"recebo o erro:

fatal: cannot do a partial commit during a merge.

Eu tive o mesmo problema antes e usar o -acommit funcionou perfeitamente. Acho que não é o caminho perfeito, porque não quero confirmar todas as alterações. Quero confirmar arquivos separadamente com comentários separados. Como eu posso fazer isso? Por que o git não permite que os usuários confirmem arquivos separadamente após uma mesclagem? Não consegui encontrar uma resposta satisfatória para esse problema.

pMan
fonte
5
E você sabe, procurar pelo git execute "confirmação completa" retorna quase nada de útil. Nenhum documento relevante das páginas de manual do Git. Esta é uma ferramenta tão miserável.
JWW
6
@Torek - fale sobre outra bagunça criada pelo Git ... Por que é tão difícil fazer check-out de um arquivo em conflito de outro ramo para que o conflito seja evitado, adicione-o a esse ramo e depois o envie ??? E o WTF é um commit parcial? Não consigo encontrar qualquer documentação sobre isso ... Os usuários são forçados a tentar as suposições abaixo ...
JWW
Como você fez isso? Eu tenho um conflito e não posso fazer nada
Niklas R.

Respostas:

441

Eu descobri que adicionar "-i" ao comando commit corrige esse problema para mim. O -i basicamente diz para preparar arquivos adicionais antes de confirmar. Isso é:

git commit -i myfile.php
MikaelHalen
fonte
18
O que Stage additional filessignifica isso ?
precisa saber é o seguinte
9
@ jcalfee314 estágios no git é preparar o arquivo para o commit. Nesse caso específico, ele prepara o arquivo via linha de comando antes de confirmar. O sinalizador -i é usado principalmente para quando você está concluindo uma mesclagem. Você pode ler mais sobre os sinalizadores de confirmação aqui .
MikaelHalen
4
@ jcalfee314 Eu verifiquei a documentação e ele diz: "Antes de fazer um commit com conteúdo preparado até o momento, prepare também o conteúdo dos caminhos fornecidos na linha de comando. Isso geralmente não é o que você deseja, a menos que esteja concluindo uma fusão conflitante" . Meu palpite é que, sob essa condição, existe algum tipo de inconsistência na área de preparação que não pode ser resolvida git add, o que causa git commitfalha. Adicionar -idiria ao git para adicionar e confirmar ao mesmo tempo. Ainda não sei por que, mas parece fazer sentido.
JonSlowCN
5
Para noobs como eu, você também receberá esse mesmo erro se tentar uma mensagem que inclua espaços sem aspas. Por exemplo. [git commit -m um dois três] correta: [git commit -m "um dois três"]
Skychan
2
O comentário de @ Skychan foi o bilhete para mim.
tehbeardedone 14/01
106
git commit -am 'Conflicts resolved'

Isso funcionou para mim. Você pode tentar isso também.

Pratip Ghosh
fonte
1
Incrível, eu não sabia disso!
JeanValjean 4/10
11
Isso adiciona todos os arquivos modificados à confirmação, mesmo os que não estão em estágio, o que pode não ser desejável. Os usuários podem querer deixar de fora o 'a' flag
Perseguição Sandmann
4
É exatamente isso que o usuário está pedindo para não fazer, para evitar confirmar todos os arquivos.
Michael
33

Você pode usar git commit -ina maioria dos casos, mas caso não funcione

Você precisa fazer git commit -m "your_merge_message". Durante um conflito de mesclagem, você não pode mesclar um único arquivo, portanto, é necessário

  1. Preparar apenas o arquivo em conflito ( git add your_file.txt)
  2. git commit -m "your_merge_message"
aWebDeveloper
fonte
16

Você provavelmente tem um conflito em algo que você não preparou para confirmar. O git não permitirá que você cometa as coisas de forma independente (porque tudo faz parte da mesclagem, eu acho), então você precisa git adddesse arquivo e depois git commit -m "Merge conflict resolution". A -ibandeira para git commitfaz a adição para você.

Paul Price
fonte
5
Não no 1.9.0 - o commit -ifuncionou, mas nãogit add; git commit
LeeGee
14

Consegui isso quando esqueci o -mcommit no meu git ao resolver um conflito de mesclagem do git.

git commit "commit message"

deveria estar

git commit -m "commit message"
wgeorge
fonte
2
ah ah! Eu esqueci de novo!
precisa saber é o seguinte
9

Como diz a mensagem de erro, você não pode fazer uma confirmação parcial após uma mesclagem. Em vez de confirmar, file.phpvocê deve confirmar todas as alterações.

Isso deve funcionar.

git commit -m "Fixing merge" 
Asim Jalis
fonte
Obrigado, ajudou
Narendra Pandey
Funcionou para mim como-ela-é
Shashank Bodkhe
6

Sua mesclagem parou no meio da ação. Você deve adicionar seus arquivos e, em seguida, 'git commit':

git add file_1.php file_2.php file_3.php git commit

Felicidades

Moyshe Zuchmir
fonte
5

Se você deseja apenas abandonar toda a seleção de cereja e confirmar arquivos nos conjuntos que desejar,

git reset --soft <ID-OF-THE-LAST-COMMIT>

leva você até lá.

O que a reinicialização suave faz é mover o ponteiro apontando para HEAD atual para o commit (ish) que você forneceu, mas não altera os arquivos. A redefinição física moveria o ponteiro e também reverteria todos os arquivos para o estado em que commit (ish). Isso significa que, com a reinicialização suave, você pode limpar o status de mesclagem, mas manter as alterações nos arquivos reais e, em seguida, confirmar ou redefinir cada um individualmente, conforme sua preferência.

Zds
fonte
Você poderia explicar isso mais? Provavelmente é isso que eu preciso, mas não entendo como funcionaria ... Todas as respostas aqui são apenas 'adicione os arquivos e depois confirme!', Mas isso é tão trivialmente óbvio; a razão pela qual estou aqui é que não quero adicionar esses arquivos antes de confirmar. -_-;
Kyle Baker
Isso ajuda. Obrigado. :)
Kyle Baker
5
  1. vá para o diretório do seu projeto
    1. exibir arquivos ocultos (a pasta .git aparecerá)
    2. abrir pasta .git
    3. remover MERGE_HEAD
    4. comprometer novamente
    5. se o git lhe disser que o git está bloqueado, volte para a pasta .git e remova o index.lock
    6. comprometer novamente tudo funcionará bem neste momento.
Ahmed Samir
fonte
Ótimo! Isso funcionaria para mim. A propósito, se no MacOS, a partir do terminal, você poderia chamar `open .git`, o bruxo exibirá o conteúdo '.git' no Finder
tontonCD
Isso funciona para mim também. Isso deve ser aceito como resposta.
vandu 17/12/19
3

Para mim, isso aconteceu no SourceTree quando tentei confirmar uma mesclagem antes de resolver todos os arquivos. Marquei o último arquivo resolvido e, no entanto, ele ainda me deu esse erro ao tentar confirmar. Fechei o SourceTree e o reabri, e então ele se comprometeu muito bem.

Justin
fonte
1
obrigado, mas infelizmente isso não funcionou para mim. Irritantemente, eu tive que confirmar uma visualização privada e a mesclagem antes que ela me permitisse realizar a mesclagem.
Coxy
3

Eu resolvi isso com uma abordagem completamente diferente, usando apenas o Source Control do Xcode.

Background: Outra equipe Pushed muda para o repositório Git remoto (via Beanstalk). No meu final, os arquivos .xcodeproj entraram em um diretório diferente e as alterações não foram necessárias. Mais tarde, quando tentei confirmar, recebi um erro de Conflito em árvore no Xcode.

Captura de tela do conflito de árvore

Sendo quase impossível corrigir usando o Xcode, substituí o .xcodeprojarquivo por uma versão baixada do servidor Git. O resultado ... o projeto Xcode pareceu esclarecer, no entanto, todas as atualizações do Pull corrompido estavam aparecendo como alterações que eu fiz e foram preparadas para um commit.

Veja todos esses mods e arquivos adicionados

No entanto, ao tentar confirmar, recebi o mesmo erro "fatal: não é possível fazer uma confirmação parcial durante uma mesclagem", discutido aqui.

Aqui está como eu resolvi o problema ... (Agora, entenda que sou um programador novato, para que eu não tenha um certo entendimento ... mas minha ignorância me levou a encontrar outra maneira de fazer isso.) Primeiro, eu clonei meu mestre Ramifique em uma ramificação secundária e alterne para essa ramificação. Em seguida, criei uma cópia de trabalho e coloquei o diretório nessa cópia de trabalho fora do diretório de projeto original. (Não sei se isso foi necessário, mas foi o que fiz ao ler outras técnicas de solução de problemas.) Depois, troquei as ramificações para o mestre, onde percebi que todos os meus arquivos em estágios (alterações em Confirmar) haviam desaparecido. Para garantir que todos os arquivos foram atualizados para as alterações mais recentes feitas pela outra parte, criei um novo ramo chamado ThirdBranch, que duplicou todos os arquivos, Enviei para o Git Server e permiti que o Beanstalk compare minha versão do servidor da ramificação principal com a ramificação ThirdBrach que eu acabei de empurrar (linha por linha), e todas as alterações da outra parte estavam presentes no meu Xcode. Isso significava que meu repositório principal e o repositório principal do Git eram os mesmos, o que verifica se eu resolvi o problema usando apenas o Xcode.

Não me pergunte como, além do que acabei de descrever ... e certamente preencha as lacunas que deixei de fora. Sou novo nisso e não entendo tudo. Talvez um programador experiente possa separar as informações irrelevantes das relevantes e recriar essa técnica mais claramente, e é em parte por isso que estou postando isso.

Esta é uma resposta duplicada para a pergunta duplicada como em: Falha na mesclagem do Xcode Git está bloqueada

Plexander
fonte
2
Por favor, não poste respostas duplicadas. Embora o problema subjacente possa ser o mesmo, sua resposta é para um problema muito mais específico e apenas obscurece as respostas para essa pergunta geral. Penso que, neste caso, um comentário à pergunta na qual você vincula sua resposta original é mais apropriado.
Fookatchu 22/02
2

Durante uma mesclagem, o Git deseja acompanhar as ramificações principais por todos os tipos de razões. O que você quer fazer não é uma fusão como o git vê. Você provavelmente desejará fazer uma nova refazer ou selecionar manualmente.

Talljoe
fonte
1
Eu nunca usei rebase ou cherry-pick antes, acabei de ler o manual agora, então o que você sugere, "git rebase master" depois que a fusão de conflitos funcionará?
PMan
1
É um fluxo de trabalho paralelo. Consulte stackoverflow.com/questions/804115/git-rebase-vs-git-merge Basicamente, se você deseja que a "mesclagem" seja separada, você confirma novamente a ramificação de origem no final da ramificação de destino.
precisa saber é o seguinte
1
Apenas git adicione cada arquivo individual e depois confirme sem -a.
Peter DeWeese
4
você realmente não respondeu à pergunta, mas simplesmente deu mais para pesquisar. Agora precisamos saber "o que é cereja escolhendo" e "o que é rebase".
Ftrotter
2
Eu me pergunto por que essa resposta foi rejeitada. Eu sempre tive a curiosidade da criança quando alguém me conta coisas que eu nunca soube antes. Como comentei acima, agora eu sei sobre a escolha e a recuperação da cereja. Isso não foi progressivo / útil?
PMAN
2

git commit -i -m 'merge message'não funcionou para mim. Dizia:

fatal: No paths with --include/--only does not make sense.

FWIW, cheguei aqui por meio dessa pergunta relacionada porque estava recebendo esta mensagem:

fatal: You have not concluded your merge (MERGE_HEAD exists).

Eu também tentei o mergetool, que dizia No files need merging. Muito confuso! Portanto, o MERGE_HEAD não está em um arquivo que precisa ser mesclado - ??

Por fim, usei esse truque para adicionar apenas os arquivos modificados (não quis adicionar todos os arquivos da minha árvore, pois tenho alguns que quero manter não rastreados):

git ls-files -m | xargs git add

Então, finalmente, consegui (!) Me comprometer e avançar. Com certeza seria bom se o git lhe desse dicas melhores sobre o que fazer nessas situações.

szeitlin
fonte
1

Se estiver na Árvore de Origem , devemos marcar explicitamente um arquivo como resolvido após a resolução dos conflitos. Selecione o arquivo que acabou de ser resolvido sem conflitos. Em seguida, Ações -> Resolver conflitos -> Marcar resolvido . Se você tiver vários arquivos, faça o mesmo para todos. Confirme agora.

cgr
fonte
1

Depois de ler todos os comentários. esta foi a minha resolução:
tive que "adicioná-lo" novamente e confirmar:

$ git commit -i -m support.html "doit once for all" [master 18ea92e] support.html
FelipeNutz
fonte
1

Se você estiver usando a árvore de origem ou outra GUI, verifique se todos os arquivos estão marcados (após a mesclagem).

luky
fonte
0

Às vezes, durante a mesclagem, se surgirem conflitos e houver deltas que precisem de resolução manual. Nesse caso, corrija a resolução manual dos arquivos mencionados.

Agora, se você emitir,

git status Lib/MyFile.php

Você verá resultados como

On branch warehouse
Your branch and 'origin/warehouse' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

    modified:   Lib/MyFile.php

Como você já organizou o commit, basta emitir

git commit

E seu commit será feito sem nenhum problema.

Ketan Patel
fonte