Como finalizo a mesclagem após resolver meus conflitos de mesclagem?

282

Eu li a seção Ramificação e fusão básicas do livro da comunidade Git.

Então eu segui-lo e criar um ramo: experimental.

Então eu:

  1. alternar para o ramo experimental (experimental do git checkout)
  2. faça um monte de mudanças
  3. enviá-lo (git commit -a)
  4. alternar para o ramo principal (mestre do git checkout)
  5. fazer algumas alterações e confirmar lá
  6. voltar para experimental (experimental do git checkout)
  7. mesclar a alteração do mestre para experimental (git merge master)
  8. existem alguns conflitos, mas depois que os resolvi, 'git add myfile'

  9. E agora estou preso, não posso voltar a dominar

quando eu faço

 $ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

e eu fiz:

$ git rebase --abort

Não há rebase em andamento?

e eu fiz :

$  git add res/layout/socialhub_list_item.xml
$ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

O que posso fazer para voltar ao meu ramo principal?

Michael
fonte
Depois de corrigir o conflito, executar a adição e, em seguida, tentar executar a confirmação git commit gf2n.cpp -m "Hand merge gf2n.cpp due to conflicts", ele resulta em fatal: cannot do a partial commit during a merge.. E, é claro, "confirmações parciais" não parecem estar documentadas ou discutidas em nenhum lugar nas páginas do manual do git. Executar um git mergeapós a correção resulta em Please, commit your changes before you can merge.que ferramenta de bunda quebrada ...
jww
2
O commit do git com caminhos explícitos está documentado na página de manual em DESCRIPTION "as" 3. listando os arquivos como argumentos para o comando commit, nesse caso o commit ignorará as alterações organizadas no índice e, em vez disso, registrará o conteúdo atual dos arquivos listados (que já devem ser conhecidos pelo Git); "e também sob o '- Tenho certeza de que a mensagem de mesclagem foi escrita por alguém que assumiu que você leu como o comando commit funciona e pode reconhecer o significado da palavra "parcial" nessa descrição, se ainda não o tiver, pelo menos novamente e com mais cuidado. @jww
jthill 18/09/16
1
Então, por que esse estudo de caso merece uma leitura cuidadosa para compreensão, enquanto as páginas do manual não? @jww
jthill 18/09/16
1
Bem, o uso do git claramente requer uma melhor compreensão da leitura do que você está preparado para adquirir. Talvez eu tenha ainda mais certeza de que é uma falha no git do que você tem certeza.
jthill
1
Com o Git 2.12 (primeiro trimestre de 2017), em breve você fará um simples git merge --continue. Veja minha resposta abaixo
VonC

Respostas:

267

Quando houver um conflito durante uma mesclagem, você precisará concluir a consolidação da mesclagem manualmente. Parece que você executou as duas primeiras etapas para editar os arquivos em conflito e executá git add-los para marcá-los como resolvidos. Finalmente, você precisa realmente confirmar a mesclagem git commit. Nesse ponto, você poderá alternar ramificações novamente.

