web-dev-qa-db-fra.com

Git merge rapporte "Déjà à jour" bien qu'il y ait une différence

J'ai un référentiel Git avec 2 branches: master et test.

Il existe des différences entre les branches master et test.

Toutes les modifications ont été engagées dans les deux branches.

Si je fais:

 git checkout master
git diff test

Un écran plein de modifications apparaît montrant les différences. Je souhaite fusionner les modifications dans la branche test et le faire également:

test de fusion git

Mais recevez le message "Déjà à jour"

Cependant, l'examen des dossiers sous chaque branche différente montre clairement des différences.

Quel est le problème ici et comment puis-je le résoudre?

214
Charles Darke

Le message «Déjà à jour» signifie que tous les changements de la branche que vous essayez de fusionner ont déjà été fusionnés à la branche sur laquelle vous vous trouvez. Plus spécifiquement, cela signifie que la branche que vous essayez de fusionner est un parent de votre branche actuelle . Félicitations, c’est la fusion la plus facile que vous puissiez faire. :)

Utilisez gitk pour jeter un coup d’œil sur votre référentiel. L'étiquette de la branche «test» devrait se situer quelque part en dessous de votre étiquette de branche «principale».

Votre succursale est à jour en ce qui concerne sa société mère. Selon la fusion, il n'y a pas de nouveaux changements dans le parent depuis la dernière fusion. Cela ne signifie pas que les branches sont les mêmes, car vous pouvez avoir beaucoup de changements dans votre branche et cela ressemble à ce que vous faites. 

111
Bombe

Cela m’arrive souvent lorsque je sais que des modifications ont été apportées au maître distant. J’essaie donc de les fusionner à l’aide de git merge master. Toutefois, cela ne fusionne pas avec le maître distant, mais avec votre maître local.

Donc, avant de procéder à la fusion, cliquez sur Checkout Master, puis sur git pull. Ensuite, vous pourrez fusionner les nouvelles modifications dans votre branche.

99
ACarter

Supposons que vous ayez une branche master

Maintenant, vous créez un test de branche, travaillez dessus et effectuez 4 commits:


                 E -- F -- G -- H
                /
A -- B -- C -- D

La tête de master pointe vers D et celle de test pointe vers H.

Le message "Déjà à jour" apparaît lorsque le HEAD de la branche dans laquelle vous fusionnez est un parent de la chaîne des validations de la branche que vous souhaitez fusionner . C'est le cas, ici : D

Ceci est un travail pour la commande Gitreset. Vous voulez également que le répertoire de travail reflète cette modification, vous allez donc procéder à une réinitialisation de hard:

git reset --hard H
33
Marek Stanley

Une fusion est toujours entre le HEAD actuel et un ou plusieurs commits (généralement, tête de branche ou balise),
et le fichier d’index doit correspondre à l’arbre de HEAD commit (c’est-à-dire au contenu du dernier commit) lorsqu’il commence.
En d'autres termes, git diff --cached HEAD ne doit signaler aucun changement. 

Le commit fusionné est déjà contenu dans HEAD. C'est le cas le plus simple, appelé "Déjà à jour".

Cela devrait signifier que les commits dans le test sont déjà fusionnés dans le maître, mais puisque d'autres commits sont effectués sur le maître, git diff test donnerait encore quelques différences.

6
VonC

Cela m'est arrivé parce que étrangement, GIT pensait que la branche locale était différente de la branche distante . Cela était visible dans le graphique de la branche: il affichait deux branches différentes: remotes/Origin/nom-branche et nom-branche.

La solution consistait simplement à supprimer le dépôt local et à le cloner de nouveau à distance. De cette façon, GIT comprendrait que les télécommandes/Origine/nom de branche> et nom de branche sont en fait les mêmes, et que je pourrais émettre le git merge branch_name.

rm <my_repo>
git clone <my_repo>
cd <my_repo>
git checkout <branch_name>
git pull
git checkout master
git merge <branch_name>
4
cdupont

Cela est dû au fait que votre copie locale de la branche que vous souhaitez fusionner est obsolète. J'ai ma branche, appelée MyBranch et je veux la fusionner en ProjectMaster.

_>git status
On branch MyBranch-Issue2
Your branch is up-to-date with 'Origin/MyBranch-Issue2'.

nothing to commit, working tree clean

_>git merge ProjectMaster
Already up-to-date.

Mais je sais qu'il y a des changements qui doivent être fusionnés! 

Voici la chose, quand je tape git merge ProjectMaster, git regarde ma copie locale de cette branche, qui peut ne pas être courante . Pour voir si c'est le cas, je demande d'abord à Git de vérifier si mes branches sont périmées et de rechercher les modifications éventuelles si, en utilisant, euh, fetch. Ensuite, je saute dans la branche que je souhaite fusionner pour voir ce qui s'y passe ...

_>git fetch Origin

_>git checkout ProjectMaster
Switched to branch ProjectMaster
**Your branch is behind 'Origin/ProjectMaster' by 85 commits, and can be fast-forwarded.**
  (use "git pull" to update your local branch)

Ah-ha! Ma copie locale est périmée par 85 commits, ça explique tout! Maintenant, Pull note les modifications qui me manquent, puis saute à MyBranch et recommencez la fusion.

