J'utilise git et travaille sur la branche master. Cette branche a un fichier appelé app.js
.
J'ai une experiment
branche dans laquelle j'ai fait un tas de changements et des tonnes de commits. Maintenant , je veux apporter toutes les modifications effectuées qu'à app.js
partir experiment
de la master
branche.
Comment je fais ça?
Encore une fois, je ne veux pas de fusion. Je veux juste apporter tous les changements app.js
de experiment
branche en master
branche.
git
git-checkout
Nick Vanderbilt
la source
la source
master
peut différerexperiment
, par exemple peut contenir des modifications fusionnées d'autres branches qui seraient perdues dans le fichier est simplement copié. PS d'autre part, il ne veut pas fusionner, mais pour autant que je sache, legit merge
terme est pour branche uniquement, pas pour fichier spécifique, donc pas de contradiction ici.Réponses:
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
etgit restore
, ce serait:Par défaut, seule l'arborescence de travail est restaurée.
Si vous souhaitez également mettre à jour l'index (c'est-à-dire restaurer le contenu du fichier et l' ajouter à l'index en une seule commande):
Comme Jakub Narębski le mentionne dans les commentaires:
fonctionne aussi, sauf que, comme détaillé dans la question SO " Comment récupérer un seul fichier d'une révision spécifique dans Git? ", vous devez utiliser le chemin complet depuis le répertoire racine du référentiel.
D'où le chemin / to / app.js utilisé par Jakub dans son exemple.
Comme Frosty le mentionne dans le commentaire:
Mais, pour
git checkout
ougit show
, vous pouvez en fait référencer n'importe quelle révision que vous voulez, comme illustré dans la question SO " git checkout revision of a file in git gui ":serait le même si $ FILENAME est un chemin complet d'un fichier versionné.
$REVISION
peut être comme indiqué dansgit rev-parse
:etc.
schmijos ajoute dans les commentaires :
la source
experiment:./app.js
. (Vous n'avez pas besoin de spécifier le chemin complet.) J'ai appris cela grâce au message d'erreur très utile que git m'a donné: "Vouliez-vous dire 'mybranch: full / path / to / my / file.xsl' aka 'mybranch: ./file.xsl '? " Oui je l'ai fait! Je ne pense pas avoir jamais été aussi ravi par un message d'erreur fatal.git restore -s new-feature path/to/app.js
Tout est beaucoup plus simple, utilisez git checkout pour cela.
Supposons que la
you're on master
branche, pour que laapp.js from new-feature
branche fasse:Cela vous apportera le contenu du fichier souhaité. Vous pouvez, comme toujours, utiliser une partie de sha1 au lieu du nom de la nouvelle branche pour obtenir le fichier tel qu'il était dans ce commit particulier.
Remarque :
new-feature
doit être une branche locale , pas distante.la source
git checkout origin/source_branch path/to/file
car si vous avez négligé de mettre à jour la branche source de votre dépôt local, vous pourriez obtenir une ancienne version du fichier ... Demandez-moi comment je sais. ;)Exemple:
Cela ne fonctionnera pas si le nom de votre branche contient un point.
la source
Complément aux réponses de VonC et de chhh.
ou
la source
--
) entre le nom de la branche et les chemins est-il facultatif? Est-ce uniquement pour empêcher que des chemins, qui commenceraient par un tiret, soient traités comme des options / commutateurs?--
est facultatif, mais il est plus utile d'éviter les conflits avec les noms de branche. Par exemple,git checkout -- foo
signifie «extraire le fichier foo de HEAD» (c'est-à-dire écraser les modifications locales dans foo , c'est-à-dire un sous-ensemble degit reset --hard
), maisgit checkout foo
pourrait signifier cela ou «allons à la branche foo ».Ou si vous voulez tous les fichiers d'une autre branche:
la source
.
fait une énorme différence: au lieu de passer à une autre branche, il copie tous les fichiers à partir de là tout en vous laissant sur la branche actuelle. Vous obtenez le contenu d'une autre branche sans y entrer.Examinez le fichier sur github et tirez-le de là
Il s'agit d'une approche pragmatique qui ne répond pas directement au PO, mais certains ont trouvé utile:
Si la branche en question se trouve sur GitHub, vous pouvez accéder à la branche et au fichier souhaités à l'aide de l'un des nombreux outils proposés par GitHub, puis cliquer sur 'Raw' pour afficher le texte brut et (facultativement) copier et coller le texte comme voulu.
J'aime cette approche car elle vous permet de regarder le fichier distant dans son intégralité avant de le tirer sur votre machine locale.
la source
Si vous voulez le fichier d'un commit particulier (n'importe quelle branche), dites 06f8251f
git checkout 06f8251f path_to_file
par exemple, dans les fenêtres:
git checkout 06f8251f C: \ A \ B \ C \ D \ file.h
la source
Une autre façon est de créer un patch avec les différences et de l'appliquer dans la branche master Par exemple. Disons que le dernier commit avant de commencer à travailler sur app.js est 00000aaaaa et que le commit contenant la version souhaitée est 00000bbbbb
Vous exécutez ceci sur la branche d'expérience:
Cela va créer un fichier avec toutes les différences entre ces deux validations pour app.js que vous pouvez appliquer où vous le souhaitez. Vous pouvez conserver ce fichier n'importe où en dehors du projet
Ensuite, en master, vous exécutez simplement:
vous allez maintenant voir les changements dans les projets comme si vous les aviez faits manuellement.
la source
J'espère que cela vous aidera. Veuillez me le faire savoir si vous avez des questions.
la source