En términos simples, si estaba a punto de subirse a un avión sin conexión a Internet ... antes de partir, podría hacerlo git fetch origin <master>
. Obtendría todos los cambios en su computadora, pero lo mantendría separado de su espacio de trabajo / desarrollo local.
En el avión, puede realizar cambios en su espacio de trabajo local y luego fusionarlo con lo que ha obtenido y resolver posibles conflictos de fusión, todo sin una conexión a Internet. Y a menos que alguien haya realizado nuevos cambios conflictivos en el repositorio remoto, una vez que llegue al destino, lo haría git push origin <branch>
e iría a buscar su café.
De este increíble tutorial de Atlassian :
El git fetch
comando descarga confirmaciones, archivos y referencias de un repositorio remoto en su repositorio local.
Buscar es lo que haces cuando quieres ver en lo que todos los demás han estado trabajando. Es similar a la actualización de SVN, ya que le permite ver cómo ha progresado el historial central, pero no le obliga a fusionar los cambios en su repositorio. Git aísla el contenido obtenido como contenido local existente , no tiene absolutamente
ningún efecto en su trabajo de desarrollo local . El contenido recuperado se debe extraer explícitamente con el git checkout
comando Esto hace que la búsqueda sea una forma segura de revisar las confirmaciones antes de integrarlas con su repositorio local.
Cuando la descarga de contenido desde un repositorio remoto, git pull
y git fetch
comandos están disponibles para realizar la tarea. Puede considerar
git fetch
la versión 'segura' de los dos comandos. Descargará el contenido remoto, pero no actualizará el estado de trabajo de su repositorio local, dejando intacto su trabajo actual. git pull
es la alternativa más agresiva, descargará el contenido remoto para la rama local activa e inmediatamente se ejecutará git merge
para crear una confirmación de fusión para el nuevo contenido remoto. Si tiene cambios pendientes en progreso, esto provocará conflictos y dará inicio al flujo de resolución de conflictos de fusión.
Con git pull
:
- No tienes ningún aislamiento.
- Afecta su desarrollo local.
- No necesita ser desprotegido explícitamente. Porque implícitamente hace a
git merge
.
- Básicamente NO es seguro. Es agresivo
- A diferencia de
git fetch
donde solo afecta a usted .git/refs/remotes
, git pull afectará tanto a usted .git/refs/remotes
como a .git/refs/heads/
Hmmm ... así que si no estoy actualizando la copia de trabajo git fetch
, ¿dónde estoy haciendo los cambios? ¿Dónde almacena Git fetch los nuevos commits?
Gran pregunta Lo pone en algún lugar aislado de su copia de trabajo. Pero de nuevo, ¿dónde? Vamos a averiguar.
En su directorio de proyecto (es decir, donde realiza sus git
comandos) haga:
ls
. Esto mostrará los archivos y directorios. Nada genial, lo sé.
Ahora hazlo ls -a
. Esto mostrará los archivos de puntos , es decir, archivos que comienzan con .
A continuación, será capaz de ver un directorio llamado: .git
.
- Hacer
cd .git
. Obviamente, esto cambiará su directorio.
- Ahora viene la parte divertida; hacer
ls
. Verá una lista de directorios. Estamos buscando refs
. Hacer cd refs
.
- Es interesante ver qué hay dentro de todos los directorios, pero centrémonos en dos de ellos.
heads
y remotes
. Use cd
para verificar dentro de ellos también.
- Todo lo
git fetch
que haga actualizará los elementos en el /.git/refs/remotes
directorio. No actualizará nada en el /.git/refs/heads
directorio.
- Cualquiera
git pull
hará primero git fetch
, actualizará los elementos en el /.git/refs/remotes
directorio, luego se fusionará con su local y luego cambiará la cabecera dentro del /.git/refs/heads
directorio.
También se puede encontrar una muy buena respuesta relacionada en ¿Dónde se ubica 'git fetch'? .
Además, busque "notación de barra" en la publicación de convenciones de nomenclatura de rama de Git . Le ayuda a comprender mejor cómo Git coloca las cosas en diferentes directorios.
Para ver la diferencia real
Solo haz:
git fetch origin master
git checkout master
Si se actualizó el maestro remoto, recibirá un mensaje como este:
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)
Si no lo hiciste fetch
y lo hiciste git checkout master
, tu git local no sabría que hay 2 commits agregados. Y solo diría:
Already on 'master'
Your branch is up to date with 'origin/master'.
Pero eso está desactualizado e incorrecto. Es porque git te dará comentarios únicamente en función de lo que sabe. Es ajeno a las nuevas confirmaciones que aún no ha eliminado ...
¿Hay alguna forma de ver los nuevos cambios realizados en forma remota mientras se trabaja en la sucursal localmente?
Algunos IDE (por ejemplo, Xcode) son súper inteligentes y utilizan el resultado de git fetch
ay pueden anotar las líneas de código que se han cambiado en la rama remota de su rama de trabajo actual. Si esa línea ha sido modificada por los cambios locales y la rama remota, entonces esa línea se anota con rojo. Esto no es un conflicto de fusión. Es un posible conflicto de fusión. Es un aviso que puede usar para resolver el futuro conflicto de fusión antes de hacerlo git pull
desde la rama remota.
Consejo divertido:
Si buscó una rama remota, por ejemplo:
git fetch origin feature/123
Entonces esto iría a su directorio de controles remotos. Todavía no está disponible para su directorio local. Sin embargo, simplifica su pago a esa rama remota por DWIM (haga lo que quiero decir):
git checkout feature/123
ya no necesitas hacer:
git checkout -b feature/123 origin/feature/123
Para más información sobre eso, lea aquí