_>git pull
Updating 669f825..5b49912
Fast-forward

_>git checkout MyBranch-Issue2
Switched to branch MyBranch-Issue2
Your branch is up-to-date with 'Origin/MyBranch-Issue2'.

_>git merge ProjectMaster
Auto-merging Runbooks/File1.ps1
CONFLICT (content): Merge conflict in Runbooks/Runbooks/File1.ps1

Automatic merge failed; fix conflicts and then commit the result.

Et maintenant, j'ai un autre problème à résoudre ...

3
FoxDeploy

Face à ce scénario en utilisant Git Bash.

Notre référentiel a plusieurs branches et chaque branche a un cycle de validation différent et la fusion se produit de temps en temps . Old_Branch était utilisé comme parent pour New_Branch

Old_Branch a été mis à jour avec certaines modifications nécessitant d'être fusionnées avec New_Branch

Utilisait en dessous de la commande pull sans branche pour obtenir toutes les sources de toutes les branches.

git pull origine

Étrangement, cela ne tire pas tous les commits de toutes les branches. J'avais pensé que, comme indiqué, presque toutes les branches et tous les tags.

Donc, pour résoudre ce problème, Old_Branch avait vérifié le dernier en utilisant

git checkout Old_Branch

git pull Origine Vieux_Branch

Maintenant vérifié New_Branch

git checkout New_Branch

Tiré pour être sûr

git pull Origine New_Branch

fusion de Old_Branch

Et alto a eu des conflits à résoudre de Old_Branch à New_Branch :) qui était prévu

2
satlead

est arrivé à moi et a été envoyé à cette page, pas sûr si j'avais le même scénario, mais le mien était moi essayant de "re-fusionner" cette branche "de test".

Donc, je l'avais déjà fusionné, mais j'excluais volontairement certains changements lors de cette fusion, de sorte qu'il y a clairement des différences entre les branches. J'essayais alors de le fusionner de nouveau parce que je réalisais/oubliais que j'aurais dû et que je voulais ajouter un changement/fichier particulier que j'avais précédemment exclu et j'espérais que si je refaisais une fusion montrerait tous les changements que j'avais exclus , mais je me suis trompé et le message "Déjà mis à jour" apparaît à la place.

Après avoir lu le commentaire/la réponse de @ Bombe, il a raison, et je crois que git se comporte de la sorte. J'ai donc procédé à une sauvegarde matérielle des fichiers sur la branche test, puis extrait la branche principale, puis y coller manuellement les fichiers et les valider. comme s'il s'agissait de nouveaux changements.

je ne suis pas sûr que ce soit la bonne façon ou s'il pourrait aider d'autres personnes aux prises avec le même problème, mais cela a apporté une solution à mon cas particulier.

2
bubjavier

git merge Origin/master à la place git merge master a fonctionné pour moi. Donc, pour fusionner le maître dans une branche de fonctionnalité, vous pouvez utiliser:

git checkout feature_branch
git merge Origin/master
2
Justas

Ce qui fonctionne pour moi, disons que vous avez branch1 et que vous voulez le fusionner en branch2.

Vous ouvrez la ligne de commande git dans le dossier racine de branch2 et tapez:

git checkout branch1
git pull branch1
git checkout branch2
git merge branch1
git Push

Si vous avez des conflits, vous n'avez pas besoin de faire Git Push, mais d'abord résoudre les conflits et ensuite Push.

2
Stefan Pintilie

Si la fusion d'une branche A dans une branche B indique "Déjà à jour", l'inverse n'est pas toujours vrai. Cela n’est vrai que si la branche B est un descendant de la branche A, sinon La branche B peut simplement avoir des modifications qui ne sont pas dans A. 

Exemple:

  1. Vous créez des branches A et B off master
  2. Vous apportez certaines modifications dans le maître et ne les fusionnez que dans la branche B (sans mettre à jour ni oublier de mettre à jour la branche A).
  3. Vous effectuez des modifications dans la branche A et fusionnez A à B.

À ce stade, la fusion de A à B indique "Déjà à jour", mais les branches sont différentes, car la branche B dispose de mises à jour depuis le maître, contrairement à la branche A. 

2
Stan Bashtavenko

Assurez-vous d’abord de vérifier la branche que vous souhaitez fusionner, puis de la retirer (pour que votre version locale corresponde à la version distante). 

Revenez ensuite dans votre branche sur laquelle vous souhaitez effectuer la fusion et votre fusion avec Git devrait fonctionner.

1
John Murphy

La même chose m’est arrivée… .. Mais le scénario était un peu différent, j’avais la branche principale et j’en ai tiré le release_1 (dis). Quelques modifications ont été apportées à la branche release_1 et fusionnées dans Origin. puis j’ai utilisé ssh et sur le serveur distant J'ai extrait à nouveau release_1 à l’aide de la commande git checkout -b release_1 - qui crée en fait une nouvelle release_ de branche_! depuis le maître plutôt que d'extraire la branche existante existante release_1 depuis Origin . Le problème a été résolu en supprimant le commutateur "-b". 

0
Deepika Anand

J'ai eu le même problème. J'ai eu des changements dans la télécommande et il était toujours affiché "Déjà à jour". Recloner le référentiel a résolu le problème pour moi.

0
Mohammad Rayan