git: sincronizza repo locale con uno remoto

Ho repository git locali e remoti. Voglio sincronizzare il mio repository locale con il repository remoto in modo che il mio repository locale diventi una copia al 100% del repository remoto. Ciò significa che se alcuni file differiscono in questi repository, sovrascriviamo quelli locali con quelli remoti. E se ci sono file in repository locali che non esistono nel repository remoto, i file locali vengono rimossi.

C’è un modo per farlo oltre a fare un nuovo clone di repo remoto?

Domanda simile a Sync locale repo git con telecomando in un colpo che ignora le modifiche / commit locali .

git fetch --prune 

-p, –prune
Dopo il recupero, rimuovere eventuali rami di localizzazione remota che non esistono più sul telecomando. opzioni di prugna

Devi capire che un repository Git non è solo un albero di directory e file, ma memorizza anche una cronologia di quegli alberi, che potrebbero contenere rami e fusioni.

Quando si preleva da un repository, si copieranno tutti o alcuni dei rami nel repository. Questi sono quindi nel tuo repository come “rami di rintracciamento remoto”, ad esempio rami denominati come remotes/origin/master o simili.

Il recupero di nuovi commit dal repository remoto non cambierà nulla sulla tua copia di lavoro locale.

La tua copia di lavoro ha normalmente un commit estratto, chiamato HEAD . Questo commit è solitamente la punta di uno dei tuoi rami locali.

Penso che desideri aggiornare il tuo ramo locale (o forse tutti i rami locali?) Al ramo remoto corrispondente, e quindi controlla l’ultimo ramo.

Per evitare qualsiasi conflitto con la tua copia di lavoro (che potrebbe avere modifiche locali), devi prima pulire tutto ciò che non è versionato (usando git clean ). Quindi si controlla il ramo locale corrispondente al ramo remoto che si desidera aggiornare e si utilizza git reset per passare al ramo remoto recuperato. ( git pull incorpora tutti gli aggiornamenti del ramo remoto in quello locale, che potrebbero fare lo stesso, o creare un merge commit se si hanno commit locali.)

(Ma in questo caso perderai davvero qualsiasi cambiamento locale, sia nella copia di lavoro che nei commit locali. Assicurati di volerlo davvero, altrimenti usa meglio un nuovo ramo, salva i commit locali e usa git stash per salvare le modifiche che non sono ancora impegnato.)


Modifica: se si dispone di un solo ramo locale e si sta monitorando un ramo remoto, tutto ciò che si deve fare è

 git pull 

dall’interno della directory di lavoro.

Questo recupererà la versione corrente di tutte le diramazioni remote tracciate e aggiornerà il ramo corrente (e la directory di lavoro) alla versione corrente del ramo remoto che sta monitorando.

Questi passaggi lo faranno:

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

quindi senza -n

Questo si prenderà cura di tutte le modifiche locali. Ora il commit …

 git status 

e nota la linea come:

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

Prendi nota del numero “N” ora:

 git reset --hard HEAD~N git pull 

e infine:

 git status 

non dovrebbe mostrare nulla per aggiungere / commit. Tutto pulito.

Tuttavia, un clone nuovo può fare lo stesso (ma è molto lento).

=== === Aggiornato

Dato che la mia conoscenza del git è leggermente migliorata nel tempo, ho trovato un altro modo più semplice di fare lo stesso. Ecco come (#con spiegazione). Mentre sei nel tuo ramo di lavoro:

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

Sebbene i commit locali e le modifiche scompaiano dalla vista, è ansible ripristinare le modifiche apportate, se necessario.

Vuoi fare

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

Questo rende il tuo repo locale esattamente come il repository remoto.

Ricordarsi di sostituire l’origine e il master con il telecomando e il ramo con cui si desidera sincronizzarsi.

(Queste informazioni sono tratte dal Manuale dell’utente di Git )

Sto anche imparando, quindi questa potrebbe non essere esattamente una risposta alla domanda, ma potrebbe aiutare qualcuno:

  1. Quando un repository remoto viene inizialmente clonato, le copie di tutti i rami vengono archiviate nel repository locale (visualizzarle con git branch -r )
  2. Per aggiornare queste copie e renderle attuali (cioè sincronizzarle con il ramo remoto) usa git fetch . Ciò non influirà su nessuno dei tuoi rami esistenti creati su misura.
  3. Per sovrascrivere il controllo del ramo locale una nuova versione di qualsiasi ramo su cui stai lavorando (Supponendo che tu abbia già eseguito git add origin /path/to/repository ) usa git checkout origin/branch_name , questo sovrascriverà le modifiche locali sul branch branch_name

Sembra che tu voglia un mirror del repository remoto:

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

Quel comando crea un repository nudo. Se non vuoi un repository spoglio, le cose si complicano.

Se stai parlando di sincronizzare un repository biforcuto, puoi seguire questi passaggi.

Come sincronizzare un repository di fork da git

  1. controlla il tuo attuale git branch

    git branch

  2. checkout per padroneggiare se non sei su master

    git checkout master

  3. Recupera il repository upstream se disponi dei diritti di accesso corretti

    git fetch upstream

  4. Se si ottiene sotto l’errore, quindi eseguire

    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. Ora esegui il comando qui sotto.

    git fetch upstream

  6. Ora, se sei su master, unisci l’upstream / master nel ramo master

    git merge upstream/master

    Questo è tutto!!

    Crosscheck tramite comando git remote , git remote -v più specifico git remote -v

    Se ho anche i diritti di commit sul repository upstream, posso creare un ramo upstream locale e fare il lavoro che andrà a monte lì.

Puoi usare git git per questo. Basta creare un hook che spinga modificato all’altro repository dopo un aggiornamento.

Ovviamente potresti ottenere conflitti di fusione, quindi devi capire come gestirli.