Git - merge i pierwszy konflikt

Stronę tą wyświetlono już: 52 razy

Poprzednio utworzony został branch o nazwie 001_index_html przełączę się czym prędzej na branch-a develop:

git checkout develop

a następnie z develop-a utworzę kolejnego branch-a:

git checkout -b 002_some_content

na którym również utworzę plik index.html ale nieco inny:

Listing 1
  1. <!DOCTYPE html>
  2. <html lang="PL">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Zabawa z gitem!</title>
  8. </head>
  9. <body>
  10. <h2>Zabawa z gitem</h2>
  11. <aside>
  12. Git zabawny wszakże jest
  13. Kontroluje wszystko wnet!
  14. </aside>
  15. </body>
  16. </html>

Czas dodać plik i commit-a zrobić:

git add *
git commit -m "some content"
[002_some_content c303cdb] some content
 1 file changed, 17 insertions(+)
 create mode 100644 index.html

a następnie przełączyć się z powrotem na develop:

git checkout develop

Teraz możesz przejść do folderu projektu, otworzyć plik index.html i z przerażeniem stwierdzić, że twoje zmiany w tajemniczy sposób zniknęły! Ale spokojnie zaraz powrócą! Czas na merg-owanko, najpierw 001_index_html:

git merge 001_index_html
Updating 8f2e6e8..1bd50b6
Fast-forward
 index.html | 12 ++++++++++++
 1 file changed, 12 insertions(+)
 create mode 100644 index.html

Mały diagram merg-owania stan przed:

	          A---B---C topic
	         /
    D---E---F---G master

i po

	          A---B---C topic
	         /         \
    D---E---F---G-----------H master

A teraz trzeba by było spróbować merg-ować drugiego brancha:

git merge 002_some_content
CONFLICT (add/add): Merge conflict in index.html
Auto-merging index.html
Automatic merge failed; fix conflicts and then commit the result.

I cóż za zaskoczenie! Merge conflict (konflikt). Jeżeli przejdziesz do pliku index.html oczom twym coś takiego się ukarze:

Listing 2
  1. <!DOCTYPE html>
  2. <<<<<<< HEAD
  3. <html lang="en">
  4. =======
  5. <html lang="PL">
  6. >>>>>>> 002_some_content
  7. <head>
  8. <meta charset="UTF-8">
  9. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  10. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  11. <<<<<<< HEAD
  12. <title>Document</title>
  13. </head>
  14. <body>
  15. </body>
  16. </html>
  17. =======
  18. <title>Zabawa z gitem!</title>
  19. </head>
  20. <body>
  21. <h2>Zabawa z gitem</h2>
  22. <aside>
  23. Git zabawny wszakże jest
  24. Kontroluje wszystko wnet!
  25. </aside>
  26. </body>
  27. </html>
  28. >>>>>>> 002_some_content

W sekcji pomiędzy <<<<<<< HEAD a ======= znajdują się bieżące zmiany z develop-a, natomiast pomiędzy ======= a >>>>>>> 002_some_content zmiany z 002_some_content, które kolidują z bieżącymi zmianami. Należy porównać te zmiany i zostawić te, które powinny być gdyż system sam nie może podjąć takiej decyzji. Tak więc w tym przypadku wszystkie zmiany z 002_some_content powinny pozostać, a więc plik powinien wyglądać tak:

Listing 3
  1. <!DOCTYPE html>
  2. <html lang="PL">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Zabawa z gitem!</title>
  8. </head>
  9. <body>
  10. <h2>Zabawa z gitem</h2>
  11. <aside>
  12. Git zabawny wszakże jest
  13. Kontroluje wszystko wnet!
  14. </aside>
  15. </body>
  16. </html>

Po zapisaniu zmian należy dodać je:

git add index.html

a następnie utworzyć commit-a:

git commit -m "Merge 002_some_content into develop"

Warto nadmienić, że w rozwiązywaniu konfliktów pomaga użycie odpowiedniego edytora np. Visual Studio Code, gdzie można porównywać zmiany, zastosować obie lub jedną z nich jednym kliknięciem (jeżeli jest to tylko możliwe).

Zaistniałą w tym przypadku sytuację opisuje następujący diagram zmian przed:

	  A---B---C topic
	 /
    D---E---F---G master

i po merge-owaniu

	  A---B---C topic
	 /         \
    D---E---F---G---H master

Komentarze