Git jako najpopularniejszy rozproszony system kontroli wersji – może się pochwalić rozbudowanym zbiorem funkcjonalności oraz różnego rodzaju integracji – co pozwala wykorzystać go swobodnie w wielu codziennych zadaniach.
W ramach tego materiału dowiesz się jak odświeżać stan gałęzi (ang. git fetch) i scalać go ze swoim lokalnym repozytorium (ang. git pull) oraz czym różnią się te dwie operacje.
Spis treści
- 1 Git fetch vs. pull – wprowadzenie
- 2 Git install – instalacja Git
- 3 Git i Git branch
- 4 Git fetch remote branch – pobieranie danych ze zdalnego repozytorium
- 5 Git pull remote branch – pobieranie i integrowanie zmian
- 6 Git force pull – wymuszenie pobierania i integrowania zmian
- 7 Git fetch vs. git pull
- 8 Git fetch | Git pull – pobieranie danych
- 9 20+ BONUSOWYCH materiałów z programowania
Git fetch vs. pull – wprowadzenie
Z tego materiału dowiesz się:
- Czym jest git fetch?
- Czym jest git pull?
- Co różni git fetch oraz git pull?
Git install – instalacja Git
Jeżeli nie masz jeszcze Gita zainstalowanego lokalnie – szybko możesz to nadrobić.
W poniższym materiale znajdziesz instrukcję, jak można to zrobić.
➡ ZOBACZ 👉: Install Git – Instalacja Git, Windows, Ubuntu – Bash, GUI
Git i Git branch
W ramach tego materiału zajmiemy się przede wszystkim pobieraniem przez gałęzie danych (git fetch oraz git pull) – natomiast kompletny tutorial Git i
Git branch znajdziesz poniżej.
➡ ZOBACZ:
👉 Git tutorial | stash, rebase, commit, merge, checkout, push i clone
👉 Git branch | git branch create, rename, delete, checkout, merge
Git fetch remote branch – pobieranie danych ze zdalnego repozytorium
Git fetch jest to narzędzie pobierające zmiany ze zdalnego repozytorium – wszystkie nowe dane z commitów, które zostały wykonane od czasu ostatniej synchronizacji ze zdalnym repozytorium, są pobierane do kopii lokalnej. Jednak – nowo pobrane dane nie są integrowane z plikami lokalnymi, a zmiany nie są mergowane z naszym kodem.
Patrząc na zdalne gałęzie i commit’y, musisz pamiętać, że patrzysz na „migawkę” (ang. snapshot) danych. Nie istnieje stałe i nieprzerwane połączenia „na żywo” ze zdalnym repozytorium.
Zamiast tego, Git zapisuje najnowsze informacje o Twoich zdalnych gałęziach za każdym razem, gdy wykonywana jest operacja fetch. Oznacza to, że informacje o zdalnych gałęziach i commitach, które widzisz, są tak świeże, jak ostatnia pobrana migawka zdalnego repozytorium.
Aby zobaczyć nowe zdalne gałęzie, commit’y, tagi itp., musisz wyraźnie powiedzieć Gitowi, aby pobrał te informacje – za pomocą git fetch.
W zależności od Twoich potrzeb i sytuacji możesz użyć jednej z poniższych opcji, aby pobrać dane:
- Git fetch origin – pobiera wszystkie gałęzie, również wszystkie commit’y i pliki ze zdalnego repozytorium.
- Git fetch origin <nazwa brancha> – pobiera dane z określonej zdalnej gałęzi.
Przydatnym parametrem jest również ––prune. Parametr ten nakazuje Gitowi usunięcie wszelkich odwołań (referencji) do gałęzi, które już nie istnieją na zdalnym repozytorium. To gwarantuje, że nie będziesz patrzył na nieaktualne dane.
Git fetch origin --prune
Git pull remote branch – pobieranie i integrowanie zmian
Git pull służy do pobierania (git fetch) i integrowania (git merge) zdalnych zmian.
Kiedy przy projekcie pracuje kilka, a może i więcej osób, to zmiany są przyłączane do zdalnego repozytorium z dosyć dużą częstotliwością – a to hotFix, bugFix a może i nowa funkcjonalność wleci. Twoje lokalne repozytorium nie odświeża się na bieżąco. Jest ono migawką (ang. snapshot) zdalnego repozytorium w określonym momencie. Wyobraź sobie, że pracujesz nad jakimś fragmentem kodu od kilku dni. Od tego czasu Twoje lokalne repozytorium nie było odświeżane o dane ze zdalnego repo. Przez kilka dni tak naprawdę może się dużo zadziać w projekcie. Dlatego warto zaciągnąć zmiany (git pull), aby nasze lokalne repo było jak najbardziej aktualne, żeby nie doprowadzić do sytuacji, w której podczas push’a powstanie mnóstwo konfliktów.
Domyślne git pull używa git merge, istnieje jednak możliwość skonfigurowania go tak, aby używał git rebase. Jeżeli odczujesz potrzebę, by zrobić taką podmiankę, użyj flagi ––rebase.
Git pull --rebase
W codziennej pracy programisty powinniśmy stosować szereg dobrych praktyk, które ułatwią nam, jak i innym codzienną pracę. Jedną z nich jest stosowanie git pull. Dobrze jest użyć go:
- przed rozpoczęciem pracy (aby posiadać najnowsze zmiany),
- przed wykonaniem git push (aby uniknąć ewentualnych konfliktów).
Ciekawą flagą jest także ––all. Git pull ––all pobiera dane ze wszystkich zdalnych gałęzi na zdalnym repozytorium.
Git force pull – wymuszenie pobierania i integrowania zmian
Pracując nad projektem z zespołem w momencie, kiedy próbujesz wykonać pull’a na swoim lokalnym repozytorium, możesz natknąć się na komunikaty o konfliktach, które uniemożliwiają Ci zrobienie pull’a:
Powód powstania takich komunikatów o konfliktach jest dość prosty: mam lokalne zmiany, które zostaną nadpisane przez nadchodzące nowe zmiany, które przyniesie git pull.
Ze względów bezpieczeństwa Git nigdy po prostu nie nadpisze Twoich zmian. Git nie ma funkcji „force pull” – ale istnieje możliwość wykonania kilka kroków, które pozwolą „zasymulować” takie polecenie.
1. Posprzątaj swój katalog roboczy
Musisz doprowadzić swój katalog roboczy do stanu, w którym nie będzie zawierał zmian, które spowodowały konflikt.
Jedną z opcji jest cofnięcie ich używając polecenia git reset –hard. Pamiętaj, że polecenie to usunie również historię usuniętych zmian.
Jeżeli chcesz lepiej poznać polecenie git reset –hard, sprawdź koniecznie:
➡ ZOBACZ 👉: Git reset | git reset hard, git reset to origin
Gdy stwierdzisz jednak, że Twoje zmiany będą Ci jeszcze potrzebne, możesz zapisać lokalne zmiany w skrytce (ang. stash).
W Stash’u zmiany będą dostępne na wypadek, gdybyś chciał je odzyskać w późniejszym terminie.
Git stash --include-untracked
Jeśli masz również nieśledzone zmiany (ang. untracked), będziesz musiał użyć polecenia git clean, aby się ich również pozbyć. Używając tej komendy, musisz pamiętać o tym, że zmiany usuniesz bezpowrotnie, dlatego stosuj ją przemyślanie.
Git clean -fd
2. Wykonaj ponownie pull’a
Kiedy pozbyłeś się zmian powodujących konflikty i usunąłeś nieśledzone zmiany, możesz w końcu ściągnąć i przyłączyć zdalne zmiany do swojego lokalnego repozytorium.
Git fetch vs. git pull
Aby lepiej zrozumieć różnicę pomiędzy git fetch a git pull spójrzmy na poniższą grafikę.
Git fetch updatuje dane do lokalnego repozytorium natomiast git pull robi update lokalnego repozytorium, jak i kopii roboczej.
Git fetch | Git pull – pobieranie danych
W ramach tego materiału przećwiczyliśmy sposoby na pobieranie danych (git fetch) oraz na jednoczesne pobieranie i scalanie danych (git pull).
Jeżeli chcesz kontynuować swoją przygodę z gitem – to zapraszam do dodatkowych materiałów:
➡ ZOBACZ 👉: Git tutorial | stash, rebase, commit, merge, checkout, push i clone
20+ BONUSOWYCH materiałów z programowania
e-book – „8 rzeczy, które musisz wiedzieć, żeby dostać pracę jako programista”,
e-book – „Java Cheat Sheet”,
checklista – „Pytania rekrutacyjne”
i wiele, wiele wiecej!
5 Comments
Fajny, konkretny artykuł. Czytając go, człowiek wie o co chodzi, a jak da się zauważyć na podobnych blogach raczej nie jest to regułą. Myślę, że będę tu wchodzić częściej i mam przeczucie, że się nie zawiodę 🙂
Cześć Cezary. Dziękuję! 🙂
Zapraszam częściej!
Case study:
1. zrobiłem git pull na developie (aby mieć aktualnego developa lokalnie).
2. zrobiłem gałąź od developa, na której będę pracował
3. w czasie mojej pracy develop został zaktualizowany przez inne osoby w zespole
4. zanim zmerguje swój branch do developa to chciałbym, aby był on aktualny
5. będąc na swoim branchu wpisuję git pull i dostaję komunikat że wszystko jest up to date (nie pobrało żadnych zmian)
6 robiąc merge mam konflikty
Zatem jak zrobić prawidłowo tego git pulla, aby mój develop w momencie mergowania był faktycznie aktualny? Jestem świeży w temacie gita więc byłbym wdzięczny za rozpisanie tego łopatologicznie krok po kroku.
Cześć.
Punkt 5 – zrobiłeś git pull na Twoim branchu – a jego nikt nie modyfikował, dlatego nic nie pobrałeś.
Jeżeli ktoś inny zmodyfikował ten sam fragment co Ty – to musi dojść do konfliktu.
Co prawda może on zostać automatycznie rozwiązany – jeżeli np. będziecie modyfikowali inne fragmenty tego samego pliku.
Diagram bardzo pomocny jak i cały art.! dzięki!
Liczę na więcej 🙂