Close

git fetch

Polecenie git fetch umożliwia pobranie commitów, plików i odwołań z repozytorium zdalnego do lokalnego. Pobieranie umożliwia sprawdzenie, nad czym pracują inni użytkownicy. Przypomina to polecenie svn update, umożliwiając sprawdzenie postępów w historii centralnej, lecz nie wymaga scalania zmian z repozytorium. Git izoluje pobraną treść od istniejącej treści lokalnej; w efekcie nie wpływa na stan lokalnych prac programistycznych. Pobraną treść należy wyewidencjonować za pomocą polecenia git checkout. Dzięki temu pobieranie stanowi bezpieczny sposób kontroli commitów przed ich zintegrowaniem w lokalnym repozytorium.

Pobranie treści ze zdalnego repozytorium umożliwiają polecenia git pull i git fetch. Polecenie git fetch można uznać za opcję „bezpieczną”. Pozwala pobrać treść zdalną, ale nie aktualizuje stanu roboczego lokalnego repozytorium, co chroni przed dokonaniem zmian w pracach lokalnych. Polecenie git pull stanowi bardziej agresywną alternatywę: umożliwia pobranie treści zdalnej dla aktywnej gałęzi lokalnej i natychmiastowe wykonanie polecenia git merge w celu utworzenia commitu scalania dla nowej treści zdalnej. W przypadku występowania oczekujących zmian spowoduje to konflikty i rozpoczęcie przepływu rozwiązywania konfliktów scalania.


Jak działa polecenie git fetch z gałęziami zdalnymi


Aby lepiej zrozumieć sposób działania polecenia git fetch, omówmy, w jaki sposób Git organizuje i przechowuje commity. W katalogu ./.git/objects repozytorium system Git przechowuje wszystkie commity lokalne i zdalne. Git zachowuje ich odrębność dzięki odwołaniom do gałęzi. Odwołania do gałęzi lokalnych są przechowywane w katalogu ./.git/refs/heads/. Wykonanie polecenia git branch spowoduje wyświetlenie listy odwołań do gałęzi lokalnych. Poniżej przedstawiono przykładowy wynik polecenia git branch z użyciem przykładowych nazw gałęzi.

git branch
main
feature1
debug2

Po sprawdzeniu okaże się, że zawartość katalogu /.git/refs/heads/ jest podobna.

ls ./.git/refs/heads/
main
feature1
debug2
Okno konsoli
materiały pokrewne

Zaawansowany dziennik Git

Logo Bitbucket
POZNAJ ROZWIĄZANIE

Poznaj środowisko Git z rozwiązaniem Bitbucket Cloud

Gałęzie zdalne są podobne do lokalnych, ale odwzorowują commity z repozytorium innej osoby. Aby uniknąć pomylenia z gałęziami lokalnymi, nazwy gałęzi zdalnych poprzedza nazwa elementu zdalnego, do którego należą. Podobnie jak w przypadku gałęzi lokalnych system Git zawiera także odwołania do gałęzi zdalnych. Odwołania do gałęzi zdalnych znajdują się w katalogu ./.git/refs/remotes/. Poniższy przykładowy fragment kodu przedstawia gałęzie widoczne po pobraniu repozytorium zdalnego o nazwie remote-repo:

git branch -r
# origin/main
# origin/feature1
# origin/debug2
# remote-repo/main
# remote-repo/other-feature

Dane wyjściowe zawierają sprawdzone wcześniej gałęzie lokalne, ale teraz na początku nazwy widnieje zwrot origin/. Ponadto widzimy gałęzie zdalne poprzedzone zwrotem remote-repo. Gałąź zdalną można wyewidencjonować tak jak lokalną, ale powoduje to utworzenie stanu odłączonego wskaźnika HEAD (podobnie jak w przypadku wyewidencjonowania starszego commitu). Można powiedzieć, że są to gałęzie „tylko do odczytu”. Aby wyświetlić gałęzie zdalne, wystarczy dodać flagę -r do polecenia git branch.

Gałęzie zdalne można sprawdzić za pomocą standardowych poleceń git checkout i git log. Jeżeli zatwierdzisz zmiany zawarte w gałęzi zdalnej, możesz je scalić z gałęzią lokalną za pomocą standardowego polecenia git merge. Inaczej niż w przypadku modelu SVN synchronizacja repozytorium lokalnego ze zdalnym to proces dwuetapowy: pobieranie i scalanie. Polecenie git pull to wygodny sposób skrócenia tej procedury.

Git — polecenia pobierania i opcje


git fetch <remote>

Pobranie wszystkich gałęzi z repozytorium. Umożliwia także pobranie wszystkich wymaganych zatwierdzeń oraz plików z drugiego repozytorium.

git fetch <remote> <branch>

Działa tak samo jak polecenie powyżej, ale pobiera tylko określoną gałąź.

git fetch --all

Zaawansowane polecenie, które powoduje pobranie wszystkich zarejestrowanych elementów zdalnych oraz ich gałęzi:

