Ćwiczenie — rozwiązywanie konfliktów scalania

Ukończone

Czasami bez względu na to, jak dobrze wszystko zaplanujesz, coś pójdzie źle. Wyobraź sobie, że dwóch deweloperów pracuje nad tym samym plikiem projektu w tym samym czasie. Pierwszy deweloper wypycha zmiany do main gałęzi repozytorium projektu bez żadnego problemu. Gdy drugi deweloper próbuje wypchnąć zmiany, usługa Git twierdzi, że występuje konflikt scalania. Plik, który drugi deweloper próbuje zmodyfikować, nie jest już aktualny pod względem najnowszych zmian lub wersji pliku. Wersja pliku musi zostać zaktualizowana przed scaleniem zmian drugiego dewelopera. Deweloperzy, którzy korzystają z kontroli wersji, obawiają się więcej rzeczy niż konflikt scalania!

Takie konflikty mogą się zdarzyć, więc musisz wiedzieć, jak sobie z nimi poradzić. Dobra wiadomość jest taka, że usługa Git udostępnia rozwiązania do radzenia sobie z konfliktami scalania.

Tworzenie gałęzi dla Alicji i Boba

Zacznijmy od utworzenia gałęzi dla Alice i gałęzi boba. Obaj przyjaciele deweloperów aktualizują pliki w repozytorium projektu w tym samym czasie. Nie wiedzą o zmianach siebie, ponieważ wykonują aktualizacje w swoich lokalnych gałęziach.

  1. Upewnij się, że jesteś w katalogu Alice , a następnie utwórz gałąź o nazwie dla add-cat Alice, w której będzie działać:

    git checkout -b add-cat
    
    
  2. Przejdź do katalogu Bob , a następnie utwórz gałąź o nazwie style-cat dla Boba, aby działała w:

    cd ../Bob
    git checkout -b style-cat
    
    

Teraz wprowadźmy pewne zmiany w gałęziach.

Wprowadzanie zmiany jako Alice

Zacznij od przy założeniu roli Alicji i wprowadzenia zmiany na stronie głównej witryny internetowej. Zastąp obraz kota Boba zdjęciem Alicji.

  1. Wróć do katalogu Alice :

    cd ../Alice
    
    
  2. Jeśli zasoby nie pobrały się wcześniej, pobierz plik zip zawierający zasoby towarzyszące tej lekcji. Rozpakuj pliki zasobów:

    wget https://github.com/MicrosoftDocs/mslearn-branch-merge-git/raw/main/git-resources.zip
    unzip git-resources.zip
    
    
  3. Przenieś plik bombay-cat-180x240.jpg do katalogu Assets Alice i usuń inne pliki:

    mv bombay-cat-180x240.jpg Assets/bombay-cat-180x240.jpg
    rm git-resources.zip
    rm bobcat2-317x240.jpg
    
    
  4. Otwórz plik index.html, a następnie zastąp tę instrukcję (która używa jednego z obrazów kotów Boba):

    <img src="Assets/bobcat2-317x240.jpg" />
    

    z tą instrukcją (która używa jednego z zdjęć kotów Alicji):

    <img class="cat" src="Assets/bombay-cat-180x240.jpg" />
    
  5. Zapisz plik i zamknij edytor.

  6. Teraz uruchom następujące polecenia Git, aby wypchnąć zmiany do repozytorium projektu. Najpierw dodamy zatwierdzenia dokonane w folderze Assets . Następnie przełączymy się z powrotem do main gałęzi i uruchomimy polecenie git pull , aby upewnić się, że nic się nie zmieniło. Na koniec scalimy gałąź lokalną add-cat z gałęzią main , a następnie wypchniemy zmiany do repozytorium.

    git add Assets
    git commit -a -m "Add picture of Alice's cat"
    git checkout main
    git pull
    git merge --ff-only add-cat
    git push
    
    

Zakończ, potwierdzając, że wypychanie zakończyło się pomyślnie.

Wprowadzanie zmiany jako Bob

Nie wiedząc, co robi Alice, Bob zauważa, że ostatnie wypchnięcie Alice dodało styl CSS o nazwie cats do pliku site.css dla repozytorium. Dlatego Bob decyduje się zastosować tę klasę do swojego zdjęcia kota.

  1. Wróć do katalogu Bob :

    cd ../Bob
    
    
  2. Otwórz plik index.html. Zastąp instrukcję używającą obrazu kota Boba następującą instrukcją class="cat" , która dodaje atrybut do <img> elementu:

    <img class="cat" src="Assets/bobcat2-317x240.jpg" />
    
  3. Zapisz plik i zamknij edytor.

  4. Teraz uruchom następujące polecenia Git, aby zsynchronizować zmiany z repozytorium projektu, tak jak w przypadku aktualizacji repozytorium Alice. Zatwierdź zmianę, przejdź do main gałęzi, uruchom git pullpolecenie , a następnie scal zmianę stylu:

    git commit -a -m "Style Bob's cat"
    git checkout main
    git pull
    git merge style-cat
    
    

