Sincronizar un repositorio Git local con uno remoto

297

Quiero sincronizar mi repositorio local con uno remoto para que mi repositorio local se convierta en una copia del 100% del remoto, lo que significa que si ciertos archivos difieren en estos repositorios, anulamos los locales con los remotos, y si hay archivos en repositorios locales que no existen en el control remoto, los archivos locales se eliminan.

¿Hay alguna manera de lograr eso que no sea haciendo un nuevo clon de repositorio remoto?

Pregunta similar a Sync local git repo with remote in one shot descartando cambios / confirmaciones locales .

Axl
fuente
44
Siempre cuando vengo aquí, estoy buscando Sincronizar un tenedor
Martin Thoma
1
git fetch --prune
hassanzadeh.sd

Respuestas:

342
git fetch --prune

-p, --prune
Después de buscar, elimine cualquier rama de seguimiento remoto que ya no exista en el control remoto. opciones de ciruela

Jobwat
fuente
66
Eso es lo que estaba buscando! PD La próxima vez leeré las páginas del manual con más cuidado antes de cavar stackoverflow :-)
Sergiy Sokolenko
55
Sí, git pull -phace lo mismo: 'git pull ejecuta git fetch con los parámetros dados y llama a git merge para fusionar las cabezas de rama recuperadas en la rama actual' - git-scm.com/docs/git-pull
jobwat
2
Uso git fetch <remote> --prune, en caso de que alguien solo necesite --pruneun control remoto específico. p.ej. git fetch upstream --prune.
Fery Wardiyanto
git fetch origin --prunesincronizar tu repositorio local con tu tenedor de un upstreamproyecto
Stuart Cardall
2
@SergiySokolenko, eso es lo que todos decimos, pero en el fondo sabemos que SO se ha vuelto más conveniente que las páginas de manual :-P
Marcello Romani
144

Estos pasos lo harán:

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

entonces sin -n

Esto se encargará de todos los cambios locales. Ahora los commits ...

git status

y tenga en cuenta la línea como:

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

Tome nota del número 'N' ahora:

git reset --hard HEAD~N
git pull

y finalmente:

git status

no debe mostrar nada para agregar / confirmar. Todo limpio.

Sin embargo, un clon nuevo puede hacer lo mismo (pero es mucho más lento).

=== Actualizado ===

A medida que mi conocimiento de git mejoró ligeramente con el tiempo, se me ocurrió otra forma más simple de hacer lo mismo. Aquí está cómo (#con explicación). Mientras estás en tu rama de trabajo:

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.

Aunque sus confirmaciones y cambios locales desaparecerán de la vista después de esto, es posible recuperar los cambios confirmados, si es necesario.

FractalSpace
fuente
1
muchas gracias por la actualización funciona perfectamente bien con github y bitbucket :)
CommonSenseCode
Esta respuesta ha sido la más confiable de las soluciones aquí para mí.
AlanH
95

Debe comprender que un repositorio de Git no es solo un árbol de directorios y archivos, sino que también almacena un historial de esos árboles, que pueden contener ramas y fusiones.

Al buscar desde un repositorio, copiará todas o algunas de las ramas allí a su repositorio. Estos se encuentran en su repositorio como "ramas de seguimiento remoto", por ejemplo, ramas denominadas como remotes/origin/mastero tal.

Obtener nuevas confirmaciones del repositorio remoto no cambiará nada sobre su copia de trabajo local.

Su copia de trabajo normalmente tiene un commit verificado, llamado HEAD. Este compromiso suele ser la punta de una de sus sucursales locales.

Creo que desea actualizar su sucursal local (¿o tal vez todas las sucursales locales?) A la sucursal remota correspondiente, y luego verifique la última sucursal.

Para evitar conflictos con su copia de trabajo (que podría tener cambios locales), primero limpie todo lo que no esté versionado (usando git clean). Luego verifica la rama local correspondiente a la rama remota a la que desea actualizar y la usa git resetpara cambiarla a la rama remota recuperada. ( git pullincorporará todas las actualizaciones de la rama remota en su local, lo que podría hacer lo mismo, o creará una confirmación de fusión si tiene confirmaciones locales).

(Pero entonces realmente perderá cualquier cambio local, tanto en la copia de trabajo como en las confirmaciones locales. Asegúrese de que realmente desea esto; de lo contrario, use mejor una nueva rama, esto guarda sus confirmaciones locales. Y úsela git stashpara guardar los cambios que aún no se han confirmado .)


Editar: si solo tiene una sucursal local y está rastreando una sucursal remota, todo lo que necesita hacer es

git pull

desde dentro del directorio de trabajo.