git fetch --dry-run

Opcja --dry-run umożliwia próbne uruchomienie polecenia. Przedstawi przykłady działań, jakie zostaną wykonane podczas pobierania, ale ich nie zastosuje.

Przykłady poleceń pobierania w środowisku Git


git fetch — gałąź zdalna

W poniższym przykładzie przedstawiamy sposób pobrania gałęzi zdalnej i aktualizacji lokalnego stanu prac dotyczących treści zdalnej. Na potrzeby tego przykładu załóżmy, że istnieje centralne repozytorium źródłowe, z którego sklonowano repozytorium lokalne za pomocą polecenia git clone. Przyjmijmy także, że utworzono dodatkowe repozytorium zdalne o nazwie coworkers_repo zawierające gałąź feature_branch, którą skonfigurujemy i pobierzemy. Uwzględniając te założenia, przejdźmy do dalszej części przykładu.

Najpierw należy skonfigurować zdalne repozytorium za pomocą polecenia git remote.

git remote add coworkers_repo git@bitbucket.org:coworker/coworkers_repo.git

W tym przypadku utworzyliśmy odniesienie do repozytorium współpracownika, używając adresu URL repozytorium. Teraz przekażemy zdalną nazwę do polecenia git fetch, aby pobrać zawartość.

git fetch coworkers_repo coworkers/feature_branch
fetching coworkers/feature_branch

Następnie dostępną lokalnie zawartość gałęzi coworkers/feature_branch musimy zintegrować z lokalną kopią roboczą. Zacznijmy od użycia polecenia git checkout, aby wyewidencjonować nowo pobraną gałąź zdalną.

git checkout coworkers/feature_branch
Note: checking out coworkers/feature_branch'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

git checkout -b <new-branch-name>

Dane wyjściowe operacji wyewidencjonowania wskazują, że jesteśmy w stanie odłączonego wskaźnika HEAD. To oczekiwany wynik, który oznacza, że nasze odwołanie HEAD wskazuje na odwołanie, które nie jest zgodne z naszą historią lokalną. Skoro odwołanie HEAD wskazuje na odwołanie coworkers/feature_branch, możemy z niego utworzyć nową gałąź. Wynik „detached HEAD” wskazuje, jak tego dokonać za pomocą polecenia git checkout:

git checkout -b local_feature_branch

Utworzyliśmy nową gałąź lokalną o nazwie local_feature_branch, która powoduje, że aktualizacje HEAD wskazują na najnowszą zawartość zdalną, w związku z czym możemy kontynuować programowanie od tego miejsca.

Synchronizacja źródła za pomocą polecenia git fetch

Następny przykład przedstawia typowy przepływ pracy synchronizacji repozytorium lokalnego z gałęzią główną repozytorium centralnego.

git fetch origin

Spowoduje to wyświetlenie pobranych gałęzi:

a1e8fb5..45e66a4 main -> origin/main
a1e8fb5..9e8ab1c develop -> origin/develop
* [new branch] some-feature -> origin/some-feature

Commity z tych nowych gałęzi zdalnych przedstawiono na poniższym schemacie jako kwadraty, a nie kółka. Jak widać, polecenie git fetch daje dostęp do całej struktury gałęzi innego repozytorium.

Schemat pochodzenia gałęzi głównych

Aby zobaczyć, jakie commity zostały dodane do elementu głównego na wyższym poziomie, można uruchomić polecenie git log z filtrem origin/main:

git log --oneline main..origin/main

Do zatwierdzenia zmian i ich scalenia z lokalną gałęzią główną służą następujące polecenia:

git checkout main
git log origin/main

Następnie można użyć polecenia git merge origin/main:

git merge origin/main

Gałęzie origin/main i main wskazują teraz ten sam commit, a dane są zsynchronizowane z kodem na wyższym poziomie.

Git fetch — podsumowanie


Podsumowując, git fetch to podstawowe polecenie do pobierania zawartości z repozytorium zdalnego. Polecenia git fetch używa się razem z poleceniami git remote, git branch, git checkout i git reset, aby zaktualizować repozytorium lokalne do stanu zdalnego. Polecenie git fetch to istotny element przepływów pracy w systemie Git opartych na współpracy. Działa podobnie jak git pull, z tym że polecenie git fetch można uznać za bezpieczniejsze.


Udostępnij ten artykuł
Następny temat

Zalecane lektury

Dodaj te zasoby do zakładek, aby dowiedzieć się więcej na temat rodzajów zespołów DevOps lub otrzymywać aktualności na temat metodyki DevOps w Atlassian.

Ludzie współpracujący przy ścianie pełnej narzędzi

Blog Bitbucket

Ilustracja DevOps

Ścieżka szkoleniowa DevOps

Demonstracje funkcji z ekspertami Atlassian

Zobacz, jak Bitbucket Cloud współpracuje z Atlassian Open DevOps

Zapisz się do newslettera DevOps

Thank you for signing up