Sincronizzazione di un repository Git locale con uno remoto


297

Voglio sincronizzare il mio repository locale con uno remoto in modo che il mio repository locale diventi una copia al 100% di quello remoto, il che significa che se alcuni file differiscono in questi repository, sovrascriviamo quelli locali con quelli remoti e se ci sono file nei repository locali che non esistono nel telecomando, i file locali vengono rimossi.

Esiste un modo per ottenerlo se non facendo un nuovo clone di repository remoto?

Domanda simile a Sincronizza repository git locale con telecomando in una sola volta scartando modifiche / commit locali .


4
Sempre quando vengo qui, cerco Syncing a fork
Martin Thoma l'

1
git fetch --prune
hassanzadeh.sd

Risposte:


342
git fetch --prune

-p, --prune
Dopo il recupero, rimuovere eventuali rami di tracciamento remoto che non esistono più sul telecomando. potare le opzioni


6
Questo è quello che stavo cercando! PS La prossima volta leggerò più attentamente le pagine man prima di scavare
nello stackoverflow

5
Sì, git pull -pfa lo stesso - 'git pull esegue git fetch con i parametri indicati e chiama git merge per unire le teste dei rami recuperate nel ramo corrente' - git-scm.com/docs/git-pull
jobwat

2
Utilizzare git fetch <remote> --prune, nel caso in cui qualcuno abbia bisogno solo di --pruneun telecomando specifico. per esempio. git fetch upstream --prune.
Fery Wardiyanto

git fetch origin --pruneper sincronizzare il tuo repository locale con il fork di un upstreamprogetto
Stuart Cardall

2
@SergiySokolenko è quello che diciamo tutti, ma in fondo sappiamo che SO è diventato più conveniente delle pagine man :-P
Marcello Romani

144

Questi passaggi lo faranno:

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

quindi senza -n

Questo si occuperà 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 da aggiungere / eseguire il commit. Tutto pulito.

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

=== === Aggiornato

Dato che la mia conoscenza git è leggermente migliorata nel tempo, ho trovato un altro modo più semplice per 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/<your-working-branch>
# this will sync your local copy with remote content, discarding any committed
# or uncommitted changes.

Sebbene i tuoi impegni locali e le modifiche scompaiano alla vista dopo questo, è possibile recuperare le modifiche impegnate, se necessario.


1
grazie mille per l'aggiornamento funziona perfettamente con github e bitbucket :)
CommonSenseCode

questa risposta è stata la più affidabile delle soluzioni qui per me.
AlanH

95

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 recuperi da un repository, copierai tutti o alcuni dei rami lì nel tuo repository. Questi sono quindi nel tuo repository come "rami di tracciamento remoto", ad esempio rami denominati come remotes/origin/mastero tali.

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

Normalmente la tua copia di lavoro ha un commit estratto, chiamato HEAD. Questo commit è di solito la punta di una delle tue filiali locali.

Penso che tu voglia aggiornare il tuo ramo locale (o forse tutti i rami locali?) Al ramo remoto corrispondente e quindi controllare l'ultimo ramo.

Per evitare conflitti con la tua copia di lavoro (che potrebbe avere modifiche locali), devi prima ripulire tutto ciò che non ha una versione (usando git clean). Quindi si verifica il ramo locale corrispondente al ramo remoto che si desidera aggiornare e si utilizza git resetper passare al ramo remoto recuperato. ( git pullincorporerà tutti gli aggiornamenti della filiale remota in quella locale, che potrebbe fare lo stesso, o creerà un commit di unione se si dispone di commit locali.)

(Ma allora perderai davvero tutte le modifiche locali - sia nella copia di lavoro che nelle commit locali. Assicurati di volerlo davvero - altrimenti usa meglio una nuova filiale, questo salva i tuoi commit locali. E usa git stashper salvare le modifiche che non sono ancora state impegnate .)


Modifica: se hai un solo ramo locale e stai monitorando un ramo remoto, tutto ciò che devi fare è

