web-dev-qa-db-fra.com

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

J'ai deux branches qui sont complètement fusionnées.

Cependant, une fois la fusion terminée, je me rends compte qu'un fichier a été gâché par la fusion (quelqu'un d'autre a fait un formatage automatique, gah), et il serait simplement plus facile de passer à la nouvelle version dans l'autre branche, et puis réinsérez mon changement de ligne après l'avoir apporté dans ma branche.

Alors quel est le moyen le plus simple de faire ça?

857
madlep

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

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 (à partir de commentaires):

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

une alternative:

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

Je me suis retrouvé à cette question sur une recherche similaire. Dans mon cas, je cherchais à extraire un fichier d'une autre branche dans un répertoire de travail en cours différent de l'emplacement d'origine du fichier. réponse :

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

Qu'en est-il de l'utilisation de la commande Checkout:

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

Suite à la réponse de madlep, vous pouvez également simplement copier un répertoire d'une autre branche avec le blob de répertoire.

git checkout other-branch app/**

En ce qui concerne la question de l'op, si vous n'avez modifié qu'un seul fichier, cela fonctionnera très bien ^ _ ^

13
6ft Dan

1) Assurez-vous que vous êtes dans la branche où vous avez besoin d’une copie du fichier. par exemple: je veux un fichier de sous-branche dans le maître, vous devez donc passer à la caisse ou être dans le maître git checkout master

2) Maintenant, vérifiez le fichier spécifique que vous voulez de la sous-branche au maître,

git checkout sub_branch file_path/my_file.ext

ici sub_branch signifie où vous avez ce fichier suivi du nom du fichier que vous devez copier.

11

Veuillez noter que dans la réponse acceptée, la première option met en scène l'intégralité du fichier de l'autre branche (comme git add ... avait été exécuté), et que la deuxième option entraîne simplement la copie du fichier, mais ne modifie pas les modifications (comme si vous veniez de modifier le fichier manuellement et que vous aviez des différences non résolues).

Git copie le fichier d'une autre branche sans le mettre en scène

Modifications effectuées (par exemple, git add filename):

$ git checkout directory/somefile.php feature-B

$ git status
On branch feature-A
Your branch is up-to-date with 'Origin/feature-A'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   directory/somefile.php

Modifications en attente (non mises en scène ni validées):

$ git show feature-B:directory/somefile.php > directory/somefile.php

$ git status
On branch feature-A
Your branch is up-to-date with 'Origin/feature-A'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   directory/somefile.php

no changes added to commit (use "git add" and/or "git commit -a")
1
user151841