Cosa otterrai
Creerai deliberatamente un conflitto di merge, camminerai attraverso la risoluzione e imparerai gli strumenti e i pattern che rendono i conflitti non-spaventosi.
Passo 1: configurare un sandbox
mkdir conflict-tutorial && cd conflict-tutorial
git init
cat > recipe.txt <<'EOF'
Tomato Sauce Recipe
Ingredients:
- 1 onion, chopped
- 2 cloves garlic
- 1 can tomatoes
EOF
git add recipe.txt
git commit -m "Initial recipe"
Passo 2: creare due branch divergenti
git checkout -b add-basil
sed -i.bak 's/2 cloves garlic/2 cloves garlic\n- handful of basil/' recipe.txt && rm recipe.txt.bak
git commit -am "Add basil"
git checkout -b add-oregano main
sed -i.bak 's/2 cloves garlic/2 cloves garlic\n- pinch of oregano/' recipe.txt && rm recipe.txt.bak
git commit -am "Add oregano"
Passo 3: triggerare il conflitto
git checkout main
git merge add-basil
git merge add-oregano
CONFLICT (content): Merge conflict in recipe.txt
Automatic merge failed; fix conflicts and then commit the result.
Passo 4: leggere i marker di conflitto
<<<<<<< HEAD
- handful of basil
=======
- pinch of oregano
>>>>>>> add-oregano
Passo 5: risolvere
- 2 cloves garlic
- handful of basil
- pinch of oregano
- 1 can tomatoes
Passo 6: stage e completare il merge
git add recipe.txt
git status
git merge --continue
git commit
Strumenti che aiutano
git mergetool
git config --global merge.tool vimdiff
Abortire
git merge --abort
Pattern comuni
- Prendere un lato all'ingrosso.
- Prendere entrambi.
- Riavviare il merge.
Ispezionare prima di risolvere
git diff
git log --merge -p <file>
git show :1:<file>
git show :2:<file>
git show :3:<file>
Rerere per conflitti ripetuti
git config --global rerere.enabled true