¿Cuál es la diferencia entre pull y clone en git?

237

¿Cuál es la diferencia entre hacer (después mkdir repoy cd repo):

git init
git remote add origin git://github.com/cmcculloh/repo.git
git fetch --all
git pull origin master

y

git clone git://github.com/cmcculloh/repo.git

Quiero decir, obviamente uno es más corto, pero aparte de eso, ¿básicamente están haciendo lo mismo?

cmcculloh
fuente

Respuestas:

122

Básicamente son lo mismo, excepto que el clon configurará ramas de seguimiento remoto adicionales, no solo maestras. Mira la página del manual :

Clona un repositorio en un directorio recién creado, crea ramas de seguimiento remoto para cada rama en el repositorio clonado (visible usando git branch -r), y crea y extrae una rama inicial que se bifurca desde la rama actualmente activa del repositorio clonado.

meagar
fuente
10
git fetch: todos configuran ramas de seguimiento remoto adicionales, por lo que básicamente son lo mismo.
cmcculloh
251

git clonees cómo obtener una copia local de un repositorio existente para trabajar. Por lo general, solo se usa una vez para un repositorio dado, a menos que desee tener varias copias de trabajo disponibles. (O desea obtener una copia limpia después de estropear su local ...)

git pull(o git fetch+ git merge) es cómo actualiza esa copia local con nuevos commits desde el repositorio remoto. Si está colaborando con otros, es un comando que ejecutará con frecuencia.

Como muestra su primer ejemplo, es posible emular git clonecon una variedad de otros comandos git, pero no es realmente el caso que git pullestá haciendo "básicamente lo mismo" que git clone(o viceversa).

ebneter
fuente
44
¿Qué es lo que está haciendo específicamente git clone que no se logra mediante la secuencia de comandos que involucra "git pull"?
cmcculloh
21
@cmcculloh: Nada: la secuencia que describe efectivamente logra lo que hace "git clone". El punto es que "git pull" se usa para hacer una variedad de cosas más allá de lo que hiciste allí, sin mencionar que "git pull" es en realidad exactamente la combinación de "git fetch; git merge <current branch> <origin / rama actual> ". IOW, podrías vivir sin clonar y tirar si realmente quisieras. Además, puede extraer de repositorios distintos del que clonó. Me gusta pensar en 'clonar' como "hacerme una copia local de ese repositorio" y "extraer" como "obtener las actualizaciones de algún control remoto especificado".
Ebneter
120

En lenguaje laico podemos decir:

  • Clonar : Obtenga una copia de trabajo del repositorio remoto.
  • Pull : Estoy trabajando en esto, consígueme los nuevos cambios que otros puedan actualizar.
Jyoti Prakash
fuente
3
Creo que su definición de Pull también se puede decir para Clone
henrywright
10
¿Cómo puedes trabajar en algo que no has clonado?
Jyoti Prakash
No entiendo lo que quieres decir?
henrywright
@henrywright hope, la respuesta de ebneter abordará su pregunta
Mrk
41

git clone significa que está haciendo una copia del repositorio en su sistema.

git fork significa que está copiando el repositorio a su cuenta de Github.

git pull significa que está buscando el último repositorio modificado.

git push significa que está devolviendo el repositorio después de modificarlo.

En términos simples:

git clonese está descargando y git pulles refrescante.

Jee
fuente
9

clon : copiando el repositorio del servidor remoto a su máquina local.

pull : obtenga nuevos cambios que otros han agregado a su máquina local.

Esta es la diferencia

Clone se usa generalmente para obtener copias remotas de repositorios.

Pull se usa para ver el código agregado de otros compañeros de equipo, si está trabajando en equipos.

Suman Astani
fuente
5

git clone se usa para descargar exactamente lo que está funcionando actualmente en el repositorio del servidor remoto y guardarlo en la carpeta de su máquina donde se ubica ese proyecto. Principalmente se usa solo cuando vamos a cargar el proyecto por primera vez. Después de ese tirón es la mejor opción.

