web-dev-qa-db-fra.com

Comment puis-je extraire des fichiers de la télécommande sans écraser les fichiers locaux?

J'essaie de configurer un nouveau référentiel Git sur un référentiel distant préexistant.

Je veux que mes fichiers locaux écrasent le référentiel distant, mais git indique que je dois d'abord extraire ces fichiers distants et les fusionner.

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

94
Joe Isaacson

Eh bien oui et non ...

Je comprends que vous souhaitiez que vos copies locales "écrasent" le contenu de la télécommande, mais si vous avez modifié les fichiers du référentiel distant dans un autre différent , et vous ignorez leurs modifications et essayez de "forcer" vos propres modifications sans même en regardant les conflits possibles, eh bien, je pleure pour vous (et vos collègues) ;-)

Cela dit, c’est vraiment facile de faire ce qu'il faut "

étape 1:

git stash

dans votre dépôt local. Cela épargnera vos mises à jour locales dans la réserve, puis ramènera vos fichiers modifiés à leur état de pré-édition.

étape 2:

git pull

pour obtenir des versions modifiées. J'espère que les nouvelles versions des fichiers ne vous inquiètent pas. Si ce n'est pas le cas, la prochaine étape se déroulera sans problème. Si le fait , vous avez du travail à faire et vous serez heureux de l'avoir fait.

étape 3:

git stash pop

Cela va fusionner vos versions modifiées que vous avez cachées à l’étape 1 avec les versions que vous avez extraites à l’étape 2. Si tout se passe bien, tout sera prêt!

Si, en revanche, il y avait de réels conflits entre ce que vous avez extrait à l'étape 2 et vos modifications (en raison de la modification effectuée par une autre personne dans l'intervalle), vous découvrirez et on vous demandera de les résoudre. Fais le.

Les choses se dérouleront beaucoup mieux . Ainsi, vos modifications seront probablement conservées sans travail réel de votre part, tout en vous alertant des problèmes graves.

152
Bob Gilmore

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

git stash
git pull Origin master
git stash pop

Tout ce qui annule les modifications à distance aura des conflits que vous devrez résoudre manuellement.

22
Ryan Bigg

Vous avez donc engagé vos modifications locales dans votre référentiel local. Ensuite, pour obtenir des modifications à distance dans votre référentiel local sans apporter de modification à vos fichiers locaux, vous pouvez utiliser git fetch. En réalité, 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é:

Supposons que votre référentiel soit comme ceci (vous avez apporté les modifications test2:

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

Et le référentiel 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 tirer en premier si vous essayez de transférer votre test2 Vers un référentiel distant. Si vous voulez voir ce qu'est test1 sans modifier votre référentiel local, lancez 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 à distance dans une autre branche et vous conservez vos fichiers locaux intacts.

Alors quelle est la prochaine? Vous pouvez faire un git merge, Qui aura le même effet que git pull (Lorsque combiné avec le précédent git fetch), Ou, comme je le préférerais, un git rebase Origin/master Pour appliquer votre modification au-dessus de Origin/master, Ce qui vous donne un historique plus propre.

13
Penghe Geng