Archiwa tagu: Eclipse

Git: przedzieram się przez gałęzie

System kontroli wersji Git był tematem dwóch niedawnych wpisów na moim blogu: No i Git! Kontrola wersji służy nie tylko programistom oraz Git w Eclipse. W tym odcinku chcę na jakiś czas zamknąć temat. Skoncentruję się na kwestii odgałęzień w kodzie (branches).

Git pozwala na przyjemną i efektywną pracę z branchami. Łatwo je tworzyć, scalać i usuwać. Wczoraj zabrałam się za tworzenie szkieletu mojej konkursowej aplikacji Szafbook i wykorzystałam to jako pretekst do poeksperymentowania z odgałęzieniami.

Ogólny zarys moich działań
  1. Utworzenie nowego brancha w konsoli.
  2. W ramach brancha: przygotowanie szkieletu aplikacji Spring Boot za pomocą serwisu https://start.spring.io/.
  3. Wcielenie zmian z nowego brancha do głównej linii kodu (konsola).
  4. Utworzenie brancha przez interfejs Eclipse.
  5. W ramach brancha: prace mające doprowadzić kod do stanu, w którym się kompiluje.
  6. Wcielenie zmian z nowego brancha do głównej linii kodu (Eclipse).
  7. Ustalenie, dlaczego nie było mi potrzebne słowo rebase.
Konsola

W oparciu o informacje w odpowiednim rozdziale podręcznika, tworzę nową gałąź (o nazwie bootinit):

Powyższe polecenie jest skrótem dla dwóch innych, z których pierwsze tworzy brancha, a drugie mnie do niego przenosi:

Następnie wprowadzam swoje zmiany. W tym wypadku to wrzucenie szkieletu aplikacji webowej do katalogu projektowego oraz usunięcie niepotrzebnych mi już plików.

Po wprowadzeniu zmian polecenie git status zwraca następującą informację):

5
Wynik wywołania polecenie git status w nowej gałęzi po wprowadzeniu zmian

Chcę śledzić wszystkie te zmiany i chcę je uwzględnić w kolejnym commicie, dlatego dodaję wszystko:

Alternatywnie mogłabym zaznaczyć poszczególne zmienione i dodane pliki poleceniem git add <plik>, a usunięte pliki poleceniem git rm <plik>.

Na tym etapie postanawiam wysłać swoje zmiany do repozytorium:

Załóżmy, że moje prace w gałęzi bootinit osiągnęły taki poziom dojrzałości, że chcę scalić je z główną gałęzią kodu (master).

W tym celu muszę przejść do gałęzi, do której mam wrzucić zmiany i tam wywołać polecenie merge.

8
Merge. Kolory bardzo przyjemne

Jeśli gałąź nie będzie mi już potrzebna, mogę ją usunąć:

I już.

Eclipse

Teraz przerzucam się na pracę w środowisku Eclipse. Na początku importuję istniejący projekt z repozytorium Git.

W Eclipse narzędzia związane z kontrolą wersji znajdują się w menu kontekstowym projektu, w zakładce Team.

Kontrola wersji w Eclipse
Kontrola wersji w Eclipse

Tworzę nową gałąź korzystając z opcji wyświetlonej na powyższym obrazku: Team->Switch To->New Branch

Nazwa aktualnej gałęzi jest wyświetlana przy nazwie projektu.

Nazwa aktualnej gałęzi jest wyświetlana przy nazwie projektu.
Wersja projektu w gałęzi eclipsebranchtest

Dalej wprowadzam swoje zmiany. Przed wszystkim chcę doprowadzić aplikację do stanu, w którym kompiluje się bez błędów (za pomocą Mavena) i zawiera chociaż jeden (bezsensowny na razie) test jednostkowy.

Jedna ze zmian to oznaczenie części plików w katalogu projektu jako ignorowanych – mam na myśli pliki stanowiące wynik kompilacji. W systemie kontroli wersji chcę trzymać tylko źródła.  W menu mamy odpowiednią opcję Ignore, która jest powiązana ze zrozumiałym dla Gita plikiem .gitignore.

Praca w ramach jednej gałęzi została już umówiona w poprzednim wpisie. Załóżmy teraz, że wszystkie zmiany zostały wysłane do repozytorium, a prace w ramach nowej gałęzi eclipsebranchtest zostały zakończone.

Podobnie jak w przypadku pracy w konsoli, najpierw muszę przejść do gałęzi, do której chcę wcielić zmiany (w tym wypadku to master). Tam z menu Team wybieram opcję Merge. Pojawi się okienko przedstawione na poniższym obrazku.

Wybór gałęzi do scalenia
Wybór gałęzi do scalenia. Wybieram eclipsebranchtest

No i to by było na tyle! Mogę jeszcze usunąć niepotrzebną już gałąź w Team->Advanced->Delete Branch.

Rebase

Spodziewałam się, że podczas zabawy z branchami dotrę do momentu, w którym potrzebne stanie się słówko rebase, ale tak się nie stało. Nie pozostało mi nic innego jak RTFM. Oto, co ustaliłam (w wielkim skrócie):

Scalać można albo przy użyciu merge, albo rebase.  W zależności od dokonanego wyboru, inaczej będzie wyglądała historia zmian w projekcie. Po merge historia będzie dokładnie odwzorowywała to, co się działo – wszystkie rozgałęzienia i powroty. Dla odmiany rebase pozwala nieco przepisać historię, w taki sposób, że – mimo pracy w odgałęzieniach – wygląda ona na liniową. Nie jest to prawda historyczna, ale ta forma może okazać się znacznie bardziej czytelna.

