Merge i rozwiązywanie konfliktów
1. Wprowadzenie
Merge (scalanie) to proces łączenia zmian z jednego brancha do drugiego. Jest to kluczowa operacja w pracy z Git, pozwalająca na integrację pracy wielu programistów.
2. Czym jest merge?
Merge łączy historię dwóch branchy w jeden.
Przed merge:
main: A -- B -- C
\
feature: D -- E
Po merge:
main: A -- B -- C ------- M
\ /
feature: D ------- E
Commit M to merge commit, który łączy obie historie.
3. Podstawowy merge
3.1. Workflow
3.2. Praktyczny przykład
Output:
Updating abc1234..def5678
Fast-forward
plik.txt | 1 +
1 file changed, 1 insertion(+)
4. Typy merge
4.1. Fast-Forward Merge
Gdy nie było nowych commitów na branchu docelowym:
main: A -- B
\
feature: C -- D
Po merge main po prostu "przesuwa się" do D:
main: A -- B -- C -- D
4.2. Three-Way Merge
Gdy były commity na obu branchach:
main: A -- B -- C
\
feature: D -- E
Po merge tworzy się nowy commit M:
main: A -- B -- C ------- M
\ /
feature: D ------- E
5. Konflikty
Konflikt występuje, gdy Git nie może automatycznie scalić zmian (np. dwie osoby edytowały tę samą linię w pliku).
5.1. Kiedy powstają konflikty?
- Dwie osoby edytowały tę samą linię
- Jeden usunął plik, drugi go edytował
- Różne zmiany w tej samej sekcji kodu
5.2. Przykład konfliktu
Output:
Auto-merging plik.txt
CONFLICT (content): Merge conflict in plik.txt
Automatic merge failed; fix conflicts and then commit the result.
6. Rozwiązywanie konfliktów
6.1. Sprawdź status
Output:
On branch main
You have unmerged paths.
Unmerged paths:
both modified: plik.txt
6.2. Otwórz plik z konfliktem
<<<<<<< HEAD
Wersja z main
=======
Wersja z feature
>>>>>>> feature
Znaczenie:
* <<<<<<< HEAD – zaczyna sekcję z brancha docelowego (main)
* ======= – separator
* >>>>>>> feature – kończy sekcję z brancha źródłowego
6.3. Edytuj plik
Usuń markery konfliktu i zostaw odpowiednią wersję:
Wersja finalna (lub kombinacja obu)
6.4. Dodaj i commituj
7. Narzędzia do rozwiązywania konfliktów
7.1. Git mergetool
Otwiera narzędzie (np. vimdiff, meld).
7.2. VS Code
VS Code automatycznie wykrywa konflikty i pokazuje opcje:
- Accept Current Change
- Accept Incoming Change
- Accept Both Changes
- Compare Changes
7.3. Ręcznie
Edytuj plik w edytorze i usuń markery <<<<<<<, =======, >>>>>>>.
8. Abort merge (przerwanie)
Jeśli chcesz przerwać merge:
Wraca do stanu sprzed merge.
9. Strategie merge
9.1. --no-ff (bez fast-forward)
Wymusza utworzenie merge commit nawet przy fast-forward:
Zaleta: Zachowuje historię o tym, że funkcja była na osobnym branchu.
9.2. --squash
Łączy wszystkie commity z brancha w jeden:
10. Sprawdzanie przed merge
10.1. Podgląd zmian
10.2. Lista commitów do zmergowania
10.3. Pliki do zmergowania
11. Praktyczny przykład z konfliktami
Rozwiązanie:
12. Najlepsze praktyki merge
✅ Dobrze:
- Merguj często, małymi kawałkami
- Testuj przed mergowaniem
- Pisz jasne wiadomości commitów
- Rozwiązuj konflikty ostrożnie
❌ Źle:
- Długie branche bez mergowania
- Merge bez testów
- Ignorowanie konfliktów
- Merge "na ślepo"
13. Cheatsheet - Merge
| Komenda | Opis |
|---|---|
git merge branch |
Zmerguj branch |
git merge --no-ff branch |
Merge z commit (bez fast-forward) |
git merge --squash branch |
Squash commits |
git merge --abort |
Przerwij merge |
git diff main..feature |
Podgląd zmian |
git log main..feature |
Commity do zmergowania |
14. Podsumowanie
Merge to proces łączenia branchy:
- ✅ Fast-forward – proste przesunięcie
- ✅ Three-way – z merge commitem
- ✅ Konflikty – rozwiązuj ostrożnie
- ✅ Zawsze testuj po merge!
Workflow:
git checkout main
git merge feature
# Jeśli konflikt: edytuj → git add → git commit
git branch -d feature
Co dalej:
- Lekcja 6 – Praca z GitHub i zdalnymi repozytoriami
- Lekcja 7 – Historia i cofanie zmian
Brawo! Umiesz mergować branche! 🔀