Le scénario:
- Je fais quelques changements dans un seul fichier localement et je l'exécute
git add
,git commit
etgit push
- Le fichier est poussé vers le référentiel maître d'origine distant
- J'ai un autre référentiel local qui est déployé via Capistrano avec la méthode "remote_cache" de ce référentiel distant
- Maintenant, je ne veux pas déployer toute l'application, mais simplement mettre à jour / extraire ce fichier unique.
Est-ce possible avec git? Je n'ai pas pu trouver quoi que ce soit qui marcherait, ni le comprendre. Avec SVN je viens de le faire svn up file
et le tour est joué.
git
git-checkout
forêt
la source
la source
git restore -s origin/master -- path/to/file
. Voir ma réponse ci-dessous .Réponses:
Il est possible de le faire (dans le référentiel déployé)
L'extraction télécharge toutes les modifications récentes, mais ne les place pas dans votre code d'extraction actuel (zone de travail).
La caisse mettra à jour l'arborescence de travail avec le fichier particulier des modifications téléchargées (
origin/master
).Au moins, cela fonctionne pour moi pour ces petites petites corrections de faute de frappe, où il semble étrange de créer une branche, etc. juste pour changer un mot dans un fichier.
la source
git status
je les vois commeChanges to be committed:
- ce qui signifie, je dois les commettre à nouveau? (juste en notant que je voulais rafraîchir un seul fichier intact, mais le dépôt lui-même est touché dans une machine différente)Le code suivant a fonctionné pour moi:
la source
la source
git archive --remote=https://github.com/git/git.git master:git/contrib/completion git-completion.bash | tar -x
me donne un message d'erreur:fatal: Operation not supported by protocol.
tar
: s--to-stdout
,git archive --remote="gitolite3@<host>:<repo>" <tag> <file> | tar xf - --to-stdout
Avec Git 2.23 (août 2019) et la nouvelle commande (toujours expérimentale)
git restore
, vue dans " Comment réinitialiser tous les fichiers du répertoire de travail mais pas de la zone de transit? ", Ce serait:L'idée est:
git restore
ne traite que des fichiers, pas des fichiers et des branches comme legit checkout
fait.Voir " Confus par
git checkout
": c'est làgit switch
qu'intervient)codersam ajoute dans les commentaires :
la source
git restore -s upstream/master -- path/to/file
Ce que vous pouvez faire, c'est:
Mettez à jour votre dépôt git local:
git fetch
Créez une succursale locale et passez votre commande dessus:
git branch pouet && git checkout pouet
Appliquez le commit que vous souhaitez sur cette branche:
git cherry-pick abcdefabcdef
(abcdefabcdef est le sha1 du commit que vous souhaitez appliquer)
la source
git checkout -b pouet
.Ou git stash (si vous avez des modifications) sur la branche sur laquelle vous vous trouvez, checkout master, tirez pour les dernières modifications, saisissez ce fichier sur votre bureau (ou l'application entière). Vérifiez la succursale où vous étiez. Git stash s'applique à l'état dans lequel vous vous trouviez, puis corrigez les modifications manuellement ou faites-le glisser en remplaçant le fichier.
Cette façon n'est pas tellement cool mais ça marche si vous ne pouvez rien comprendre d'autre.
la source
Je pense avoir trouvé un hack facile.
Supprimez le fichier que vous avez sur le référentiel local (le fichier que vous souhaitez mettre à jour à partir de la dernière validation sur le serveur distant)
Et puis faites un
git pull
Parce que le fichier est supprimé, il n'y aura pas de conflit
la source