[edit: popełniłam jeszcze jeden wpis na temat rebase]

PS.

Wrócę z tematem Gita, jak dorobię się pierwszego poważnego konfliktu w kodzie.

Git w Eclipse

W poprzednim wpisie nauczyłam się – a może przy okazji chociaż jednego Czytelnika – jak kontrolować wersje programu przy użyciu systemu Git i serwisu GitHub. Dzisiaj postanowiłam sprawdzić, jak powiązać repozytorium Git ze środowiskiem programistycznym Eclipse, w którym zamierzam rozwijać swój projekt. Szczególnie ciekawiło mnie, w jaki sposób Eclipse rozwiązuje kwestię dwóch poziomów repozytorium: lokalnego na dysku i zdalnego w chmurze (GitHub).

Gdyby na tym etapie ktoś chciał zwrócić mi uwagę, że rozwijam swój projekt od d**y strony, to uprzejmie informuję, że jestem tu imperatorem. Moim celem jest przede wszystkim nauczenie się czegoś w przyjemny sposób. Jeśli kiedyś w końcu wyjdzie z tego produkt – tym lepiej.

Poniżej przedstawiam kroki potrzebne do powiązania mojego kodu w GitHub z projektem w środowisku Eclipse.

  1. Instalacja Eclipse, oczywiście. W moim przypadku jest to wersja Mars dla programistów Java Enterprise Edition. Nie twierdzę, że to bezsprzecznie najlepsze IDE, ale zamierzam używać go w konkursowym projekcie. Tutaj można znaleźć opisy najpopularniejszych darmowych edytorów dla Javy (po angielsku).
  2. Instalacja w Eclipse narzędzia EGit.

    Help->Install New Software
    Help->Install New Software->http://download.eclipse.org/egit/updates/
  3. Stworzenie nowego projektu w oparciu o istniejący kod.

    import
    File->Import->Projects from Git
  4. Wybranie jednej z dwóch opcji: nowe lokalne repozytorium z kodem z GitHub (clone) lub istniejące lokalne repozytorium powiązane wcześniej z GitHub (np. to, które stworzyłam w konsoli na potrzeby poprzedniego wpisu).

    clone
    Klonowanie!
  5. Podanie adresu projektu w GitHub

    clone2
    W przypadku publicznego repozytorium w GitHub wystarczy podać link
  6. Wybór gałęzi – u mnie na razie jest tylko jedna, główna.

    clone3
    Co by tu wybrać?
  7. Podziwianie zaimportowanego projektu.

    project
    Tak wygląda projekt zsynchronizowany z repozytorium Git
  8. Zmiany w kodzie. Zmodyfikowałam treść jednego pliku i dodałam jeden nowy. EGit natychmiast bardzo wyraźnie sygnalizuje te zmiany.

    project2
    Jeden plik zmieniony, jeden plik utworzony, ale jeszcze nie wersjonowany
  9. Wyświetlenie menu kontroli wersji (opcja Team w menu kontekstowym projektu). Ponieważ chcę dodać do kolejnego commita wszystkie wprowadzone zmiany, wybieram opcję Add to Index (w konsoli to git add).

    team1
    Menu kontroli wersji w projekcie
  10. Zmieniły się ikonki! Zmiany zostały oznaczone jako zaplanowane do wysyłki (staged), ale ciągle nie nastąpił commit.

    team2
    Przed commitem
  11. Wybranie z menu opcji Commit. Do wyboru mamy – i to jest moment, na który czekałam – wysłanie zmian tylko do lokalnego repozytorium, bądź wysłanie ich i lokalnie, i dalej, do GitHub.

    team3
    Wysyłamy zmiany
  12. Mniej więcej na tym etapie nastąpi wreszcie prośba o logowanie.

    credentials
    To repozytorium jest otwarte dla wszystkich do odczytu, ale tylko wybrańcom wolno wysyłać do niego kod
  13. Zdecydowałam się na wysyłkę z jednoczesnym wypchnięciem kodu do GitHub (może niezbyt rozsądnie, ale wszystko to w ramach eksperymentu). Sprawdzę teraz, czy moje zmiany są widoczne w serwisie.

    github
    Co słychać w GitHub? Wprawne oko zauważy w commicie plik, o którym nie wspominałam wcześniej. Zagadka: dlaczego tam trafił?
  14. Historię zmian mogę podejrzeć także od strony IDE.

    view
    Praca wre

Jak na razie, wszystko przebiegło bardzo intuicyjnie. W najbliższym czasie postaram się utworzyć rozłączne gałęzie kodu z konfliktującymi zmianami (tu wstaw szatański śmiech).

Więcej informacji na temat korzystania z EGit znajdziesz w instrukcji użytkownika.

PS. Mam bardzo silne skojarzenie z wyrazem eclipse (zaćmienie). W wieku wczesnonastoletnim, podczas wakacji nad polskim morzem, namówiłam tatę i siostrę na pójście do kina. Grali akurat film z młodym Leo DiCaprio, w którym kochała się połowa podstawówki. Film nazywał się Całkowite zaćmienie i traktował, jak się okazało, o zakazanej homoseksualnej miłości.  Obejrzenie tego w obecności rodzica zdecydowanie plasuje się w top 5 najbardziej żenujących sytuacji w moim życiu.