2010-04-19 18 views
28

Per quanto vedo, git pull someRemote master tenta di unire il ramo remoto nel mio.Posso dire a git pull di sovrascrivere invece di unire?

C'è un modo per dire "Completamente scartare le mie cose, fammi solo un altro clone del telecomando" usando git pull? Voglio ancora conservare il mio repository e mantenere la sua cronologia, ma voglio avere una copia 1: 1 del ramo master di qualcheRemote dopo quel comando.

Per chiarire, immaginare ci sono 2 repository, RM e MY. I numeri sono commit, e questo presuppone solo un ramo (master).

 
RM1 --- RM2 --- RM3 --- RM4 --- RM5 --- RM6 ... 
|      | 
+-> MY1 --- MY2 --- MY3 -+-> MY4 --- MY5 --- MY6 ... 

Così avvio il mio repository come clone di RM1. Poi mi sviluppo felicemente e RM si sviluppa felicemente, ma non condividiamo mai il nostro lavoro. Dopo MY3 mi rendo conto che il mio ramo non è eccezionale ma che RM4 è piuttosto buono. Quindi voglio git pull RM4 in MY. Tuttavia, non voglio che le mie modifiche in MY1-3 persistano, voglio che MY4 sia una copia 1: 1 di RM4.

Tuttavia, voglio mantenere la mia cronologia, idealmente mi piacerebbe avere un set di modifiche tra MY3 e RM4 o tra MY3 e RM2-4.

Dovrebbe rimanere il mio repository.

È possibile?

(Questo è per i progetti GitHub dove posso fork di un progetto, sperimentare un po ', lasciarlo solo per un paio di settimane, ma poi vuole aggiornare senza tenere i miei cambiamenti. Al momento cancellare la forchetta e ri-forchetta , che non è l'approccio migliore.)

risposta

34

In primo luogo, rinominare il branch master a qualcos'altro:

git branch -m master my_old_master 

Quindi, creare un nuovo master:

git checkout -b master someRemote 

La cosa grandiosa di nomi filiali di Git è che non sono luoghi veri e propri, sono solo dei rimandi ai luoghi (dove un "luogo" è uno SHA1 commit id).

+0

Fondamentalmente devo nuotare il mio ramo? C'è un modo per git magicamente unire le modifiche in modo che assomigli ad una nuova revisione? Vorrei mantenere la mia filiale e la sua storia, voglio solo fare in modo che la revisione attuale sia una copia 1: 1 della revisione corrente di un telecomando. O funzionerebbe ancora e il nuovo maestro condividerà la storia con il vecchio maestro? –

+4

@ Michael: le tue modifiche non sarebbero andate; esistono ancora nel ramo 'my_old_master'. I tuoi obiettivi di "copia 1: 1 del telecomando" e "mantieni la mia cronologia" sono incompatibili se desideri un solo ramo. Poiché una revisione SHA1 include gli SHA1 di tutta la cronologia, un ramo non è uguale a un altro ramo a meno che * tutti * la cronologia sia identica in entrambi i rami. –

+0

per farlo funzionare, ho dovuto prima recuperare il ramo remoto. –

4

Sembra che tu abbia finito il checkout di git, che scarterà le modifiche locali in un percorso.

È possibile ripristinare le modifiche utilizzando checkout:

git checkout myfile.h 

ripristinerà MYFILE.H dall'indice

http://git-scm.com/docs/git-checkout

+0

ho pensato cassa reimposta solo la mia copia di lavoro locale per l'ultima revisione nel mio repo. Funziona con i telecomandi? –

+1

Sì, 'git checkout' prende un argomento di commit, quindi' git checkout origin/foo bar.baz' è possibile. – Bombe

2

Se si desidera mantenere il ramo master corrente ma registrare una nuova versione (mirroring del ramo remoto), è possibile;

  • registrare un driver di filtro di fusione (solo per questa unione: a keepTheir one)
  • fare un controllo git pull --no-commit
  • se non ci sono altri file che devono essere rimossi (file del master che non erano presenti nel ramo remoto)
  • commettere