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?
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.
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.
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
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.
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>
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 ...
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
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.
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
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.
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:
À 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.
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.
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".
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.