J'ai deux branches qui sont complètement fusionnées.
Cependant, après la fusion, 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 d'une ligne après l'avoir transféré dans ma branche.
Alors, quelle est la façon la plus simple de le faire avec git?
Réponses:
Exécutez cela à partir de la branche où vous souhaitez que le fichier se termine:
Formules générales:
Quelques notes (des commentaires):
myfile.txt
etmydir
une alternative:
la source
''
afin qu'ils ne soient pas interprétés par le shell.Je me suis retrouvé à cette question sur une recherche similaire. 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 :
la source
git diff <other branch> <path to file>
fonctionne bien.Qu'en est-il de l'utilisation de la commande de paiement:
la source
git diff
supporte un--stat
argument qui fait essentiellement la même chose que diffstat.1) Assurez-vous que vous êtes dans la succursale 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 commander ou devrait être dans le maître
git checkout master
2) Maintenant, retirez le fichier spécifique que vous voulez de la sous-branche au maître,
ici
sub_branch
signifie où vous avez ce fichier suivi du nom du fichier que vous devez copier.la source
Après la réponse de madlep, vous pouvez également copier un répertoire d'une autre branche avec le blob de répertoire.
Quant à la question de l'op si vous n'avez modifié qu'un seul fichier, cela fonctionnera bien ^ _ ^
la source
origin/other-branch
pour faire référence à la branche repo. Bases, mais mord moi. (la réponse est excellente - aucune modification requise)J'utiliserais
git restore
(disponible depuis git 2.23)git restore --source otherbranch path/to/myfile.txt
Pourquoi c'est mieux que d'autres options?
git checkout otherbranch -- path/to/myfile.txt
- Il copie le fichier dans le répertoire de travail mais aussi dans la zone de transit (effet similaire à si vous vouliez copier ce fichier manuellement et exécutégit add
dessus).git restore
ne touche pas la zone de rassemblement (sauf indication contraire de l'--staged
option).git show otherbranch:path/to/myfile.txt > path/to/myfile.txt
utilise la redirection standard du shell. Si vous utilisez Powershell, il peut y avoir un problème de liaison de texte ou vous pouvez obtenir un fichier cassé s'il est binaire . Avec lagit restore
modification des fichiers se fait tout pargit
exécutable.Un autre avantage est que vous pouvez restaurer un dossier entier avec:
git restore --source otherbranch path/to
ou avec
git restore --overlay --source otherbranch path/to
si vous voulez éviter de supprimer des fichiers. Par exemple, s'il y a moins de fichiersotherbranch
que dans le répertoire de travail actuel (et que ces fichiers sont suivis ) sans--overlay
option, ilsgit restore
seront supprimés. Mais c'est un bon comportement par défaut, vous voudrez probablement que l'état du répertoire soit le même que dansotherbranch
, pas "le même mais avec des fichiers supplémentaires dans ma branche actuelle"la source
git restore
moyen de copier un fichier de la branche source vers un nouveau fichier sur la branche cible? Avec git show, je peux le faire avec la redirection de shell (git show otherbranch:path/to/file1.txt > path/to/file2.txt
), mais je veux éviter la redirection de shell pour les raisons que vous avez mentionnées.git restore
(mais qui sait;)). Ces problèmes de redirection sont essentiellement un problème Powershell, je ne sais pas s'il y a un autre shell qui a un problème avec lui. Je reviens habituellement à "git bash" ou même "cmd" où j'ai besoin d'utiliser les commandes "git show
avec redirection". Ou utilisez une interface graphique comme GitExtensions où vous pouvez parcourir l'arborescence des fichiers de validation et cliquez sur "Enregistrer sous" sur n'importe quel fichier.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 cela
git add ...
avait été fait), et que la deuxième option entraîne simplement la copie du fichier, mais ne met pas en scène les modifications (comme si vous aviez juste édité le fichier manuellement et avait des différences remarquables).Git copier le fichier d'une autre branche sans le mettre en scène
Modifications par étapes (par exemple
git add filename)
:Modifications en suspens (non échelonnées ou engagées):
la source