git pull es básicamente una operación (clonar (descargar) + fusionar) y se usa principalmente cuando trabajas en equipo. En otras palabras, cuando desee los cambios recientes en ese proyecto, puede tirar.

Raman_1059
fuente
3

Señorita Clone: ​​recibo una copia nueva al local.

Sr. Pull: Ya lo tengo localmente, solo lo actualizo.


Miss Clone: ​​¡Puedo hacer lo que haces! Eres solo mi subconjunto.

Sr. Pull: ¡Lo mismo!


Miss Clone: ​​No, no creas. Esto es lo que hago:

  1. Crear repositorio vacío vacío
  2. Rellenar sucursales de seguimiento remoto
  3. Ejecute git fetch sin argumentos

Solo haces el n. ° 3, y luego te unes, lo que no necesito hacer (el mío es nuevo).

Sr. Pull: Smarty pants, no es gran cosa, ¡haré un "git init" primero! Entonces somos lo mismo. Además, tengo la capacidad adicional de 'fusión' en el repositorio existente. Lo que me convierte en el comando más utilizado en Git;)


Creadores de Git: sostengan sus caballos, Sr. Pull, si se usa --bare o --mirror con clon o init, su fusión no sucederá. Sigue siendo de solo lectura.

Nubes azules
fuente
Respuesta infravalorada.
sinekonata
2

Hmm, ¿qué falta para ver la rama remota "4.2" cuando tiro, como hago cuando clono? Algo claramente no es idéntico.

tmp$  mkdir some_repo

tmp$  cd some_repo

some_repo$  git init
Initialized empty Git repository in /tmp/some_repo/.git/

some_repo$  git pull https://github.ourplace.net/babelfish/some_repo.git
  :
From https://github.ourplace.net/babelfish/some_repo
 * branch            HEAD       -> FETCH_HEAD

some_repo$  git branch
* master

vs

tmp$  rm -rf some_repo

tmp$  git clone https://github.ourplace.net/babelfish/some_repo.git
Cloning into 'some_repo'...
  :
Checking connectivity... done.

tmp$  cd some_repo

some_repo$  git branch
* 4.2
Scott
fuente
También me di cuenta de esto, y sospecho que los cambios en los valores predeterminados de git con el tiempo son el problema. Tengo 1.9.5.msysgit en Windows y 2.3.2-applegit-55 en una Mac.
AnneTheAgile
2

git clone URL ---> El proyecto o repositorio completo se descargará como un directorio separado. y no solo los cambios git pull URL ---> fetch + merge -> Solo buscará los cambios que se han realizado y no todo el proyecto

MD Abrar
fuente
1

Si bien el git fetchcomando obtendrá todos los cambios en el servidor que aún no tiene, no modificará su directorio de trabajo en absoluto. Simplemente obtendrá los datos por usted y le permitirá fusionarlos usted mismo. Sin embargo, hay un comando llamado git pullque es esencialmente un git fetchseguido inmediatamente por un git mergeen la mayoría de los casos.

Leer más: https://git-scm.com/book/en/v2/Git-Branching-Remote-Branches#Pulling

simopr
fuente
1
Si bien este enlace puede responder la pregunta, es mejor incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia.
ekad
0

Clon : creará una copia duplicada exacta de su proyecto de repositorio remoto en su máquina local.

Halar -: supongamos que dos o más de dos personas comparten el mismo repositorio. (Supongamos que el nombre de otra persona es Syam) (Un repositorio es un lugar donde su proyecto existe en Github) Entonces, si Syam hace algunos cambios en el mismo proyecto en su local y lo empuja al repositorio remoto Entonces, cualesquiera que sean los cambios que hizo Syam, esos cambios serán No se refleja en su local. Entonces, para reflejar esos nuevos cambios en su local, debe usar git pull. En general, usamos git pull para actualizar el proyecto.

Básicamente, usamos git clone solo una vez, mientras que usamos git pull muchas veces.

Akshay Pathak 1001
fuente