J'ai un dépôt git avec 2 branches: master et test.
Il existe des différences entre les branches maître et test.
Les deux branches ont tous les changements engagés.
Si je fais:
git checkout master
test git diff
Un écran plein de changements apparaît montrant les différences. Je veux fusionner les modifications dans la branche de test et faire de même:
test de fusion git
Mais obtenez le message "Déjà à jour"
Cependant, l'examen des fichiers sous chaque branche différente montre clairement des différences.
Quel est le problème ici et comment le résoudre?
Réponses:
Le message «Déjà à jour» signifie que toutes les modifications de la branche que vous essayez de fusionner ont déjà été fusionnées avec la branche sur laquelle vous vous trouvez actuellement. Plus précisément, 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 simple que vous puissiez faire. :)
Utilisez
gitk
pour jeter un œil à votre référentiel. L'étiquette de la branche «test» doit se trouver quelque part sous votre étiquette de branche «maître».Votre succursale est à jour par rapport à son parent. 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 de travail et cela ressemble à vous.
Modifier le 10/12/2019:
Selon Charles Drake dans le commentaire de cette réponse, une solution pour résoudre le problème est:
Cela le ramène au niveau «test».
Alors fais:
afin de forcer le retour au référentiel central.
la source
Cela m'arrive souvent lorsque je sais qu'il y a des changements sur le maître distant, donc j'essaye de les fusionner en utilisant
git merge master
. Cependant, cela ne fusionne pas avec le maître distant, mais avec votre maître local.Donc, avant de faire la fusion, passez à la caisse, puis
git pull
là. Ensuite, vous pourrez fusionner les nouvelles modifications dans votre branche.la source
git fetch
mettrait à jour la branche principale même si je suis actuellement sur une autre. Il s'avère que non. Merci! Je suis sûr qu'il existe une optionfetch
qui vous permet de spécifier la branche à obtenir.git fetch --all
, mais cela ne récupère que les branches, il ne les tire pas.git fetch --all && git merge origin/master
. Pas besoin de mettre à jour votre localmaster
pour fusionner les modifications à distance.git merge master
et 1 avecgit merge origin/master
. J'avais également vérifiémaster
etgit pull
avant de mettre à jour 2 succursales. même s'ils partageaient le même contenu, la création d'un PR entre les 2 branches montrait quelques fichiers diff. J'ai corrigé pargit pull
la branche cible dans la branche de fonctionnalité, ce qui a montré:Already up to date! Merge made by the 'recursive' strategy.
cela a entraîné la validation de la fusion sans changement, mais a supprimé les fichiers diff inattendus de PR. une idée de la raison pour laquelle il existe une différence entre la fusion de branches locales et distantes "équivalentes"?Supposons que vous ayez une branche
master
avec l'historique de validation suivant:Maintenant, vous créez un test de branche, travaillez dessus et effectuez 4 validations:
master
la tête pointe vers D ettest
la tête pointe vers H.Le message "Déjà à jour" s'affiche lorsque le HEAD de la branche dans laquelle vous fusionnez est un parent de la chaîne de validations de la branche que vous souhaitez fusionner. C'est le cas, ici:
D
est un parent deE
.Il n'y a rien à la fusion de
test
lamaster
, puisque rien n'a changé surmaster
depuis. Ce que vous voulez faire ici est littéralement de dire à Git d'avoirmaster
la tête de pointer vers H, donc la branche master a l'historique des validations suivant:Il s'agit d'un travail pour la commande Git
reset
. Vous souhaitez également que le répertoire de travail reflète cette modification, vous effectuerez donc une réinitialisation matérielle :la source
git reset --hard
est une chose assez drastique à faire, peut-elle perdre des commits? Existe-t-il un moyen plus sûr d'apporter ces changements, ou les dangers sont-ilsgit reset --hard
exagérés?--hard
option est le fait qu'elle modifie réellement votre répertoire de travail, et par conséquent, vous perdez les modifications non validées. Personnellement, je faisgit status
avant et après chaque commande git exécutée manuellement pour m'assurer que mon dépôt est propre ou dans l'état attendu.--hard
option? J'ai été dans cette situation plusieurs fois maintenant et toujours réinitialisé sans--hard
. Cela a très bien fonctionné sans risque de perdre des modifications non validées.Ce qui fonctionne pour moi, disons que vous avez branch1 et que vous voulez le fusionner dans branch2.
Vous ouvrez la ligne de commande git allez dans le dossier racine de branch2 et tapez:
Si vous avez des conflits, vous n'avez pas besoin de faire git push, mais d'abord résoudre les conflits, puis pousser.
la source
Cela devrait signifier que les validations dans test sont déjà fusionnées dans master, mais comme d'autres validations sont effectuées sur master,
git diff test
cela donnerait quand même quelques différences.la source
Cela se produit car votre copie locale de la branche que vous souhaitez fusionner est obsolète. J'ai ma succursale appelée
MyBranch
et je veux la fusionnerProjectMaster
.Mais je sais qu'il y a des changements à fusionner!
Voici la chose, quand je tape
git merge ProjectMaster
, git regarde ma copie locale de cette branche, qui n'est peut-être pas à jour . Si oui en utilisant, euh, pour voir si tel est le cas, je dis d' abord Git pour vérifier et voir si mes branches sont à jour et les modifications aille chercherfetch
. Ensuite, je saute dans la branche que je veux fusionner pour voir ce qui s'y passe ...Ah-ha! Ma copie locale est périmée par 85 commits, cela explique tout! Maintenant, je
Pull
note les modifications qui me manquent, puis je rejoinsMyBranch
la tentative de fusion.Et maintenant, j'ai un autre problème à résoudre ...
la source
Cela m'est arrivé parce que GIT pensait étrangement que la branche locale était différente de la branche distante. Cela était visible dans le graphique des branches: il affichait deux branches différentes: télécommandes / origine / nom_branche et nom_branche.
La solution consistait simplement à supprimer le dépôt local et à le recloner à distance. De cette façon, GIT comprendrait que les télécommandes / origin / branch_name> et branch_name sont en effet les mêmes, et je pourrais émettre le
git merge branch_name
.la source
git merge origin/master
a plutôtgit merge master
fonctionné pour moi. Donc, pour fusionner le maître dans la branche de fonctionnalité, vous pouvez utiliser:la source
Assurez-vous de vérifier d'abord la branche que vous souhaitez fusionner, puis tirez-la (pour que votre version locale corresponde à la version distante).
Ensuite, passez à la succursale dans laquelle vous souhaitez effectuer la fusion et votre fusion Git devrait fonctionner.
la source
git pull
est arrivé à moi et a été envoyé sur cette page, je ne sais pas si j'avais le même scénario, mais le mien était moi essayant de "re-fusionner" cette branche "test".
J'ai donc précédemment fusionné mais j'exclus intentionnellement certains changements spécifiques lors de cette fusion, il a donc clairement des différences entre les branches. J'essayais alors de le refusionner parce que je me rends compte / oublie que j'aurais dû et voulais ajouter un changement / fichier particulier que j'ai précédemment exclu et j'espérais que si je refais une fusion montrerait tous les changements que j'avais exclus auparavant , mais je me suis trompé et je reçois à la place le message "Déjà à jour".
En lisant le commentaire / la réponse de @ Bombe, il a raison, et je pense que cela se comporte de cette façon, donc ce que j'ai fait était de faire une sauvegarde matérielle des fichiers sur la branche de test, puis de vérifier la branche principale et de coller manuellement les fichiers dedans et de les valider comme s'il s'agissait de nouveaux changements.
Je ne sais pas si c'est la bonne façon ou pourrait aider d'autres personnes ayant ce même problème, mais cela a apporté une solution à mon cas particulier.
la source
git checkout srcBranch -- path/to/file
. Peut également utiliser des globes de fichiers.checkout srcBranch -- *
puis regardé mes différencesSi la fusion de la branche A dans la branche B signale "Déjà à jour", l'inverse n'est pas toujours vrai. Ce n'est vrai que si la branche B est descendante de la branche A, sinon la branche B peut simplement avoir des changements qui ne sont pas dans A.
Exemple:
À ce stade, la fusion de A à B signale "Déjà à jour" mais les branches sont différentes car la branche B a des mises à jour du maître alors que la branche A n'en a pas.
la source
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 a été utilisé comme parent pour New_Branch
Old_Branch a été mis à jour avec quelques modifications qui devaient être fusionnées avec New_Branch
J'utilisais la commande pull ci-dessous sans aucune branche pour obtenir toutes les sources de toutes les branches.
Étrangement, cela ne tire pas tous les commits de toutes les branches. Je l'avais pensé car l'indiqué montre presque toutes les branches et les balises.
Donc, pour résoudre ce problème, le Old_Branch a tiré la dernière en utilisant
Maintenant vérifié New_Branch
Je l'ai tiré pour être sûr
Et l'alto a des conflits à régler de Old_Branch à New_Branch :), ce qui était attendu
la source
La même chose m'est arrivée. Mais le scénario était un peu différent, j'avais une branche principale et j'en ai découpé release_1 (disons). Apporté quelques modifications dans la branche release_1 et fusionné en origine. puis j'ai fait ssh et sur le serveur distant, j'ai de nouveau extrait release_1 en utilisant la commande git checkout -b release_1 - qui crée en fait une nouvelle branche release_! du maître plutôt que de vérifier l'origine de la branche release_1 déjà existante. Résolu le problème en supprimant le commutateur "-b"
la source
J'ai eu le même problème. J'ai eu des changements dans la télécommande et elle montrait toujours "Déjà à jour". Recloner le référentiel a résolu le problème pour moi.
la source
C'est idiot mais ça pourrait arriver. Supposons que votre nom de branche soit préfixé avec une référence de problème (par exemple
#91-fix-html-markup
), si vous effectuez cette fusion:cela ne fonctionnera pas comme prévu, car tout ce qui suit
#
est ignoré, car#
démarre un commentaire en ligne.Dans ce cas , vous pouvez renommer l'omission de branche
#
ou d' utiliser des guillemets simples pour entourer le nom de la branche:git merge '#91-fix-html-markup'
.la source