Jimmy Cuadra
fonte
Se você usar "git gui &" para fazer o commit - você pode não perceber que seu estado de ramificação não está mais "mesclando". O acompanhamento de um "status git" é útil para garantir que o status da sua filial esteja correto.
Tony Ashworth
4
Tente git commit -am "your commit message"executar adicionar e confirmar simultaneamente.
vaheeds
3
git commitfunciona. E é melhor usá-lo para obter a mensagem de confirmação de mesclagem padrão preenchida para você. Eu evito o `git commit -am", já que ele substituirá a mensagem
Arijoon
1
Tente git push.
Alper
Eu peguei essa situação no cenário abaixo -> eu mesclei o ramo X com o ramo Y. Então percebi que havia feito algo errado na ramificação Y, então corrigi isso e depois "alterei" minhas alterações na ramificação Y. Por causa da alteração, o git não criou um novo commit. Então, quando mesclei o ramo X com o ramo Y atualizado, isso causou conflito. Entre obrigado por esta resposta.
Doga
157

Como finalizo a mesclagem após resolver meus conflitos de mesclagem?

Com o Git 2.12 (primeiro trimestre de 2017), você terá o comando mais natural:

git merge --continue

Veja commit c7d227d (15 de dezembro de 2016) por Jeff King ( peff) .
Consulte commit 042e290 , commit c261a87 , commit 367ff69 (14 de dezembro de 2016) por Chris Packham ( cpackham) .
(Mesclado por Junio ​​C Hamano - gitster- na confirmação 05f6e1b , 27 de dezembro de 2016)

Consulte as notas de versão 2.12 .

merge: adicione a --continueopção ' ' como sinônimo de ' git commit'

Ensine ' git merge' a --continueopção que permite 'continuar' uma mesclagem, completando-a.
A maneira tradicional de concluir uma mesclagem após resolver conflitos é usar ' git commit'.
Agora, com comandos como ' git rebase' e ' git cherry-pick' com uma --continueopção ' ' adicionando essa opção a ' git merge' apresenta uma interface do usuário consistente.

VonC
fonte
Eu estava me preparando para postar um comentário sobre como isso foi adicionado recentemente na 2.12 no primeiro trimestre de 2017, mas depois reli a primeira linha da sua resposta. Não é de admirar que a opção não foi encontrada para mim na versão 2.10!
cjsimon
1
Tentei o git merge --continue e o Git Bash não conseguiu reconhecê-lo como um comando. Mas o que funcionou foi git commit -m "Commit message"
Mimi
2
@ Miimi OK, mas você está usando um Git 2.12 ou mais?
VonC
@VonC você está correto, estou usando uma versão mais antiga do Git!
Mimi
23

Caso você fique preso durante uma mesclagem / rebase, poderá sempre

git reset --hard

para restaurar seu trabalho para o estado da última confirmação. Isso perderá as alterações da árvore de trabalho, portanto, se você tiver modificações locais antes da mesclagem, elas serão eliminadas depois disso - é por isso que é aconselhável não iniciar uma mesclagem quando você tiver modificações locais. :)

Bombe
fonte
15
advertência obrigatória: git reset --hardjoga mudanças embora não confirmadas
Geoffrey Hale
2
Por que não apenas git merge --abort, que não corre o risco de perder nada?
Alexander George
11

Apenas git commitisso.

Opcionalmente git abort:
encontrei um conflito de mesclagem. Como posso interromper a mesclagem?

Para facilitar a vida com as fusões, instale o kdiff3 e configure-o como uma ferramenta de fusão. Instruções: http://doodkin.com/2016/05/29/git-merge-easy-github-this-branch-has-conflicts-that-must-be-resolved-use-the-command-line/

Essa página contém este vídeo: https://www.youtube.com/watch?v=Cc4xPp7Iuzo

Shimon Doodkin
fonte
11

Sempre que você mesclar duas ramificações usando o comando git merge brancha branchb, existem duas possibilidades:

  1. Um ramo (digamos brancha) pode ser alcançado pelo outro ramo (digamos branchb) seguindo seu histórico de confirmações. Nesse caso, o git simplesmente avança rapidamente a cabeça para apontar para o ramo recente (neste caso, branchb).

    2.Mas se as duas ramificações divergirem em algum momento anterior, o git cria uma nova captura instantânea e adiciona uma nova confirmação que aponta para ela. Portanto, caso não haja conflito entre as ramificações que você está mesclando, o git cria uma nova confirmação sem problemas.

Execute git logpara ver a confirmação depois de mesclar duas ramificações não conflitantes.

Agora voltando ao caso interessante, quando há conflitos de mesclagem entre as ramificações mescladas. Cito isso na página https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging

O Git não criou automaticamente um novo commit de mesclagem. O processo foi interrompido enquanto você resolve o conflito. Se você deseja ver quais arquivos estão inalterados a qualquer momento após um conflito de mesclagem, é possível executargit status


Portanto, no caso de haver conflitos de mesclagem, é necessário resolvê-lo e, em seguida, adicionar as alterações feitas na área de preparação, git add filenamee confirmar as alterações usando o comando git commit que foi pausado pelo git por causa do conflito. inquerir. Visite também o link acima para uma compreensão detalhada. Em caso de qualquer dúvida, por favor, comente abaixo, teremos prazer em ajudar.

Sourav Prem
fonte
7

As próximas etapas após a resolução manual dos conflitos são: -

  1. git add.
  2. status git (isso mostrará quais comandos são necessários para continuar o procedimento de mesclagem automática)
  3. [comando git sugere, por exemplo git merge --continue, git cherry-pick --continue, git rebase --continue]
Timidfriendly
fonte
16
Não há nenhuma fusão de git --continue
Hola Soy Edu Feliz Navidad
@HolaSoyEduFelizNavidad Isso está incorreto. Zie saída git abaixo após o conflito: - error: Failed to merge in the changes. Patch failed at 0001 ADD: _type to styleguide The copy of the patch that failed is found in: .git/rebase-apply/patch When you have resolved this problem, run "git rebase --continue". If you prefer to skip this patch, run "git rebase --skip" instead. To check out the original branch and stop rebasing, run "git rebase --abort".
Timidfriendly
5
Há rebase --continue, não mesclar --continue
Hola Soy Edu Feliz Navidad
git merge --continue, que é o que estou tentando fazer, resulta error: unknown option 'continue'. Estou certo de que sua resposta está errada, pois a git-mergepágina de manual não a lista. Qual versão do Git você está usando? Eu estou usando git version 1.8.5.2 (Apple Git-48). Eu também tentei com o MacPorts git version 2.9.3.
JWW
1
Com o git 2.10 para uma mesclagem simples, o comando é antigogit commit
Chris Charabaruk
2

Um conflito de mesclagem ocorre quando dois ramos que você está tentando mesclar alteram a mesma parte do mesmo arquivo. Você pode gerar uma lista de conflitos com git status.

Quando a linha em conflito é encontrada, o Git edita o conteúdo dos arquivos afetados com indicadores visuais que marcam os dois lados do conteúdo conflitante.

<<<<<<< HEAD
conflicted text from HEAD
=======
conflicted text from merging_branch
>>>>>>> merging_branch

Quando você corrige seus arquivos em conflito e está pronto para mesclar, tudo o que você precisa fazer é executar git adde git commitgerar a consolidação de mesclagem. Depois que a confirmação foi feita, git pushas alterações na ramificação.

Artigo de referência: Git merge .

Nesha Zoric
fonte
2

Depois que todos os arquivos foram adicionados, o próximo passo é um " git commit ".

"git status" sugerirá o que fazer: os arquivos ainda a serem adicionados são listados na parte inferior e, quando todos estiverem prontos, sugerirá um commit na parte superior, onde explica o status de mesclagem da ramificação atual.

hobgoblin
fonte
1

A primeira coisa que quero esclarecer é que os nomes das ramificações são apenas um alias para um commit específico. um commit é o que o git funciona, quando você puxa, empurra a mesclagem e assim por diante. Cada confirmação tem um ID exclusivo.

Quando você faz a mesclagem $ git, o que realmente está acontecendo é que o git tenta avançar rapidamente sua ramificação atual para a confirmação da ramificação referenciada (em outras palavras, os nomes de duas ramificações apontam para a mesma confirmação.) Esse cenário é o mais fácil para o git para lidar, já que não há novo commit. Pense no mestre pulando no lilipad em que seu ramo está relaxando. É possível definir o sinalizador --no-ff; nesse caso, o git criará um novo commit, independentemente de haver algum conflito de código.

Em uma situação em que há conflitos de código entre as duas ramificações que você está tentando mesclar (geralmente duas ramificações cujo histórico de consolidação compartilham uma consolidação comum no passado), o avanço rápido não funcionará. O git ainda poderá mesclar os arquivos automaticamente, desde que a mesma linha não tenha sido alterada pelos dois ramos em um arquivo em conflito. nesse caso, o git mesclará os arquivos conflitantes para você e os confirmará automaticamente. Você pode visualizar como o git se saiu fazendo $ git diff --cached. Ou você pode passar o sinalizador --no-commit para o comando mesclar, que deixará os arquivos modificados no seu índice e você precisará adicionar e confirmar. Mas você pode $ git diff esses arquivos para revisar o que a mesclagem mudará.

O terceiro cenário é quando há conflitos que o git não pode resolver automaticamente. Nesse caso, você precisará mesclá-los manualmente. Na minha opinião, é mais fácil fazer uma mesclagem, como araxis merge ou p4merge (grátis). De qualquer maneira, você deve fazer cada arquivo um por um. Se a mesclagem parecer travada, use $ git merge --continue, para acompanhá-la. O Git deve dizer se não pode continuar e, se sim, por que não. Se você sentir que perdeu a mesclagem em algum momento, poderá fazer a mesclagem $ git --abort, e qualquer fusão será desfeita e você poderá começar de novo. Quando terminar, cada arquivo que você mesclou será um arquivo modificado que precisará ser adicionado e confirmado. Você pode verificar onde os arquivos estão com o status $ git. Se você ainda não confirmou os arquivos mesclados. Você precisa fazer isso para concluir a mesclagem.

Harry Robbins
fonte
0

Pode ser tarde. Isso acontece porque o seu git HEAD não é atualizado. esse elogio resolveria isso git reset HEAD.

s.morteza malekabadi
fonte