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.
_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.
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.
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
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.
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.
Ou si vous voulez tous les fichiers d'une autre branche:
git checkout <branch name> -- .