Synchronizowanie lokalnego repozytorium Git ze zdalnym

297

Chcę zsynchronizować moje lokalne repozytorium ze zdalnym, aby moje lokalne repozytorium stało się w 100% kopią zdalnego - co oznacza, że ​​jeśli niektóre pliki różnią się w tych repozytoriach, zastępujemy lokalne z zdalnymi, a jeśli są pliki w lokalnych repozytoriach, które nie istnieją na pilocie, pliki lokalne zostaną usunięte.

Czy jest inny sposób na osiągnięcie tego niż zrobienie nowego klonu zdalnego repozytorium?

Podobne pytanie jak zsynchronizuj lokalne repozytorium git ze zdalnym w jednym ujęciu odrzucając lokalne zmiany / zatwierdzenia .

Axl
źródło
4
Zawsze, kiedy tu przychodzę, szukam synchronizacji widelca
Martin Thoma,
1
git fetch --prune
hassanzadeh.sd

Odpowiedzi:

342
git fetch --prune

-p, --prune
Po pobraniu usuń wszystkie gałęzie zdalnego śledzenia, które już nie istnieją na pilocie. opcje przycinania

jobwat
źródło
6
Właśnie tego szukałem! PS Następnym razem przeczytam uważniej strony podręcznika, zanim zacznę kopać
przepełnienie stosu
5
Tak, git pull -probi to samo - „git pull uruchamia git fetch z podanymi parametrami i wywołuje git merge, aby scalić pobrane nagłówki
jobwat
2
Użyj git fetch <remote> --prunena wypadek, gdyby ktoś potrzebował tylko --pruneokreślonego pilota. na przykład. git fetch upstream --prune.
Fery Wardiyanto
git fetch origin --prunezsynchronizować lokalne repozytorium z widelcem upstreamprojektu
Stuart Cardall
2
@SergiySokolenko tak mówią wszyscy, ale w głębi duszy wiemy, że SO stało się wygodniejsze niż strony man :-P
Marcello Romani
144

Wykonają to następujące kroki:

git reset --hard HEAD
git clean -f -x -d -n

wtedy bez -n

To zajmie się wszystkimi lokalnymi zmianami. Teraz zatwierdza ...

git status

i zwróć uwagę na linię taką jak:

Your branch is ahead of 'xxxx' by N commits.

Zanotuj teraz liczbę „N”:

git reset --hard HEAD~N
git pull

i w końcu:

git status

nie powinien pokazywać nic do dodania / zatwierdzenia. Wszystko czyste.

Jednak świeży klon może zrobić to samo (ale jest znacznie wolniejszy).

=== Zaktualizowano ===

Ponieważ moja wiedza na temat gitów nieco się poprawiła w tym czasie, wymyśliłem jeszcze jeden prostszy sposób na zrobienie tego samego. Oto jak (# z wyjaśnieniem). Podczas pracy w oddziale:

git fetch # This updates 'remote' portion of local repo. 
git reset --hard origin/<your-working-branch>
# this will sync your local copy with remote content, discarding any committed
# or uncommitted changes.

Chociaż po tym czasie lokalne zatwierdzenia i zmiany znikną z pola widzenia, w razie potrzeby można odzyskać zatwierdzone zmiany.

FractalSpace
źródło
1
dzięki bardzo za aktualizację działa idealnie dobrze z github i bitbucket :)
CommonSenseCode
ta odpowiedź była dla mnie najbardziej niezawodnym rozwiązaniem.
AlanH
95

Musisz zrozumieć, że repozytorium Git to nie tylko drzewo katalogów i plików, ale także przechowuje historię tych drzew - które mogą zawierać gałęzie i scalenia.

Podczas pobierania z repozytorium skopiujesz do niego wszystkie lub niektóre gałęzie. Są one następnie w twoim repozytorium jako „zdalne gałęzie śledzenia”, np. Gałęzie o nazwach podobnych remotes/origin/masterlub podobnych.

