158 votes

Comment puis-je tirer des fichiers à distance sans écraser les fichiers locaux?

Je suis en train de mettre en place un nouveau dépôt git vers 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 récupérer ces fichiers distants et les fusionner.

Y a-t-il un moyen de récupérer mais de s'assurer que les fichiers locaux ne sont pas écrasés par le distant ?

246voto

Bob Gilmore Points 2161

Eh bien, oui, et non...

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

Cela dit, cependant, c'est vraiment facile de faire ce qui est "correct..."

Étape 1:

git stash

dans votre dépôt local. Cela sauvegardera vos mises à jour locales dans le stash, puis rétablira vos fichiers modifiés dans leur état d'avant modification.

Étape 2:

git pull

pour obtenir toute version modifiée. Maintenant, espérons que cela n'obtiendra pas de nouvelles versions des fichiers qui vous inquiètent. Si ce n'est pas le cas, alors l'étape suivante se déroulera sans problème. Si cela arrive, alors vous aurez du travail à faire, et vous serez content de l'avoir fait.

Étape 3:

git stash pop

Cela fusionnera vos versions modifiées que vous avez rangées dans l'étape 1 avec les versions que vous venez de récupérer dans l'étape 2. Si tout se passe bien, vous serez prêt !

Si, d'un autre côté, il y avait des vrais conflits entre ce que vous avez récupéré à l'étape 2 et vos modifications (dû à quelqu'un d'autre ayant édité entre-temps), vous serrez informé et on vous dira de les résoudre. Faites-le.

Les choses fonctionneront beaucoup mieux de cette manière - cela gardera probablement vos modifications sans aucun vrai travail de votre part, tout en vous alertant sur de sérieux problèmes.

32voto

Ryan Bigg Points 64561

Vous pouvez ranger vos modifications locales d'abord, puis tirer, puis récupérer le rangement.

git stash
git pull origin master
git stash pop

Tout ce qui annule les changements distants entraînera des conflits que vous devrez résoudre manuellement.

18voto

xiaobai Points 2004

Donc, vous avez commis vos modifications locales à votre dépôt local. Ensuite, pour obtenir les modifications distantes dans votre dépôt local sans apporter de modifications à vos fichiers locaux, vous pouvez utiliser git fetch. En fait, git pull est une opération en deux étapes : un git fetch non destructif suivi d'un git merge. Voir Quelle est la différence entre 'git pull' et 'git fetch' ? pour plus de discussion.

Exemple détaillé :

Supposez que votre dépôt soit comme ceci (vous avez fait des changements test2) :

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

Et le dépôt origin est comme ceci (quelqu'un d'autre a commis test1) :

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

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

$ git fetch

Votre dépôt local résultant serait comme ceci :

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

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

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/master pour appliquer vos changements au-dessus de origin/master, ce qui vous donne un historique plus propre.

6voto

Explosion Points 84

Toutes les autres réponses peuvent encore avoir des conflits de fusion. Si vous ne voulez vraiment pas traiter les conflits et simplement tirer sans écraser les fichiers locaux avec les modifications, voici comment procéder :

Mettez en cache vos modifications locales :

git stash

Tirez tout (si cela vous donne des conflits, faites simplement git reset --hard HEAD, vous avez sauvegardé vos modifications avec la mise en cache)

git pull --force

Appliquez maintenant votre mise en cache de force (pas de conflits !)

git checkout stash -- .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X