web-dev-qa-db-fra.com

Résolution des conflits de fusion Git

Un référentiel Git a été cloné sur plusieurs machines locales de développeurs. Certaines modifications ont été apportées au code dans le référentiel. Nous obtenons maintenant l'erreur:

error: Your local changes to the following files would be overwritten by merge:

        public_html/sites/file
        public_html/sites/file1.txt
        public_html/sites/file2.txt
Please, commit your changes or stash them before you can merge.
Aborting

J'ai lu pas mal de discussions en ligne et plusieurs options différentes ont été suggérées. Une approche a été mise en œuvre:

 git stash
 git pull
 git stash pop

Je pense que je comprends le principe de base du stockage. Ma question est, est-ce une bonne solution, et pourrais-je rencontrer des problèmes en utilisant cette approche? J'ai une compréhension raisonnable du développement Web en général, mais je suis un utilisateur Git assez basique et je n'aurais pas beaucoup de capacité à me sortir des ennuis à ce stade.

32
g_thom

git stash est parfaitement légitime, bien que, comme l'a dit Greg, pour une raison quelconque, la résolution des conflits peut devenir étrange. Mais ils sont toujours réparables, vous ne fuierez rien. La commande que je connais pour réappliquer la cachette est git stash apply, mais pop peut être une alternative que je ne connais pas (ou cela pourrait faire quelque chose de différent, je ne sais pas, donc vous voudrez probablement utiliser apply.)

Y a-t-il une raison pour laquelle vous ne souhaitez pas valider ces modifications avant la fusion? C'est généralement la bonne chose à faire.

Une autre option est:

git stash
git checkout -b newwork
git stash apply
git commit ...

Cela crée une nouvelle branche, qui vous permettra de mettre à jour votre master sans conflits (checkout master à nouveau, puis pull ou fetch + merge). Ensuite, vous pouvez fusionner votre branche avec (tout en étant toujours maître) git merge newwork. Vous pouvez résoudre les conflits sur master, tout en conservant le travail sur newwork sans aucun conflit. C'est un peu plus sûr si vous craignez que les conflits ne gâchent vraiment les choses, mais en général, les conflits ne sont qu'une partie du processus, alors ne vous en faites pas trop.

15
kylben

Il est recommandé de toujours valider les modifications locales avant d'extraire (fusionner) du nouveau code. Si vous ne vous engagez pas, Git ne sait pas comment vous souhaitez gérer vos modifications locales. Fusionner uniquement avec un arbre de travail propre.

Il peut y avoir des conflits dans la fusion, en raison des mêmes fichiers modifiés localement et par quelqu'un d'autre. D'après mon expérience, la résolution des conflits à partir d'une opération fusion réelle est légèrement plus simple que la résolution du même conflit à partir d'une opération stash pop.

6
Greg Hewgill

J'ai une autre solution:

git reset --hard FETCH_HEAD

Cela fonctionne dans presque tous les cas.

3
Narga

Vous devez d'abord:

git checkout -- public_html/sites/file
git checkout -- public_html/sites/file1.txt
git checkout -- public_html/sites/file2.txt

L'étape suivante:

git pull Origin master
1
MrBii