Pobieranie nowych zatwierdzeń ze zdalnego repozytorium nic nie zmieni w lokalnej kopii roboczej.

Twoja kopia robocza ma zwykle sprawdzone zatwierdzenie, o nazwie HEAD. To zatwierdzenie jest zwykle wskazówką jednego z lokalnych oddziałów.

Myślę, że chcesz zaktualizować swój oddział lokalny (a może wszystkie oddziały lokalne?) Do odpowiedniego oddziału zdalnego, a następnie sprawdzić najnowszy oddział.

Aby uniknąć konfliktów z kopią roboczą (która może zawierać lokalne zmiany), najpierw czyścisz wszystko, co nie jest wersjonowane (za pomocą git clean). Następnie sprawdź lokalną gałąź odpowiadającą gałęzi zdalnej, którą chcesz zaktualizować, i użyj, git resetaby przełączyć ją na pobraną gałąź zdalną. ( git pullwłączy wszystkie aktualizacje zdalnego oddziału do twojego lokalnego, co może zrobić to samo lub utworzyć zatwierdzenie scalania, jeśli masz lokalne zatwierdzenia).

(Ale wtedy naprawdę stracisz wszelkie lokalne zmiany - zarówno w kopii roboczej, jak i lokalnych zatwierdzeniach. Upewnij się, że naprawdę tego chcesz - w przeciwnym razie lepiej użyj nowego oddziału, to zapisuje twoje lokalne zatwierdzenia. I użyj, git stashaby zapisać zmiany, które nie zostały jeszcze zatwierdzone .)


Edycja: Jeśli masz tylko jeden oddział lokalny i śledzisz jeden oddział zdalny, wszystko, co musisz zrobić, to

git pull

z katalogu roboczego.

Spowoduje to pobranie bieżącej wersji wszystkich śledzonych gałęzi zdalnych i zaktualizowanie bieżącej gałęzi (i katalogu roboczego) do bieżącej wersji gałęzi zdalnej, którą śledzi.

Paŭlo Ebermann
źródło
Jeśli zmieniam NIC w moim lokalnym repozytorium, tylko a.) Chcę mieć kopię wszystkiego ze zdalnego, i b.) Chcę pokazać różnice między wersjami. Więc NIE zobowiązuję się, niczego nie zmieniam = żadnych lokalnych aktualizacji / zmian. Jakich poleceń należy używać okresowo (np. Co tydzień), aby osiągnąć powyższe dwie funkcje? Proszę odpowiedzieć KISS (Keep It Simple Stupid) - ja też jestem git noob, i oczywiście RTFM - ale na początek potrzebuję pomocy. ;)
kobame
git pullMyślę, że w twoim prostym przypadku powinno wystarczyć. (Zaktualizowałem odpowiedź.)
Paŭlo Ebermann,
co jeśli mam jakieś lokalne zmiany, których nie chcę zatwierdzać. Teraz, kiedy wykonuję pociągnięcie, mówi mi, żebym je popełnił lub ukrył. Więc w tym przypadku, jak mogę powiedzieć gitowi, aby je zastąpił i wykonał ściąganie?
Harshana
89

Chcesz robić

git fetch --prune origin
git reset --hard origin/master
git clean -f -d

To sprawia, że ​​Twoje lokalne repozytorium jest dokładnie takie samo, jak Twoje repozytorium.

Pamiętaj, aby zastąpić origin i master zdalnym i rozgałęzieniem, z którym chcesz synchronizować.

aandis
źródło
2
usuwa również wszystkie katalogi z instalacji npm i instalacji altany, niezalecane, chyba że chcesz ponownie zainstalować wszystkie zależności, które są w
.gitignore
Nie usunęło mnie node_modules, działa dokładnie tak, jak chcę.
Vahid Amiri,
OSTRZEŻENIE: Usuwa nieśledzone pliki
Amit Yadav
Straciłem wszystkie moje dane przy użyciu tego kodu, próbowałem zsynchronizować moje lokalne repozytorium z repozytorium git. Ale sprawiło, że moje globalne repozytorium zsynchronizowało się z moim lokalnym repozytorium.
Zahid Khan
10

