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! 🔀