1172 votes

Comment copier la version d'un seul fichier d'une branche Git à une autre ?

J'ai deux branches qui sont entièrement fusionnées ensemble.

Cependant, une fois la fusion effectuée, je me rends compte qu'un fichier a été endommagé par la fusion (quelqu'un d'autre a fait un auto-formatage, gah), et il serait plus facile de passer à la nouvelle version dans l'autre branche, puis de réinsérer mon changement d'une ligne après l'avoir transféré dans ma branche.

Alors, quel est le moyen le plus simple de le faire dans Git ?

9 votes

Veuillez noter que dans la réponse acceptée, la première solution met en scène les changements, et la deuxième solution ne le fait pas. stackoverflow.com/a/56045704/151841

1 votes

La réponse la plus récente est git restore --source otherbranch path/to/myfile.txt (voir l'explication dans la réponse ).

1978voto

madlep Points 14374

Exécutez ceci à partir de la branche où vous voulez que le fichier aboutisse :

git checkout otherbranch myfile.txt

Formules générales :

git checkout <commit_hash> <relative_path_to_file_or_dir>
git checkout <remote_name>/<branch_name> <file_or_dir>

Quelques notes (issues des commentaires) :

  • En utilisant le hash du commit, vous pouvez extraire des fichiers de n'importe quel commit.
  • Cela fonctionne pour les fichiers et les répertoires
  • Ecrase le fichier myfile.txt y mydir
  • Les caractères génériques ne fonctionnent pas, mais les chemins relatifs oui.
  • Plusieurs chemins peuvent être spécifiés

Une alternative :

git show commit_id:path/to/file > path/to/file

0 votes

Mais cela ne va-t-il pas écraser toutes vos modifications dans le master ?

14 votes

Oui, c'est vrai. Mais c'était l'intention de la question.

44 votes

C'est probablement évident, mais vous devez utiliser le nom complet du fichier... Les caractères génériques ne fonctionnent pas !

124voto

Mariusz Pawelski Points 857

J'utiliserais git restore (disponible depuis Git 2.23) :

git restore --source otherbranch path/to/myfile.txt


Pourquoi est-il meilleur que les autres options ?

  • par défaut git restore modifier les fichiers uniquement dans le répertoire de travail.

git checkout otherbranch -- path/to/myfile.txt copier le fichier dans le répertoire de travail (vos fichiers sur le disque) mais aussi dans la zone de transit. L'effet est le même que si vous copiez ce fichier manuellement et exécutez git add sur elle. git restore par défaut ne change que le répertoire de travail.

Pour obtenir le même résultat que pour git checkout otherbranch -- path/to/myfile.txt vous pouvez écrire git restore --source otherbranch --staged --worktree path/to/myfile.txt

  • par défaut git restore supprime les fichiers du répertoire de travail lorsqu'ils sont manquants dans une autre branche

git restore peut être utilisé pour restaurer l'ensemble du dossier avec git restore --source otherbranch path/to/dir . Vous pouvez effectuer une opération similaire avec git checkout mais git restore par défaut, supprimera les fichiers manquants sur otherbranch . Pour obtenir git checkout utilisation du comportement --overlay option.

Par exemple, s'il y a moins de fichiers sur otherbranch que dans le répertoire de travail actuel (et ces fichiers sont traqué ) sans --overlay option git restore les supprimera. Mais c'est un bon comportement par défaut, vous voulez très probablement que l'état du répertoire soit "le même comme dans otherbranch "et non "le même comme dans otherbranch mais avec des fichiers supplémentaires de ma branche actuelle".

Pour obtenir le même résultat que pour git checkout otherbranch -- path/to/dir vous pouvez écrire git restore --source otherbranch --staged --worktree --overlay path/to/dir

  • git restore n'utilise pas la redirection du shell pour créer le fichier (problème réservé à Powershell)

git show otherbranch:path/to/myfile.txt > path/to/myfile.txt utilise la redirection standard du shell. Si vous utilisez PowerShell, il se peut qu'il y ait un problème avec l'encodage du texte ou que vous obteniez un fichier cassé s'il s'agit de binaire . Avec git restore La modification des fichiers est entièrement effectuée par le git exécutable.

91voto

lkraav Points 844

C'est en effectuant une recherche similaire que je suis arrivé à cette question. Dans mon cas, je cherchais à extraire un fichier d'une autre branche dans le répertoire de travail actuel qui était différent de l'emplacement d'origine du fichier. Réponse : :

git show TREEISH:path/to/file > path/to/local/file

22 votes

L'intention de 'git show' est de sortir des données sur le terminal dans un format lisible, qui n'est pas garanti pour correspondre exactement au contenu du fichier. De même, il est préférable de copier un document Word dans son ensemble et de ne pas essayer de copier-coller son contenu dans un autre document.

0 votes

Je voulais juste le visualiser pour pouvoir comparer le contenu avec la branche actuelle (vérifier un morceau de code). J'aimerais cependant utiliser vim avec ça... pour la coloration syntaxique, etc.

3 votes

Pour comparer les contenus avant de passer à la caisse, git diff <other branch> <path to file> fonctionne bien.

52voto

rzr Points 979

Utilisez le caisse commandement :

  git diff --stat "$branch"
  git checkout --merge "$branch" "$file"
  git diff --stat "$branch"

8 votes

Note la fusion (2ème commande) ne peut pas fonctionner si le fichier n'existe pas sur les deux branches

0 votes

Hm. Je n'ai pas de diffstat. Est-ce une version spécifique d'un outil de diff, parce que je n'en ai jamais entendu parler (et devrais-je m'y mettre ?) :D

0 votes

git diff soutient un --stat qui fait fondamentalement la même chose que diffstat.

29voto

  1. Assurez-vous que vous êtes dans la branche où vous avez besoin d'une copie du fichier.

    Par exemple : Je veux que le fichier de la sous-branche soit dans le master, donc vous devez le vérifier ou il doit être dans le master. git checkout master

  2. Maintenant, extrayez le fichier spécifique seul que vous voulez de la sous-branche dans maître ,

     git checkout sub_branch file_path/my_file.ext

    Aquí sub_branch signifie l'endroit où se trouve le fichier suivi du nom du fichier que vous devez copier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X