Comment extraire des fichiers à distance sans écraser les fichiers locaux?

113

J'essaie de configurer un nouveau dépôt git sur un dépôt distant préexistant.

Je veux que mes fichiers locaux écrasent le dépôt distant, mais git dit que je dois d'abord extraire ces fichiers distants et les fusionner.

Existe-t-il un moyen d'extraire mais assurez-vous que les fichiers locaux ne sont pas écrasés par la télécommande?

Joe Isaacson
la source

Réponses:

182

Eh bien, oui et non ...

Je comprends que vous voulez que vos copies locales "écrasent" ce qui se trouve dans la télécommande, mais, oh, mec, si quelqu'un a modifié les fichiers du dépôt distant d'une manière différente , vous ignorez simplement leurs modifications et essayez de "forcer" vos propres changements sans même regarder les conflits possibles, eh bien, je pleure pour vous (et vos collègues) ;-)

Cela dit, cependant, il est vraiment facile de faire la "bonne chose ..."

Étape 1:

git stash

dans votre repo local. Cela enregistrera vos mises à jour locales dans la réserve, puis rétablira vos fichiers modifiés dans leur état de pré-édition.

Étape 2:

git pull

pour obtenir les versions modifiées. Maintenant, j'espère que cela n'obtiendra pas de nouvelles versions des fichiers qui vous inquiètent. Si ce n'est pas le cas, l'étape suivante fonctionnera sans problème. Si c'est le cas , vous avez du travail à faire et vous serez heureux de l'avoir fait.

Étape 3:

git stash pop

Cela fusionnera vos versions modifiées que vous avez cachées à l'étape 1 avec les versions que vous venez d'extraire à l'étape 2. Si tout se passe bien, vous serez prêt!

Si, d'un autre côté, il y avait de réels conflits entre ce que vous avez extrait à l'étape 2 et vos modifications (en raison de la modification par quelqu'un d'autre dans l'intervalle), vous le découvrirez et vous serez invité à les résoudre. Fais le.

Les choses fonctionneront beaucoup mieux de cette façon - cela conservera probablement vos modifications sans aucun travail réel de votre part, tout en vous alertant sur des problèmes graves et sérieux.

Bob Gilmore
la source
5
pourquoi pas seulement git commitdes changements locaux avant git pull?
Don Cheadle
10
Parfois, je suis dans une position où je ne veux pas valider le code, mais je voudrais le garder dans ma machine locale, ces ensembles de commandes sont vraiment utiles pour cela.
Vargan
3
Cela n'est pas utile si vous avez plusieurs fichiers, certains que vous souhaitez écraser et d'autres que vous ne souhaitez pas écraser. N'existe-t-il aucun moyen de dire à GIT d'ignorer les fichiers lors de l'extraction? Pourquoi .gitignore ne fonctionne-t-il que pour pousser, je ne comprends pas du tout cette décision de conception ...
Bobak Hashemi
25

Vous pouvez d'abord stocker vos modifications locales, puis extraire, puis faire apparaître la réserve.

git stash
git pull origin master
git stash pop

Tout ce qui remplace les modifications de la télécommande aura des conflits que vous devrez résoudre manuellement.

Ryan Bigg
la source
4
J'ai déjà validé ces modifications localement afin qu'il indique qu'il n'y a "aucune modification locale à enregistrer"
Joe Isaacson
je pense que c'est la meilleure stratégie.
Jimmy Obonyo Abor
13

Vous avez donc validé vos modifications locales dans votre référentiel local. Ensuite, pour obtenir des modifications à distance dans votre référentiel local sans apporter de modifications à vos fichiers locaux, vous pouvez utiliser git fetch. En fait, il git pulls'agit d'une opération en deux étapes: une opération non destructive git fetchsuivie d'un git merge. Voir Quelle est la différence entre «git pull» et «git fetch»?pour plus de discussion.

Exemple détaillé:

Supposons que votre référentiel ressemble à ceci (vous avez apporté des modifications test2:

* ed0bcb2 - (HEAD, master) test2
* 4942854 - (origin/master, origin/HEAD) first

Et le originréférentiel est comme ça (quelqu'un d'autre s'est engagé test1):

* 5437ca5 - (HEAD, master) test1
* 4942854 - first

À ce stade, git se plaindra et vous demandera de tirer d'abord si vous essayez de pousser votre test2dépôt vers un dépôt distant. Si vous voulez voir ce qu'est test1 sans modifier votre référentiel local, exécutez ceci:

$ git fetch

Votre référentiel local de résultats ressemblerait à ceci:

* ed0bcb2 - (HEAD, master) test2 
| * 5437ca5 - (origin/master, origin/HEAD) test1 
|/  
* 4942854 - first 

Vous avez maintenant les modifications distantes dans une autre branche et vous gardez vos fichiers locaux intacts.

Alors quelle est la prochaine étape? Vous pouvez faire un git merge, qui aura le même effet que git pull(lorsqu'il est combiné avec le précédent git fetch), ou, comme je préférerais, faire un git rebase origin/masterpour appliquer votre changement par-dessus origin/master, ce qui vous donne un historique plus propre.

Penghe Geng
la source
merci d'avoir expliqué git pull comme une fusion git fetch / git en deux étapes
cdabel