Mam gałąź master
i development
gałąź, obie przesyłane do GitHub . Mam clone
d, pull
ed i fetch
ed, ale pozostają w stanie dostać coś innego niż master
tyłu oddziału.
Jestem pewien, że brakuje mi czegoś oczywistego, ale przeczytałem instrukcję i wcale nie czerpię radości.
git
github
git-branch
git-clone
remote-branch
Peter Coulton
źródło
źródło
git branch -a
) pokazuje gałęzie na pilocie, ale jeśli spróbujesz sprawdzić którekolwiek z nich, będziesz w stanie „odłączonej HEAD”. Następna odpowiedź w dół (drugi najbardziej pozytywny) odpowiada na inne pytanie (a mianowicie: jak wyciągnąć wszystkie gałęzie, i to znowu działa tylko dla tych, które śledzisz lokalnie). Kilka komentarzy wskazuje, że można przeanalizowaćgit branch -a
wyniki za pomocą skryptu powłoki, który lokalnie śledziłby wszystkie zdalne gałęzie. Podsumowanie: Nie ma natywnego sposobu na robienie tego, co chcesz, i tak może nie być tak świetny pomysł.scp [email protected]:/home/some_user/project_folder ~
Nie jestem pewien, czy to rozwiązanie działa w przypadku github ...Odpowiedzi:
Najpierw sklonuj zdalne repozytorium Git i włóż do niego cd :
Następnie spójrz na lokalne oddziały w swoim repozytorium:
Ale w twoim repozytorium są inne gałęzie! Możesz je zobaczyć za pomocą
-a
flagi:Jeśli chcesz po prostu rzucić okiem na odgałęzienie, możesz to sprawdzić bezpośrednio:
Ale jeśli chcesz pracować nad tym oddziałem, musisz utworzyć lokalny oddział śledzenia, który jest wykonywany automatycznie przez:
i zobaczysz
Ta ostatnia linia rzuca niektórym ludziom: „Nowa gałąź” - co? To tak naprawdę oznacza, że gałąź jest pobierana z indeksu i tworzona lokalnie dla Ciebie. Poprzednia linia jest rzeczywiście bardziej pouczające, jak mówi, że oddział jest skonfigurowany do śledzenia zdalnego oddział, który zwykle oznacza pochodzenie / branch_name oddział
Teraz, jeśli spojrzysz na swoje lokalne oddziały, zobaczysz to:
Możesz faktycznie śledzić więcej niż jedno zdalne repozytorium za pomocą
git remote
.W tym momencie sprawy stają się dość szalone, więc biegnij,
gitk
aby zobaczyć, co się dzieje:źródło
Jeśli masz wiele zdalnych gałęzi, które chcesz pobrać jednocześnie:
Teraz możesz kasować dowolną gałąź, tak jak potrzebujesz, bez konieczności odwiedzania zdalnego repozytorium.
źródło
git pull --all
zrobi to samo - po prostu nie da się pobrać dwa razy. I infosec812 ma rację, że to i tak nie odpowiada na pytanie. Zastanawiam się, skąd tyle głosów.git remote update
, a potem spróbowałemgit branch
, widzę tylko lokalne oddziały. Ale jeśli to zrobięgit branch -a
, mogę teraz zobaczyć odległe gałęzie i mogę zrobić,git pull <branchname>
aby uzyskać gałąź, którą chcę. - Wylądowałem na tym pytaniu z wyszukiwarki Google i ta odpowiedź rozwiązuje mój problem.Ten skrypt Bash pomógł mi:
Stworzy gałęzie śledzące dla wszystkich gałęzi zdalnych, z wyjątkiem głównego (które prawdopodobnie otrzymałeś z oryginalnego polecenia klonowania). Myślę, że nadal będziesz musiał zrobić
być pewnym.
źródło
git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs
jak zwykle: przetestuj w konfiguracji przed kopiowaniemrm -rf universe as we know it
remotes/origin/
aby zachować przestrzenie nazw:for BRANCH in $(git branch -a | grep remotes | grep -v HEAD | grep -v master); do git branch --track "${BRANCH#remotes/origin/}" "${BRANCH}"; done
--mirror
Wydaje się, że użycie opcji powodujeremote
prawidłowe skopiowanie gałęzi śledzących. Jednak ustawia repozytorium jako samo repozytorium, więc musisz później przekształcić je z powrotem w normalne repozytorium.Odwołanie: Git FAQ: Jak sklonować repozytorium ze wszystkimi zdalnie śledzonymi oddziałami?
źródło
git checkout
ostatnią komendę, aby w końcu pobrać nagłówek bieżącej gałęzi na sklonowanym repozytorium. To świetna odpowiedź, zdecydowanie najlepsza. Bądź odważny, w końcu doprowadzimy cię na szczyt :-)git remote update
zrobi to ponownie. Zachowanie zmian ciągnie. Wróciłem do przekonania, że pełna kopia wymaga skryptu o jednym wierszu.git clone --mirror
jest bardzo dobry do tworzenia kopii zapasowych repozytoriów git ^ _ ^Możesz łatwo przejść do gałęzi bez użycia fantazyjnej składni „git checkout -b somebranch origin / somebranch”. Możesz po prostu zrobić:
Git automatycznie zrobi właściwą rzecz:
Git sprawdzi, czy gałąź o tej samej nazwie istnieje w dokładnie jednym pilocie, a jeśli tak, śledzi ją w taki sam sposób, jakbyś wyraźnie wskazał, że jest to gałąź zdalna. Ze strony podręcznika git-checkout w Git 1.8.2.1:
źródło
checkout
jest identyczna z nazwą gałęzi zdalnej, wszystko po „/”, to git utworzy gałąź o tej samej nazwie, wszystko po „/”, „śledzenie” tego zdalnego ? I przez śledzenie, mamy na myśli:git push
,git pull
, itd. Zostaną wykonane na tym pilocie? Jeśli jest to poprawne, rozwiń swoją odpowiedź o więcej informacji, ponieważ zgadzam się z @Daniel, ta odpowiedź zasługuje na więcej powtórzeń.git checkout --track origin/somebranch
wprost.Jeżeli chodzi o,
za pomocą
lub bardziej szczegółowe, ale łatwiejsze do zapamiętania
może być lepiej, jeśli chodzi o śledzenie zdalnego repozytorium.
źródło
Operacja pobierania powinna uzyskać wszystkie zdalne gałęzie, ale nie utworzy dla nich lokalnych gałęzi. Jeśli używasz gitk, powinieneś zobaczyć zdalne gałęzie opisane jako „piloty / origin / dev” lub coś podobnego.
Aby utworzyć gałąź lokalną na podstawie gałęzi zdalnej, wykonaj następujące czynności:
Który powinien zwrócić coś takiego:
Teraz, gdy jesteś w gałęzi programistów, polecenie „git pull” zaktualizuje lokalnego programistę do tego samego punktu, co gałąź zdalnych programistów. Pamiętaj, że pobierze wszystkie gałęzie, ale tylko tę, na której jesteś, pociągnij tylko na szczyt drzewa.
źródło
git checkout -b newlocaldev --track origin/dev
. Jeśli chcesz, aby lokalny oddział miał taką samą nazwę jak zdalny, a zdalny nie ma trudnej nazwy, możesz pominąć-b newlocaldev
. Przy domyślnymbranch.autosetupmerge
ustawieniu konfiguracji i przy założeniu, że nie masz nazwy lokalnego oddziałudev
, te dwie komendy mogą zrobić to samo:git checkout -b dev origin/dev
po prostugit checkout dev
. Wreszcie,git checkout origin/dev
nie tworzy nowej gałęzi, ale po prostu wprowadza cię w stan odłączonego HEAD.git branch -a
nadal wyświetla listę jako gałąź zdalna.Po wykonaniu polecenia „git clone git: // location” wszystkie gałęzie i tagi są pobierane.
Aby pracować nad konkretną gałęzią zdalną, zakładając, że jest to zdalny początek:
źródło
$ git branch -a
dowiedzieć się, jakie zdalne gałęzie są już dostępne.git checkout -b master origin/master
igit checkout --track origin/master
proszę?Użyj aliasów. Chociaż nie ma natywnych linijek Git, możesz zdefiniować własne jako
a następnie użyj go jako
źródło
Dlaczego widzisz tylko „master”
git clone
pobiera wszystkie zdalne gałęzie, ale nadal uważa je za „zdalne”, nawet jeśli pliki znajdują się w nowym repozytorium. Jest jeden wyjątek od tego, że proces klonowania tworzy lokalną gałąź o nazwie „master” ze zdalnej gałęzi o nazwie „master”. Domyślniegit branch
pokazuje tylko lokalne oddziały, dlatego widzisz tylko „master”.git branch -a
pokazuje wszystkie gałęzie, w tym gałęzie zdalne .Jak zdobyć lokalne oddziały
Jeśli naprawdę chcesz pracować nad oddziałem, prawdopodobnie będziesz chciał mieć jego „lokalną” wersję. Aby po prostu utworzyć oddziały lokalne ze zdalnych oddziałów (bez ich sprawdzania, a tym samym zmiany zawartości katalogu roboczego) , możesz to zrobić w następujący sposób:
W tym przykładzie
branchone
jest nazwą lokalnego oddziału, który tworzysz na podstawieorigin/branchone
; jeśli zamiast tego chcesz utworzyć lokalne oddziały o różnych nazwach, możesz to zrobić:Po utworzeniu oddziału lokalnego możesz go zobaczyć za pomocą
git branch
(pamiętaj, że nie musisz-a
widzieć oddziałów lokalnych).źródło
origin/branchone
istnieje, możesz także użyćgit checkout branchone
do utworzenia lokalnego oddziału o tej samej nazwie i ustawienia zdalnego śledzenia.Nie jest to zbyt skomplikowane, bardzo proste i proste kroki są następujące;
git fetch origin
Spowoduje to przeniesienie wszystkich zdalnych oddziałów do twojego lokalnego.git branch -a
Spowoduje to wyświetlenie wszystkich zdalnych gałęzi.git checkout --track origin/<branch you want to checkout>
Sprawdź, czy jesteś w pożądanej gałęzi, wykonując następujące polecenie;
Dane wyjściowe będą się podobać;
Zwróć uwagę na znak *, który oznacza bieżącą gałąź.
źródło
Lepiej późno niż wcale, ale oto najlepszy sposób na to:
W tym momencie masz pełną kopię zdalnego repo ze wszystkimi jego gałęziami (sprawdź za pomocą
git branch
). Możesz użyć--mirror
zamiast tego,--bare
jeśli twoje zdalne repo ma własne piloty.źródło
--bare
” Wymienione w ostatnim zdaniu nie istnieje na podanej liście poleceń.error: key does not contain a section: unset
. Odpowiedź Dave'a działa lepiej.git config --unset core.bare
właściwie ... Dla mnie wydaje się to najczystszym rozwiązaniem ze wszystkich przedstawionych tutaj odpowiedzi. Szkoda, że ma tak mało głosów poparcia ...git config --bool core.bare false
. Dlatego zamiast tego polecam odpowiedź Dave'a . Co sądzisz o odpowiedzi Dave'a ? PozdrawiamPo prostu zrób to:
Widzisz, „git clone git: //example.com/myprojectt” pobiera wszystko, nawet gałęzie, musisz je tylko sprawdzić, wtedy twoja lokalna gałąź zostanie utworzona.
źródło
Aby uzyskać wszystkie gałęzie, wystarczy użyć „git clone”.
Nawet jeśli widzisz tylko gałąź master, możesz użyć „git branch -a”, aby zobaczyć wszystkie gałęzie.
I możesz przejść do dowolnej gałęzi, którą już masz.
Nie martw się, że po „git clone” nie musisz łączyć się ze zdalnym repozytorium, „git branch -a” i „git checkout” mogą zostać pomyślnie uruchomione po zamknięciu Wi-Fi. Udowodniono więc, że po wykonaniu „git clone” skopiował on już wszystkie gałęzie ze zdalnego repozytorium. Po tym nie potrzebujesz zdalnego repo, twój lokalny ma już wszystkie kody oddziałów.
źródło
A
git clone
ma skopiować całe repozytorium. Spróbuj go sklonować, a następnie uruchomgit branch -a
. Powinien zawierać listę wszystkich gałęzi. Jeśli następnie chcesz przejść do gałęzi „foo” zamiast „master”, użyjgit checkout foo
.źródło
git clone
pobiera wszystkie zdalne gałęzie, ale tworzy tylko lokalną gałąź master. Ponieważgit branch
pokazuje tylko oddziały lokalne, musiszgit branch -a
także zobaczyć oddziały zdalne.Użyj mojego narzędzia git_remote_branch (potrzebujesz Ruby zainstalowanego na twoim komputerze). Został zbudowany specjalnie, aby ułatwić zdalne manipulowanie gałęziami.
Za każdym razem, gdy wykonuje operację w Twoim imieniu, drukuje ją na czerwono na konsoli. Z czasem w końcu wbijają się w twój mózg :-)
Jeśli nie chcesz, aby grb uruchamiał polecenia w Twoim imieniu, po prostu użyj funkcji „wyjaśnij”. Polecenia zostaną wydrukowane na konsoli zamiast wykonane dla Ciebie.
Na koniec wszystkie polecenia mają aliasy, aby ułatwić zapamiętywanie.
Zauważ, że jest to oprogramowanie alfa ;-)
Oto pomoc po uruchomieniu pomocy grb:
źródło
wszystkie odpowiedzi, które tu widziałem, są poprawne, ale istnieje znacznie czystszy sposób klonowania repozytorium i wyciągania wszystkich gałęzi na raz.
Po sklonowaniu repozytorium wszystkie informacje o gałęziach są faktycznie pobierane, ale gałęzie są ukryte. Za pomocą polecenia
możesz wyświetlić wszystkie gałęzie repozytorium i za pomocą polecenia
możesz następnie „ręcznie” pobrać je pojedynczo.
Jednak jeśli chcesz sklonować repozytorium z wieloma gałęziami, wszystkie przedstawione powyżej sposoby są długie i żmudne w odniesieniu do znacznie czystszego i szybszego sposobu, który zamierzam pokazać, chociaż jest to trochę skomplikowane. Aby to osiągnąć, musisz wykonać trzy kroki:
utwórz nowy pusty folder na swoim komputerze i klonuj kopię lustrzaną folderu .git z repozytorium:
lokalne repozytorium w folderze my_repo_folder jest nadal puste, jest teraz tylko ukryty folder .git, który można zobaczyć za pomocą polecenia „ls -alt” z terminala.
przełącz to repozytorium z pustego (pustego) do zwykłego, zmieniając wartość logiczną „gołą” konfiguracji git na false:
Chwyć wszystko, co znajduje się w bieżącym folderze i utwórz wszystkie gałęzie na komputerze lokalnym, dzięki czemu jest to normalne repo.
Teraz możesz po prostu wpisać polecenie „git branch” i możesz zobaczyć, że wszystkie gałęzie zostały pobrane.
Jest to szybki sposób klonowania repozytorium git ze wszystkimi gałęziami jednocześnie, ale nie jest to coś, co chcesz zrobić dla każdego projektu w ten sposób.
źródło
Klonowanie z lokalnego repozytorium nie będzie działać w przypadku git clone i git fetch: wiele gałęzi / tagów pozostanie nierozwiniętych.
Aby uzyskać klon ze wszystkimi gałęziami i tagami.
Aby uzyskać klon ze wszystkimi gałęziami i tagami, ale także z kopią roboczą:
źródło
OK, kiedy klonujesz swoje repozytorium, masz tam wszystkie oddziały ...
Jeśli to zrobisz
git branch
, są jakby ukryte ...Więc jeśli chcesz zobaczyć nazwę wszystkich gałęzi, po prostu dodaj
--all
flagę w ten sposób:git branch --all
lubgit branch -a
Jeśli tylko zameldujesz się w oddziale, otrzymasz wszystko, czego potrzebujesz.
Ale co jeśli gałąź utworzona przez kogoś innego po sklonowaniu?
W takim przypadku po prostu wykonaj:
git fetch
i sprawdź ponownie wszystkie gałęzie ...
Jeśli chcesz pobierać i kasować w tym samym czasie, możesz:
git fetch && git checkout your_branch_name
Utworzyłem również poniższy obrazek, aby uprościć to, co powiedziałem:
źródło
Patrząc na jedną z odpowiedzi na pytanie, zauważyłem, że można go skrócić:
Ale uwaga, jeśli jedna ze zdalnych gałęzi zostanie nazwana np. Admin_master, nie zostanie pobrana!
Dzięki bigfish za oryginalny pomysł
źródło
grep
, aby ulepszyć filtr, aby uniknąć fałszywych trafień.Kod ten ściągnie cały kod zdalnych oddziałów do lokalnego repozytorium.
źródło
Aby skopiować i wkleić do wiersza poleceń:
Dla większej czytelności:
Spowoduje to:
Na podstawie odpowiedzi z VonC .
źródło
Napisałem te małe funkcje Powershell, aby móc sprawdzić wszystkie moje gałęzie git, które są zdalnie pochodzenia.
Więcej funkcji git można znaleźć w moim repozytorium ustawień git
źródło
Oto odpowiedź, która używa awk. Ta metoda powinna wystarczyć, jeśli zostanie użyta w nowym repozytorium.
Istniejące gałęzie zostaną po prostu wyewidencjonowane lub zadeklarowane jako już w nim zawarte, ale filtry można dodać, aby uniknąć konfliktów.
Można go również modyfikować, aby wywoływał jawne
git checkout -b <branch> -t <remote>/<branch>
polecenie.Ta odpowiedź następująco Nikos C. „s pomysł .
Alternatywnie możemy zamiast tego określić zdalną gałąź. Jest to oparte na murphytalk „s odpowiedź .
Zgłasza krytyczne komunikaty o błędach dotyczące konfliktów, ale widzę je jako nieszkodliwe.
Oba polecenia można aliasować.
Korzystanie nikt dydaktycznego odpowiedzi jako punkt odniesienia, możemy mieć następujące polecenia, aby utworzyć aliasy:
Osobiście użyłbym
track-all
lubtrack-all-branches
.źródło
Musiałem zrobić dokładnie to samo. Oto mój skrypt Ruby .
źródło
Żadna z tych odpowiedzi go nie ogranicza, z wyjątkiem użytkownika, że nikt nie jest na dobrej drodze.
Miałem problem z przenoszeniem repozytorium z jednego serwera / systemu na inny. Kiedy sklonowałem repozytorium, utworzyło ono tylko lokalną gałąź dla mastera, więc kiedy przełączyłem na nowy pilot, tylko gałąź master została wypchnięta.
Dlatego te dwie metody były BARDZO przydatne. Mam nadzieję, że pomogą komuś innemu.
Metoda 1:
Metoda 2:
źródło
git clone --mirror
na oryginalnym repozytorium działa dobrze w tym celu.źródło
Git zwykle (gdy nie jest określony) pobiera wszystkie gałęzie i / lub tagi (odnośniki, patrz:)
git ls-refs
z jednego lub więcej innych repozytoriów wraz z obiektami niezbędnymi do uzupełnienia ich historii. Innymi słowy, pobiera obiekty, które są osiągalne przez obiekty już pobrane. Zobacz: co takgit fetch
naprawdę robi?Czasami możesz mieć oddziały / tagi, które nie są bezpośrednio połączone z bieżącym, więc
git pull --all
/git fetch --all
nie pomoże w takim przypadku, ale możesz je wymienić według:i pobierz je ręcznie, znając nazwy referencyjne.
Aby pobrać je wszystkie , spróbuj:
Ten
--depth=10000
parametr może pomóc, jeśli masz płytkie repozytorium.Następnie sprawdź ponownie wszystkie swoje oddziały:
Jeśli powyższe nie pomoże, musisz ręcznie dodać brakujące gałęzie do listy śledzenia (ponieważ w jakiś sposób się zgubiły):
przez
git remote set-branches
:więc może pojawić się
remotes/origin
po pobraniu:Rozwiązywanie problemów
Jeśli nadal nie możesz uzyskać niczego innego niż gałąź główna, sprawdź następujące elementy:
git remote -v
), npgit config branch.master.remote
toorigin
.origin
wskazuje właściwy adres URL za pośrednictwem:git remote show origin
(zobacz ten post ).źródło
Na początku 2017 r. Odpowiedź w tym komentarzu działa:
git fetch <origin-name> <branch-name>
obniża gałąź dla ciebie. Chociaż nie powoduje to ściągnięcia wszystkich gałęzi naraz, możesz pojedynczo wykonać tę gałąź.źródło
Oto kolejne krótkie polecenie jednowierszowe, które tworzy oddziały lokalne dla wszystkich oddziałów zdalnych:
Działa także poprawnie, jeśli śledzone są już lokalne oddziały. Możesz zadzwonić po raz pierwszy
git clone
lub później.Jeśli nie musisz mieć
master
gałęzi wyewidencjonowanej po klonowaniu, użyjźródło