git pull

dall'interno della directory di lavoro.

Ciò recupererà la versione corrente di tutti i rami remoti monitorati e aggiornerà il ramo corrente (e la directory di lavoro) alla versione corrente del ramo remoto che sta monitorando.


Se cambio NIENTE nel mio repository locale, solo a.) Voglio avere una copia di tutto dal telecomando e b.) Voglio una possibilità che mostri differenze tra le versioni. Quindi NON mi impegno, non cambio nulla = nessun aggiornamento / modifica locale. Quali comandi dovrei usare periodicamente (ad es. Ogni settimana o giù di lì) per raggiungere le due funzionalità precedenti? Per favore, rispondi a KISS (Keep It Simple Stupid) - anche io sono un gob noob, e spesso RTFM - ma per iniziare ho bisogno di aiuto. ;)
kobame,

Nel tuo semplice caso a git pulldovrebbe bastare, penso. (Ho aggiornato la risposta.)
Paŭlo Ebermann,

cosa succede se ho alcune modifiche locali che non voglio impegnare. Ora quando faccio un tiro mi dice di impegnarli o di metterli da parte. Quindi, in questo caso, come posso dire a Git di ignorare quelli e fare il pull?
Harshana,

89

Vuoi fare

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

Ciò rende il repository locale esattamente come il repository remoto.

Ricorda di sostituire origine e master con il telecomando e il ramo con cui desideri sincronizzare.


2
rimuove anche tutte le directory da npm install e bower install, non raccomandato a meno che non si desideri reinstallare tutte le dipendenze che si trovano in
.gitignore

Non ha rimosso il mio node_modules, funziona esattamente come voglio.
Vahid Amiri,

ATTENZIONE: rimuove i file non tracciati
Amit Yadav,

Ho perso tutti i miei dati usando questo codice, ho provato a sincronizzare il mio repository locale con il repository git. Ma ha reso il mio repository globale sincronizzato con il mio repository locale.
Zahid Khan,

10

Ripristina e sincronizza il repository locale con il ramo remoto

Il comando: ricorda di sostituire origine e master con il telecomando e il ramo con cui desideri sincronizzarti.

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

O passo dopo passo:

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

La tua filiale locale è ora una copia esatta (commit e tutto) della filiale remota.

Uscita comando:

Ecco un esempio dell'esecuzione del comando su un clone locale del repository 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$

4

(Queste informazioni sono tratte dal Manuale dell'utente di The 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 correnti (ovvero sincronizzarle con il ramo remoto) utilizzare git fetch. Ciò non influirà su nessuno di voi rami creati e personalizzati esistenti.
  3. Per sostituire la tua filiale locale, verifica una nuova versione di qualsiasi ramo su cui stai lavorando (supponendo che tu abbia già eseguito git add origin /path/to/repository) utilizzare git checkout origin/branch_name, questo sostituirà le modifiche dei tuoi locali sulla filialebranch_name

3

Sembra che tu voglia un mirror del repository remoto:

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

Tale comando crea un repository nudo. Se non si desidera un repository nudo, le cose si complicano.


3

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

Come sincronizzare un repository fork da git

  1. controlla il tuo attuale ramo git

    git branch

  2. fai il checkout per master se non sei il master

    git checkout master

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

    git fetch upstream

  4. Se stai ottenendo un errore di seguito, esegui

    git remote add upstream git@github.com: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 seguente.

    git fetch upstream

  6. Ora, se sei sul master, unisci l'upstream / master nel ramo master

    git merge upstream/master

    Questo è tutto!!

    Controllo incrociato tramite git remotecomando, più specificogit remote -v

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


Perché dovrei fare 5.git di recupero a monte quando ho già un errore al terzo passaggio?
Md Sifatul Islam

-2

Per questo puoi usare git git . Basta creare un hook che spinga cambiato nell'altro repository dopo un aggiornamento.

Ovviamente potresti avere conflitti di unione, quindi devi capire come affrontarli.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.