Zresetuj i zsynchronizuj lokalne repozytorium ze zdalną gałęzią

Polecenie: Pamiętaj, aby zastąpić origin i master zdalnym i rozgałęzieniem, z którym chcesz synchronizować.

git fetch origin && git reset --hard origin/master && git clean -f -d

Lub krok po kroku:

git fetch origin
git reset --hard origin/master
git clean -f -d

Twój oddział lokalny jest teraz dokładną kopią (zatwierdza i wszystko) oddziału zdalnego.

Dane wyjściowe polecenia:

Oto przykład uruchomienia polecenia na lokalnym klonie repozytorium Forge a git.

sharkbook:forge lbaxter$ git fetch origin && git reset --hard origin/master && git clean -f -d
HEAD is now at 356cd85 FORGE-680
Removing forge-example-plugin/
Removing plugin-container-api/
Removing plugin-container/
Removing shell/.forge_settings
sharkbook:forge lbaxter$
Mahendra Pratap
źródło
4

(Te informacje pochodzą z podręcznika użytkownika Git )

Uczę się również, więc może nie być to dokładnie odpowiedź na pytanie, ale może komuś pomóc:

  1. Po sklonowaniu zdalnego repozytorium kopie wszystkich gałęzi są przechowywane w lokalnym repozytorium (wyświetl je za pomocą git branch -r)
  2. Aby zaktualizować te kopie i uczynić je aktualnymi (tj. Zsynchronizować je ze zdalnym oddziałem), użyj git fetch. Nie wpłynie to na żadne z was, istniejące, niestandardowe oddziały.
  3. Aby zastąpić kasę lokalnego oddziału nową wersją dowolnego oddziału, nad którym pracujesz (zakładając, że już go uruchomiłeś git add origin /path/to/repository) git checkout origin/branch_name, zastąpi to zmiany w lokalnych oddziałachbranch_name
tjb
źródło
3

Wygląda na to, że chcesz dublować zdalne repozytorium:

git clone --mirror url://to/remote.git local.git

To polecenie tworzy samo repozytorium. Jeśli nie chcesz mieć czystego repozytorium, sprawy stają się bardziej skomplikowane.

Richard Hansen
źródło
3

Jeśli mówisz o synchronizowaniu rozwidlonego repozytorium, możesz wykonać następujące kroki.

Jak zsynchronizować repozytorium wideł z git

  1. sprawdź swoją obecną gałąź git

    git branch

  2. kasa do master, jeśli nie jesteś na master

    git checkout master

  3. Pobierz repozytorium nadrzędne, jeśli masz poprawne prawa dostępu

    git fetch upstream

  4. Jeśli otrzymujesz błąd poniżej, uruchom

    git remote add upstream [email protected]:upstream_clone_repo_url/xyz.git

    fatal: 'upstream/master' does not appear to be a git repository  
    fatal: Could not read from remote repository.
    Please make sure you have the correct access rights and the repository exists.
    
  5. Teraz uruchom poniższe polecenie.

    git fetch upstream

  6. Teraz, jeśli jesteś na master, to połącz upstream / master do master branch

    git merge upstream/master

    Otóż ​​to!!

    Sprawdź za pomocą git remotepolecenia, bardziej szczegółowogit remote -v

    Jeśli mam również uprawnienia zatwierdzania do repozytorium upstream, mogę utworzyć lokalny oddział upstream i wykonać pracę, która przejdzie tam upstream.

Nishant Upadhyay
źródło
Dlaczego powinienem pobierać 5.git w górę, gdy już pojawia się błąd w trzecim kroku?
Md Sifatul Islam,
-2

Możesz do tego użyć haków git . Po prostu utwórz hak, który popycha zmienione na inne repo po aktualizacji.

Oczywiście możesz dostać konflikty scalania, więc musisz wymyślić, jak sobie z nimi poradzić.

Makis
źródło