¿Cómo extraigo archivos de forma remota sin sobrescribir los archivos locales?

112

Estoy intentando configurar un nuevo repositorio de git en un repositorio remoto preexistente.

Quiero que mis archivos locales sobrescriban el repositorio remoto, pero git dice que primero tengo que extraer esos archivos remotos y fusionarlos.

¿Hay alguna forma de extraer, pero asegúrese de que el control remoto no sobrescriba los archivos locales?

Joe Isaacson
fuente

Respuestas:

181

Bueno, sí y no ...

Entiendo que desea que sus copias locales "anulen" lo que está en el control remoto, pero, oh, hombre, si alguien ha modificado los archivos en el repositorio remoto de alguna manera diferente , simplemente ignora sus cambios e intenta "forzar" tus propios cambios sin siquiera mirar posibles conflictos, bueno, lloro por ti (y tus compañeros de trabajo) ;-)

Dicho esto, sin embargo, es muy fácil hacer "lo correcto ..."

Paso 1:

git stash

en su repositorio local. Eso guardará sus actualizaciones locales en el escondite, luego revertirá sus archivos modificados a su estado previo a la edición.

Paso 2:

git pull

para obtener las versiones modificadas. Ahora, con suerte, eso no obtendrá ninguna versión nueva de los archivos que le preocupan. Si no es así, el siguiente paso funcionará sin problemas. Si lo hace , entonces usted tiene mucho trabajo por hacer, y usted será feliz de haberlo hecho.

Paso 3:

git stash pop

Eso fusionará las versiones modificadas que guardó en el Paso 1 con las versiones que acaba de extraer en el Paso 2. Si todo va bien, ¡estará listo!

Si, por otro lado, hubo conflictos reales entre lo que extrajo en el Paso 2 y sus modificaciones (debido a que otra persona editó en el ínterin), lo averiguará y se le indicará que los resuelva. Hazlo.

Las cosas funcionarán mucho mejor de esta manera: probablemente mantendrá sus cambios sin ningún trabajo real de su parte, mientras lo alerta sobre problemas serios y serios.

Bob Gilmore
fuente
5
¿Por qué no sólo git commitse producirán cambios locales antes git pull?
Don Cheadle
10
A veces estoy en una posición en la que no quiero confirmar el código, pero me gustaría mantenerlo en mi máquina local, este conjunto de comandos es realmente útil para esto.
Vargan
3
Esto no es útil si tiene varios archivos, algunos que le gustaría que se sobrescribieran y otros que no desea sobrescribir. ¿No hay forma de decirle a GIT que ignore los archivos al extraer? ¿Por qué .gitignore solo funciona para empujar? No entiendo en absoluto esa decisión de diseño ...
Bobak Hashemi
25

Puede guardar sus cambios locales primero, luego extraer y luego sacar el alijo.

git stash
git pull origin master
git stash pop

Cualquier cosa que anule los cambios desde el control remoto tendrá conflictos que tendrá que resolver manualmente.

Ryan Bigg
fuente
4
Ya realicé estos cambios localmente, por lo que dice que "no hay cambios locales para guardar"
Joe Isaacson
Creo que esta es la mejor estrategia.
Jimmy Obonyo Abor
13

Así que ha comprometido sus cambios locales en su repositorio local. Luego, para obtener cambios remotos en su repositorio local sin realizar cambios en sus archivos locales, puede usar git fetch. En realidad git pulles una operación de dos pasos: una no destructiva git fetchseguida de una git merge. Consulte ¿Cuál es la diferencia entre 'git pull' y 'git fetch'? para más discusión.

Ejemplo detallado:

Suponga que su repositorio es así (ha realizado cambios test2:

* ed0bcb2 - (HEAD, master) test2
* 4942854 - (origin/master, origin/HEAD) first

Y el originrepositorio es así (alguien más se ha comprometido test1):

* 5437ca5 - (HEAD, master) test1
* 4942854 - first

En este momento, git se quejará y le pedirá que extraiga primero si intenta enviarlo test2al repositorio remoto. Si desea ver qué es test1 sin modificar su repositorio local, ejecute esto:

$ git fetch

Su repositorio local de resultados sería así:

* ed0bcb2 - (HEAD, master) test2 
| * 5437ca5 - (origin/master, origin/HEAD) test1 
|/  
* 4942854 - first 

Ahora tiene los cambios remotos en otra rama y mantiene intactos sus archivos locales.

Entonces, ¿qué sigue? Puede hacer un git merge, que tendrá el mismo efecto que git pull(cuando se combina con el anterior git fetch), o, como prefiero, hacer un git rebase origin/masterpara aplicar su cambio encima origin/master, lo que le da un historial más limpio.

Penghe Geng
fuente
gracias por explicar git pull como una fusión de git fetch / git de dos pasos
cdabel