Lidando com Conflitos de Cherry-pick
Às vezes, quando você faz o cherry-pick de um commit, o Git pode encontrar conflitos se as alterações no commit entrarem em conflito com as alterações no seu branch atual. Nesta etapa, aprenderemos como lidar com conflitos de cherry-pick e como abortar uma operação de cherry-pick.
Criando um Cenário com Potenciais Conflitos
Primeiro, vamos criar um cenário que resultará em um conflito de cherry-pick:
## Switch to main branch and modify README.md
git checkout main
echo -e "## Cherry Pick Lab\n\nThis is the main branch README." > README.md
git commit -am "Update README in main branch"
## Switch to feature branch and make a conflicting change to README.md
git checkout feature-branch
echo -e "## Cherry Pick Lab\n\nThis README has been updated in the feature branch." > README.md
git commit -am "Update README in feature branch"
Tentando um Cherry-pick com Conflitos
Agora, vamos voltar para o branch principal e tentar fazer o cherry-pick do commit do branch de recurso:
git checkout main
CONFLICT_HASH=$(git log feature-branch --oneline | grep "Update README in feature" | cut -d ' ' -f 1)
git cherry-pick $CONFLICT_HASH
Como ambos os branches modificaram as mesmas linhas em README.md, você deve ver um conflito:
error: could not apply a1b2c3d... Update README in feature branch
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
Visualizando o Conflito
Vamos examinar o conflito:
git status
Você deve ver uma saída indicando um conflito em README.md:
On branch main
You are currently cherry-picking commit a1b2c3d.
(fix conflicts and run "git cherry-pick --continue")
(use "git cherry-pick --abort" to cancel the cherry-pick operation)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: README.md
no changes added to commit (use "git add" and/or "git commit -a")
Vamos olhar o conteúdo do arquivo em conflito:
cat README.md
Você deve ver algo como:
## Cherry Pick Lab
<<<<<<< HEAD
This is the main branch README.
=======
This README has been updated in the feature branch.
>>>>>>> a1b2c3d... Update README in feature branch
Resolvendo o Conflito
Para resolver o conflito, precisamos editar o arquivo e decidir quais alterações manter. Vamos modificar README.md para incluir ambas as alterações:
echo -e "## Cherry Pick Lab\n\nThis is the main branch README.\n\nThis README has also been updated with content from the feature branch." > README.md
Agora, vamos marcar o conflito como resolvido e continuar o cherry-pick:
git add README.md
git cherry-pick --continue
O Git abrirá um editor com uma mensagem de commit padrão. Salve e feche o editor para concluir o cherry-pick.
Abortando um Cherry-pick
Às vezes, você pode decidir que não quer resolver os conflitos e prefere cancelar a operação de cherry-pick. Vamos criar outro conflito e, em seguida, abortar o cherry-pick:
## Create another conflicting commit in feature branch
git checkout feature-branch
echo "// This will conflict with app.js in main" > app.js
git commit -am "Modify app.js in feature branch"
## Try to cherry-pick this commit to main
git checkout main
ANOTHER_CONFLICT=$(git log feature-branch --oneline | grep "Modify app.js" | cut -d ' ' -f 1)
git cherry-pick $ANOTHER_CONFLICT
Você deve ver outro conflito. Desta vez, vamos abortar o cherry-pick:
git cherry-pick --abort
Você deve ver que a operação de cherry-pick foi cancelada e seu diretório de trabalho foi restaurado ao seu estado anterior:
git status
Output:
On branch main
nothing to commit, working tree clean
Lidar com conflitos durante operações de cherry-pick é uma habilidade essencial para usuários do Git. Você tem três opções quando encontra um conflito:
- Resolva o conflito manualmente, depois use
git add e git cherry-pick --continue
- Ignore o commit em conflito com
git cherry-pick --skip
- Aborte toda a operação de cherry-pick com
git cherry-pick --abort
A melhor abordagem depende da situação específica e dos requisitos do seu projeto.