Est-il possible d'extraire un seul fichier dans Git?

177

Je travaille sur une branche Git qui a des tests cassés, et j'aimerais extraire (fusionner les modifications, pas simplement écraser) ces tests d'une autre branche où ils sont déjà corrigés.

Je sais que je peux faire

git pull origin that_other_branch

mais cela tentera de fusionner beaucoup d'autres fichiers, pour cela je ne suis pas encore prêt.

Est-il possible d'extraire et de fusionner uniquement le fichier spécifié (et pas tout) de cette autre branche?

Il ne s'agit pas d'une copie de la demande d'extraction Git pour un seul fichier, car toutes les réponses à cette question sont de savoir comment rétablir le fichier modifié localement vers la version du référentiel, sans modifier aucune branche.

Audrius Meskauskas
la source
7
Je pense qu'aucune des entrées de cette page ne répond à la question. La question consiste à extraire un seul fichier d'un serveur distant, à ne pas extraire tous les fichiers et à n'en extraire qu'un seul localement. La question doit donc être refaite ou la réponse sélectionnée doit être décochée comme solution à la question.
mljrg le

Réponses:

153

Vous pouvez récupérer et extraire un seul fichier de cette manière:

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

Concernant la git checkoutcommande: <revision> - un nom de branche, c'est-à origin/master <yourfilepath>- dire n'inclut pas le nom du référentiel (que vous pouvez obtenir en cliquant copy pathsur le bouton d'une page de fichier sur GitHub), soitREADME.md

aleroot
la source
23
Les codes de hachage requis par le commutateur -m peuvent être imprimés avec git branch -v. Impressionnant!
Audrius Meskauskas
2
Excellent. Cela m'a aidé à plus d'une occasion. Pour clarifier, l'indicateur -m semble être satisfait du hachage du commit à partir duquel vous souhaitez extraire votre fichier unique.
rd108
1
Cela a fonctionné pour moi aussi. Cependant, j'ai exécuté git log sur ma branche distante pour trouver la réversion: par exemple $ git log remotes / origin / master
Dan
6
Est-il possible d'extraire un fichier spécifique sans extraire d'autres fichiers?
feel good et programmation
3
@aleroot que signifie <revision>?
Wakan Tanka
240

Voici une méthode un peu plus simple que je viens de proposer lors de mes recherches:

git fetch {remote}
git checkout FETCH_HEAD -- {file}
Chris
la source
4
fatal: référence invalide: FETCH_HEAD
Antony D'Andrea
4
Cette réponse manque peut-être d'exemple fonctionnel. On ne sait pas si l'on doit s'engager ensuite.
Dr_Zaszuś
@Chris avons-nous besoin de {remote} si nous sommes déjà dans Branch? Si oui, pourquoi?
Cloud Cho
2
Pas la même chose que pull, qui tentera une fusion, c'est pourquoi nous voulons utiliser pull.
JosephK le
22
git checkout master -- myplugin.js

master = nom de la branche

myplugin.js = nom de fichier

Mawardy
la source
et y a-t-il un moyen de revenir en arrière?
liyuan
1
n'oubliez pas de 'git pull' avant;)
matson kepson
16

La réponse de @ Mawardy a fonctionné pour moi, mais mes modifications étaient sur la télécommande, j'ai donc dû spécifier l'origine

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

Oui, voici le processus:

# 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

la source