Supponi che il telecomando sia origin
e il ramo lo sia master
, e che tu abbia già master
estratto, potresti provare quanto segue:
git fetch origin
git reset --hard origin/master
Questo fondamentalmente prende solo il ramo corrente e lo punta al HEAD
ramo remoto.
ATTENZIONE : come indicato nei commenti, questo eliminerà le modifiche locali e sovrascriverà tutto ciò che si trova nell'origine .
Oppure puoi usare i comandi idraulici per fare essenzialmente lo stesso:
git fetch <remote>
git update-ref refs/heads/<branch> $(git rev-parse <remote>/<branch>)
git reset --hard
EDIT: vorrei spiegare brevemente perché funziona.
La .git
cartella può contenere i commit per qualsiasi numero di repository. Poiché l'hash del commit è in realtà un metodo di verifica per il contenuto del commit e non solo un valore generato casualmente, viene utilizzato per abbinare i set di commit tra i repository.
Un ramo è solo un puntatore con nome a un dato hash. Ecco un set di esempio:
$ find .git/refs -type f
.git/refs/tags/v3.8
.git/refs/heads/master
.git/refs/remotes/origin/HEAD
.git/refs/remotes/origin/master
Ciascuno di questi file contiene un hash che punta a un commit:
$ cat .git/refs/remotes/origin/master
d895cb1af15c04c522a25c79cc429076987c089b
Questi sono tutti per il meccanismo di archiviazione di git interno e funzionano indipendentemente dalla directory di lavoro . In questo modo:
git reset --hard origin/master
git punterà il ramo corrente allo stesso valore hash a cui punta origin / master. Quindi cambia con forza la directory di lavoro in modo che corrisponda alla struttura / contenuto del file in quell'hash.
Per vederlo all'opera, vai avanti e prova quanto segue:
git checkout -b test-branch
# see current commit and diff by the following
git show HEAD
# now point to another location
git reset --hard <remote>/<branch>
# see the changes again
git show HEAD