Esto buscará la versión actual de todas las ramas remotas rastreadas y actualizará la rama actual (y el directorio de trabajo) a la versión actual de la rama remota que está rastreando.

Paŭlo Ebermann
fuente
Si no cambio NADA en mi repositorio local, solo a.) Quiero tener una copia de todo desde el control remoto, y b.) Quiero una posibilidad de mostrar diferencias entre las versiones. Entonces, NO me comprometo, no cambio nada = no hay actualizaciones / cambios locales. ¿Qué comandos debo usar periódicamente (por ejemplo, cada semana más o menos) para lograr las dos funcionalidades anteriores? Por favor, conteste KISS (Keep It Simple Stupid): también soy un git noob y ofc RTFM, pero para empezar necesito ayuda. ;)
kobame
En su caso simple, a git pulldebería ser suficiente, creo. (Actualicé la respuesta.)
Paŭlo Ebermann
¿Qué pasa si tengo algunos cambios locales que no quiero comprometer? Ahora, cuando hago un tirón, me dice que los cometa o los guarde. Entonces, en este caso, ¿cómo puedo decirle a git que los anule y haga el pull?
Harshana
89

Quieres hacer

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

Esto hace que su repositorio local sea exactamente igual que su repositorio remoto.

Recuerde reemplazar origen y maestro con el control remoto y la rama con la que desea sincronizar.

aandis
fuente
2
también elimina todos los directorios de npm install y bower install, no se recomienda a menos que desee reinstalar todas las dependencias que están en .gitignore
chwagssd
No eliminó mi node_modules, funciona exactamente como quiero.
Vahid Amiri
ADVERTENCIA: Elimina archivos sin seguimiento
Amit Yadav
Perdí todos mis datos usando este código, intenté sincronizar mi repositorio local con el repositorio git. Pero hizo que mi repositorio global se sincronizara con mi repositorio local.
Zahid Khan
10

Restablecer y sincronizar el repositorio local con la sucursal remota

El comando: Recuerde reemplazar origen y maestro con el control remoto y la rama con la que desea sincronizar.

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

O paso a paso:

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

Su sucursal local ahora es una copia exacta (confirmaciones y todo) de la sucursal remota.

Salida de comando:

Aquí hay un ejemplo de cómo ejecutar el comando en un clon local del repositorio 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
fuente
4

(Esta información es del Manual del usuario de Git )

También estoy aprendiendo, así que esto podría no ser exactamente una respuesta a la pregunta, pero podría ayudar a alguien:

  1. Cuando un repositorio remoto se clona inicialmente, las copias de todas las ramas se almacenan en su repositorio local (verlas con git branch -r)
  2. Para actualizar estas copias y hacerlas actualizadas (es decir, sincronizarlas con la rama remota) use git fetch. Esto no afectará a ninguna de sus ramas existentes, creadas a medida.
  3. Para anular el pago de su sucursal local, una versión nueva de cualquier rama en la que esté trabajando (suponiendo que ya haya ejecutado git add origin /path/to/repository) el uso git checkout origin/branch_name, esto anulará los cambios locales en la sucursalbranch_name
tjb
fuente
3

Parece que quieres un espejo del repositorio remoto:

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

Ese comando crea un repositorio desnudo. Si no quieres un repositorio simple, las cosas se vuelven más complicadas.

Richard Hansen
fuente
3

Si está hablando de sincronizar un repositorio bifurcado, puede seguir estos pasos.

Cómo sincronizar un repositorio de fork desde git

  1. verifica tu rama actual de git

    git branch

  2. checkout a master si no estás en master

    git checkout master

  3. Obtenga el repositorio ascendente si tiene los derechos de acceso correctos

    git fetch upstream

  4. Si obtiene el siguiente error, ejecute

    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. Ahora ejecuta el siguiente comando.

    git fetch upstream

  6. Ahora, si está en el maestro, combine el flujo ascendente / maestro en la rama maestra

    git merge upstream/master

    ¡¡Eso es!!

    Crosscheck a través del git remotecomando, más específicogit remote -v

    Si también tengo derechos de compromiso para el repositorio ascendente, puedo crear una sucursal local ascendente y hacer el trabajo que irá allí.

Nishant Upadhyay
fuente
¿Por qué debería hacer 5.git fetch upstream cuando ya aparece un error en el tercer paso?
Md Sifatul Islam
-2

Puedes usar git hooks para eso. Simplemente cree un gancho que empuje cambiado al otro repositorio después de una actualización.

Por supuesto, es posible que tenga conflictos de fusión, por lo que debe pensar cómo lidiar con ellos.

Makis
fuente