conflito de fusão git rebase

93

Eu criei um bifurcação em um repositório github e trabalhei em meu repositório github.
Eu fiz solicitações de pull e ele foi concluído.

Depois disso, o upstream teve mais commits, então agora eu quero rebase, acho que é isso que tenho que fazer.
Mas estou recebendo estes conflitos de mesclagem:

First, rewinding head to replay your work on top of it...
Applying: Issue 135 homepage refresh
Using index info to reconstruct a base tree...
<stdin>:17: trailing whitespace.
      %h4 
warning: 1 line adds whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging app/views/layouts/application.html.haml
CONFLICT (content): Merge conflict in app/views/layouts/application.html.haml
Auto-merging app/views/home/index.html.haml
CONFLICT (content): Merge conflict in app/views/home/index.html.haml
Auto-merging app/views/home/_group_projects.html.haml
CONFLICT (content): Merge conflict in app/views/home/_group_projects.html.haml
Failed to merge in the changes.
Patch failed at 0001 Issue 135 homepage refresh

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".

Não sei como consertar isso, por favor me ajude.

Pahnin
fonte
Dê uma olhada na minha resposta neste post: stackoverflow.com/questions/48307297/…
Abhishek

Respostas:

125

Rebasing pode ser uma verdadeira dor de cabeça. Você tem que resolver os conflitos de mesclagem e continuar rebasing. Por exemplo, você pode usar a ferramenta de mesclagem (que difere dependendo de suas configurações)

git mergetool

Em seguida, adicione suas alterações e vá em frente

git rebase --continue

Boa sorte

iltempo
fonte
2
sim rebase é dor de cabeça, posso usar git pull upstream master?
Pahnin
2
Sim, você pode tentar isso. A diferença é que seus commits não são colocados em cima daqueles do upstream. Potencialmente, há menos conflitos de mesclagem.
iltempo
7
@iitempo Você não precisa fazer um commit. Apenas um git add é suficiente para permitir que o rebase continue.
enigmaticPhysicist
47

Quando você tem um conflito durante o rebase, você tem três opções:

  • Você pode executar git rebase --abortpara desfazer completamente o rebase. O Git o retornará ao estado do seu branch como estava antes de o git rebase ser chamado.

  • Você pode executar git rebase --skippara pular completamente o commit. Isso significa que nenhuma das mudanças introduzidas pelo commit problemático será incluída. É muito raro você escolher essa opção.

  • Você pode consertar o conflito como o iltempo disse. Quando terminar, você precisará ligar git rebase --continue. Meu mergetool é o kdiff3, mas há muitos outros que você pode usar para resolver conflitos. Você só precisa definir sua ferramenta de mesclagem nas configurações do git para que possa ser invocada quando você chamar git mergetool https://git-scm.com/docs/git-mergetool

Se nenhuma das opções acima funcionar para você, dê uma caminhada e tente novamente :)

Uga Buga
fonte
2
Sim, mas como consertar o conflito? essa é a questão. O que há entre "consertar o conflito" e "quando você terminar"
KansaiRobot
@KansaiRobot Uma opção para realizar a correção manual: abra o arquivo em conflito em um editor de texto e procure<<<<<
spinup em
18

Se você tem muitos commits para rebase, e alguma parte deles está gerando conflitos, isso realmente machuca. Mas posso sugerir uma abordagem menos conhecida como "esmagar todos os conflitos".

Primeiro, verifique o branch temporário e inicie a mesclagem padrão

git checkout -b temp
git merge origin/master

Você terá que resolver conflitos, mas apenas uma vez e apenas os reais. Em seguida, prepare todos os arquivos e conclua a fusão.

git commit -m "Merge branch 'origin/master' into 'temp'"

Em seguida, volte ao seu branch (que seja alfa ) e inicie o rebase, mas com resolução automática de quaisquer conflitos.

git checkout alpha
git rebase origin/master -X theirs

O ramo foi rebaseado, mas o projeto provavelmente está em estado inválido. Tudo bem, temos uma etapa final. Precisamos apenas restaurar o estado do projeto, para que seja exato como no branch 'temp'. Tecnicamente, só precisamos copiar sua árvore (estado da pasta) por meio do comando de baixo nível git commit-tree . Além disso, a fusão no branch atual acabou de criar o commit.

git merge --ff $(git commit-tree temp^{tree} -m "Fix after rebase" -p HEAD)

E deletar branch temporário

git branch -D temp

Isso é tudo. Fizemos um rebase via mesclagem oculta.

Também escrevi um script, para que possa ser feito em forma de diálogo, você encontra aqui .

Baur
fonte
13

Nota: com Git 2.14.x / 2.15 (Q3 2017), o git rebase mensagem em caso de conflito será mais clara.

Veja o commit 5fdacc1 (16 de julho de 2017) de William Duclot ( williamdclt) .
(Incorporado por Junio ​​C Hamano - gitster- no commit 076eeec , 11 de agosto de 2017)

rebase: torna a mensagem de resolução mais clara para usuários inexperientes

Antes:

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"

Depois de:

Resolve all conflicts manually, 
mark them as resolved with git add/rm <conflicted_files>
then run "git rebase --continue".

You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".')

A IU do git pode ser melhorada endereçando as mensagens de erro para aqueles que eles ajudam: usuários git inexperientes e casuais.
Para tanto, é útil garantir que os termos usados ​​nessas mensagens possam ser compreendidos por esse segmento de usuários e que os orientem para resolver o problema.

Em particular, a falha em aplicar um patch durante um rebase do git é um problema comum que pode ser muito desestabilizador para o usuário inexperiente.
É importante conduzi-los para a resolução do conflito (que é um processo de 3 etapas, portanto complexo) e tranquilizá-los de que podem escapar de uma situação com a qual não conseguem lidar com " --abort".
Este commit responde a esses dois pontos detalhando o processo de resolução e evitando o git linguo críptico.

VonC
fonte
1
Agradável! A página de ajuda diz para resolver o conflito confirmando a mudança, mas não! Aqui, precisamos pular o commit e apenas continuar a fusão! (página de ajuda: help.github.com/articles/… )
Jerther