web-dev-qa-db-fra.com

Comment obtenir juste un fichier d'une autre branche

J'utilise git et travaille sur master branch. Cette branche a un fichier appelé app.js.

J'ai une branche experiment dans laquelle j'ai apporté pas mal de changements et des tonnes de commits. Maintenant, je veux apporter toutes les modifications apportées uniquement à la branche app.js de experiment à master.

Comment je fais ça?

Encore une fois, je ne veux pas de fusion. Je veux juste apporter tous les changements dans app.js de experiment branche à master branche.

1096
Nick Vanderbilt
_git checkout master               # first get back to master
git checkout experiment -- app.js # then copy the version of app.js 
                                  # from branch "experiment"
_

Voir aussi git comment annuler les modifications d'un fichier?


Mise à jour d'août 2019, Git 2.23: avec les nouvelles commandes git switch et git restore , qui seraient:

_git switch master
git restore -s experiment -- app.js
_

Par défaut, seul l’arbre de travail est restauré.
Si vous souhaitez également mettre à jour l'index (ce qui signifie restaurer le contenu du fichier, et ajoutez-le à l'index en une seule commande):

_git restore -s experiment --staged --worktree -- app.js
# shorter:
git restore -s experiment -WS -- app.js
_

Comme Jakub Narębski mentionne dans les commentaires:

_git show experiment:path/to/app.js > path/to/app.js
_

fonctionne aussi, sauf que, comme détaillé dans la SO question " Comment récupérer un seul fichier d'une révision spécifique dans Git? ", vous devez utiliser le chemin complet à partir de la racine répertoire du repo.
D'où le chemin/to/app.js utilisé par Jakub dans son exemple.

Comme Frosty mentionne dans le commentaire:

vous obtiendrez seulement l'état le plus récent de app.js

Mais, pour _git checkout_ ou _git show_, vous pouvez réellement référencer toute révision de votre choix, comme illustré dans la SO question " révision de git checkout d'un fichier dans git gui ":

_$ git show $REVISION:$FILENAME
$ git checkout $REVISION -- $FILENAME
_

serait le même si $ FILENAME est un chemin complet d'un fichier versionné.

_$REVISION_ peut être comme indiqué dans git rev-parse :

_experiment@{yesterday}:app.js # app.js as it was yesterday 
experiment^:app.js            # app.js on the first commit parent
experiment@{2}:app.js         # app.js two commits ago
_

etc.

schmijos ajoute dans les commentaires :

vous pouvez également le faire à partir d'une réserve:

_git checkout stash -- app.js
_

Ceci est très utile si vous travaillez sur deux branches et que vous ne voulez pas vous engager.

1393
VonC

Tout est beaucoup plus simple, utilisez git checkout pour cela.

Supposons que you're on master branche, pour obtenir app.js from new-feature branche faire:

_git checkout new-feature path/to/app.js

// note that there is no leading slash in the path!
_

Cela vous apportera le contenu du fichier souhaité. Vous pouvez, comme toujours, tiliser une partie de sha1 au lieu denouveauténom de la branche pour obtenir le fichier tel qu'il était dans ce commit particulier.

303
Dmitry Avtonomov

Complément aux réponses de VonC et chhh.

git show experiment:path/to/relative/app.js > app.js
# If your current working directory is relative than just use
git show experiment:app.js > app.js

ou

git checkout experiment -- app.js
32
AlexLordThorsen
git checkout branch_name file_name

Exemple:

git checkout master App.Java

Cela ne fonctionnera pas si le nom de votre branche comporte un point.

git checkout "fix.june" alive.html
error: pathspec 'fix.june' did not match any file(s) known to git.
24
Sarath

Passez en revue le fichier sur github et extrayez-le

C'est une approche pragmatique qui ne répond pas directement au PO, mais certains ont trouvé utile:

Si la branche en question est sur GitHub, vous pouvez naviguer vers la branche et le fichier souhaités en utilisant l’un des nombreux outils proposés par GitHub, puis cliquez sur "Raw" pour afficher le texte brut et (éventuellement) copier et coller le texte comme suit. voulu.

J'aime cette approche car elle vous permet de consulter l'intégralité du fichier distant avant de le transférer sur votre ordinateur local.

5
fearless_fool

Ou si vous voulez tous les fichiers d'une autre branche:

git checkout <branch name> -- .
5
Jester