I jest: straszny konflikt scalania. Ten sam wiersz w tym samym pliku został zmieniony przez dwie osoby. Usługa Git widzi konflikt i zgłasza komunikat "Automatyczne scalanie nie powiodło się". Usługa Git nie ma możliwości ustalenia, czy src atrybut w elemencie <img> powinien odwoływać się do pliku bobcat2-317x240.jpg , czy pliku bombay-cat-180x240.jpg .

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

Dane wyjściowe z usługi Git identyfikują plik index.html jako źródło konfliktu.

Teraz pytanie brzmi: Co to jest Bob do zrobienia?

Rozwiązywanie konfliktu scalania

Bob w tym momencie ma kilka opcji. Bob może wykonać jedną z następujących akcji:

  • Uruchom polecenie , git merge --abort aby przywrócić main gałąź do tego, co było przed próbą scalenia. Uruchom polecenie , git pull aby pobrać zmiany Alicji. Następnie utwórz nową gałąź, wprowadź zmiany i scal gałąź z gałęzią main . Na koniec wypychają swoje zmiany.
  • Uruchom polecenie , git reset --hard aby wrócić do lokalizacji, w której znajdowały się przed rozpoczęciem scalania.
  • Rozwiąż konflikt ręcznie, korzystając z informacji wstawionych przez usługę Git do plików, których dotyczy problem.

Deweloperzy wydają się preferować ostatnią opcję. Gdy usługa Git wykryje konflikt w wersjach zawartości, wstawia obie wersje zawartości do pliku. Usługa Git używa specjalnego formatowania, aby pomóc w zidentyfikowaniu i rozwiązaniu konfliktu: nawiasy lewego kąta, podwójne kreski (znaki równości) =======i nawiasy <<<<<<<kątowe >>>>>>>po prawej stronie. Zawartość powyżej wiersza kresków ======= pokazuje zmiany w gałęzi. Zawartość poniżej wiersza separatora pokazuje wersję zawartości w gałęzi, z którą próbujesz scalić.

Oto jak wygląda plik index.html w repozytorium Boba. Zwróć uwagę na specjalne formatowanie zawartości z konfliktami:

<!DOCTYPE html>
<html>
  <head>
    <meta charset='UTF-8'>
    <title>Our Feline Friends</title>
    <link rel="stylesheet" href="CSS/site.css">
  </head>
  <body>
    <nav><a href="./index.html">home</a></nav>
    <h1>Our Feline Friends</h1>
    <<<<<<< HEAD
    <img class="cat" src="Assets/bombay-cat-180x240.jpg">
    =======
    <img class="cat" src="assets/bobcat2-317x240.jpg">
    >>>>>>> style-cat
    <footer><hr>Copyright (c) 2021 Contoso Cats</footer>
  </body>
</html>

Rozwiążmy konflikt scalania, edytując plik index.html . Ponieważ ten konflikt scalania jest szybkim rozwiązaniem, zmiany zostaną zmienione bezpośrednio w main gałęzi, mimo że nadal jesteś w katalogu Bob .

  1. Otwórz plik index.html, a następnie usuń specjalne wiersze formatowania. Nie usuwaj żadnych innych instrukcji.

    <<<<<<< HEAD
    =======
    >>>>>>> style-cat
    
  2. Zapisz plik i zamknij edytor.

    Plik index.html ma teraz dwa <img> elementy: jeden dla obrazu kota Boba i jeden dla Alicji.

    Niektóre edytory tekstów oferują integrację z usługą Git i oferują pomoc w przypadku wyświetlenia tekstu wskazującego konflikt scalania. Jeśli otworzysz plik index.html w programie Visual Studio Code, zobaczysz następujący kod:

    Zrzut ekranu przedstawiający sposób rozwiązywania konfliktów scalania w programie Visual Studio Code.

    Jeśli wybierzesz pozycję Zaakceptuj oba zmiany, edytor usunie wiersze wokół <img> elementów i pozostawi oba elementy nienaruszone.

  3. Uruchom następujące polecenia, aby zatwierdzić zmianę:

    git add index.html
    git commit -a -m "Style Bob's cat"
    
    

    Polecenie git add informuje usługę Git, że konflikt w pliku index.html został rozwiązany.

  4. Wypchnij zmiany do main gałęzi na zdalnym:

    git push
    
    
  5. Zakończ, synchronizując zmiany z repozytorium Alice:

    cd ../Alice
    git pull
    
    
  6. Na koniec otwórz plik index.html Alice i upewnij się, że ich wersja ma również dwa <img> tagi ze zdjęciami kotów.