¿Es posible extraer solo un archivo en Git?

177

Estoy trabajando en una rama de Git que tiene algunas pruebas rotas, y me gustaría extraer (fusionar cambios, no solo sobrescribir) estas pruebas de otra rama donde ya están reparadas.

Se que puedo hacer

git pull origin that_other_branch

pero esto intentará fusionar muchos otros archivos, para eso aún no estoy listo.

¿Es posible extraer y fusionar solo el archivo especificado (y no todo) de esa otra rama?

Este no es un duplicado de la solicitud de extracción de Git para un solo archivo, ya que todas las respuestas a esa pregunta son cómo revertir el archivo cambiado localmente a la versión del repositorio, sin cambiar ninguna rama.

Audrius Meskauskas
fuente
77
Creo que ninguna de las entradas en esta página proporciona una respuesta a la pregunta. La pregunta significa extraer solo un archivo de un servidor remoto, no extraer todos los archivos y extraer localmente solo uno. Por lo tanto, la pregunta debe rehacerse, o la respuesta seleccionada sin marcar como la solución a la pregunta.
mljrg

Respuestas:

153

Puede buscar y luego extraer solo un archivo de esta manera:

git fetch
git checkout -m <revision> <yourfilepath>
git add <yourfilepath>
git commit

Con respecto al git checkoutcomando: <revision> - un nombre de rama, es decir origin/master <yourfilepath>, no incluye el nombre del repositorio (que puede obtener haciendo copy pathclic en el botón en una página de archivo en GitHub), es decirREADME.md

aleroot
fuente
23
Los códigos hash requeridos por el modificador -m se pueden imprimir con git branch -v. ¡Increíble!
Audrius Meskauskas
2
Excelente. Esto me ha ayudado en más de una ocasión. Para aclarar, el indicador -m parece estar contento con el hash del commit del que desea extraer su archivo único.
rd108
1
Esto funcionó para mí también. Sin embargo, ejecuté git log en mi rama remota para encontrar la reversión: por ejemplo, $ git log remotes / origin / master
Dan
66
¿Es posible extraer un archivo específico sin extraer otros archivos?
sentirse bien y programar
3
@aleroot ¿qué significa <revision>?
Wakan Tanka
240

Aquí hay un método un poco más fácil que se me ocurrió al investigar esto:

git fetch {remote}
git checkout FETCH_HEAD -- {file}
Chris
fuente
44
fatal: referencia inválida: FETCH_HEAD
Antony D'Andrea
44
Esta respuesta posiblemente carece de un ejemplo de trabajo. No está claro si uno necesita comprometerse a continuación.
Dr_Zaszuś
@Chris, ¿necesitamos {remoto} si ya estamos en Branch? ¿Si es así por qué?
Cloud Cho
2
No es lo mismo que pull, que intentará una fusión, y es por eso que queremos usar pull.
JosephK
22
git checkout master -- myplugin.js

maestro = nombre de la sucursal

myplugin.js = nombre de archivo

Mawardy
fuente
¿y hay alguna manera de volver atrás?
Liyuan
1
no te olvides de 'git pull' antes;)
matson kepson
16

La respuesta de @ Mawardy funcionó para mí, pero mis cambios fueron en el control remoto, así que tuve que especificar el origen

git checkout origin/master -- {filename}
Luke Flournoy
fuente
2

Sí, aquí está el proceso:

# Navigate to a directory and initiate a local repository
git init        

# Add remote repository to be tracked for changes:   
git remote add origin https://github.com/username/repository_name.git

# Track all changes made on above remote repository
# This will show files on remote repository not available on local repository
git fetch

# Add file present in staging area for checkout
git check origin/master -m /path/to/file
# NOTE: /path/to/file is a relative path from repository_name
git add /path/to/file

# Verify track of file(s) being committed to local repository
git status

# Commit to local repository
git commit -m "commit message"

# You may perform a final check of the staging area again with git status

fuente