web-dev-qa-db-fra.com

Git Merge: erreur: impossible de dissocier l'ancien <fichier>: aucun fichier ou répertoire de ce type

Je tire une branche dans master afin de la fusionner.

La commande que j’exécute est (avec master extrait): git pull Origin feature/some_branch

Malheureusement, il semblerait que mes collègues aient effectué des suppressions de fichiers (ce que je penserais comme étant bénins), et maintenant, Git lance un error: unable to unlink old 'somefile': No such file or directory.

J'ai essayé de regarder en ligne, mais la plupart des références de cette erreur concernent les autorisations, ce qui n'est pas le cas ici.

Le fichier en question est pas présent sur le maître avant la fusion, alors qu'il l'est dans la nouvelle branche.

Le problème est que master n'a pas été mis à jour depuis longtemps, il y a donc trop de modifications et de fichiers affectés pour que je puisse commencer à comprendre le code.

J'ai simplement besoin de master pour contenir tous les changements apportés par la nouvelle branche. Nous ne commettons jamais rien directement dans master, toujours par fusions. 

Ce que j'ai essayé jusqu'à présent:

  • Utilisation du paramètre --force, même problème
  • git reset Origin/master --hard et relancer la pull, même problème

Comment puis-je mettre à jour master avec une autre branche plus récente sans prendre en compte de tels problèmes et en conservant son historique?

6
Skwiggs

J'ai juste besoin de maître pour contenir tous les changements apportés par la nouvelle branche. 

Vous pouvez ensuite forcer la fusion afin de refléter le contenu de cette branche feature/some_branch.

Mais au lieu d'utiliser merge --ours master, vous pouvez utiliser une idée similar , qui conserve l'historique de premier parent

git checkout master

# make merge commit but without conflicts!!
# the contents of 'ours' will be discarded later
git merge -s ours feature/some_branch    

# make temporary branch to merged commit
git branch tmp         

# get contents of working tree and index to the one of feature/some_branch
git reset --hard feature/some_branch

# reset to our merged commit but 
# keep contents of working tree and index
git reset --soft tmp

# change the contents of the merged commit
# with the contents of feature/some_branch
git commit --amend

# get rid off our temporary branch
git branch -D tmp

# verify that the merge commit contains only contents of feature/some_branch
git diff HEAD feature/some_branch
3
VonC

Pour remplacer votre branche master par la version sur Origin/master, vous pouvez essayer de la supprimer et de la recréer. Il n'est pas nécessaire d'extraire master pendant cette opération, vous pourrez ainsi éviter les erreurs liées à la modification de votre répertoire de travail.

Commencez par vérifier une autre branche que vous pouvez vérifier:

git checkout feature/some-branch

Ensuite, supprimez votre branche master locale et créez-la à nouveau, y compris ses informations de suivi:

git branch --delete master
git branch master Origin/master
git branch --set-upstream-to=Origin/master master

Enfin, essayez de passer à la nouvelle master:

git branch checkout master
0
Rory O'Kane