Les conflits de fusion de la mise à jour de l'amont
Je suis en train de débuter avec git sur github du projet. (J'ai été en utilisant CVS, SVN et hg ans; git est difficile d'obtenir ma tête autour). Je suis en suivant les instructions avec autant de précision que je peux et ne peut tout simplement pas faire le travail.
Je clone mon fourche projet:
git clone [email protected]:davidgiven/linux-allwinner.git
Comme l'a recommandé, je rajoute un "en amont" à distance qui permet de suivre le projet que mon un est fourchue à partir de:
git remote add upstream https://github.com/amery/linux-allwinner.git
Je récupère:
git fetch upstream
Tout cela fonctionne très bien. Mais, ça a été une semaine depuis que j'ai forké le projet, en amont et en ont été à faire des changements. J'ai donc envie de tirer dans ces changements. Je suis actuellement dans la branche de droite --- allwinner-v3.0-android-v2 --- j'ai donc fusion de l'amont dans ma branche:
git merge upstream/allwinner-v3.0-android-v2
...et je reçois des conflits de fusion.
CONFLICT (add/add): Merge conflict in arch/arm/mach-sun5i/pm/standby/common.h
CONFLICT (add/add): Merge conflict in arch/arm/mach-sun5i/pm/standby/Makefile
CONFLICT (add/add): Merge conflict in arch/arm/mach-sun5i/pm/standby.S
CONFLICT (add/add): Merge conflict in arch/arm/mach-sun5i/pm/Makefile
[etc]
Maintenant, j'ai vérifié dans rien; je n'ai pas commencé à travailler encore, et mon projet est complètement intacte depuis je bifurquais. Par conséquent, il ne devrait pas être possible d'avoir des conflits. Mais il y a certains; ce qui se passe, et comment puis-je résoudre ce problème?
Mise à jour:
git show-branch HEAD upstream/allwinner-v3.0-android-v2
montre ce que j'ai à dire, je ne comprends pas un mot de:
! [HEAD] arm: sun3i: add getioaddr macro
! [upstream/allwinner-v3.0-android-v2] arm: sun3i: updated irq handling and machine_desc to 3.0
--
+ [upstream/allwinner-v3.0-android-v2] arm: sun3i: updated irq handling and machine_desc to 3.0
+ [upstream/allwinner-v3.0-android-v2^] arm: sunxi: renable early_printk in all _defconfig except crane's
+ [HEAD] arm: sun3i: add getioaddr macro
+ [HEAD^] arm: sun3i: add dummy machine type
git show-branch HEAD upstream/allwinner-v3.0-android-v2
pourrait révéler quelque chose d'intéressant.C'est que la production complète de
show-branch
? Je m'attends à la fin, avec une ligne qui commence avec ++
Yup, pas de
++
à la fin.
OriginalL'auteur David Given | 2012-05-27
Vous devez vous connecter pour publier un commentaire.
Il pourrait l'être, qu'en amont a réécrit l'histoire (rebase, modifier, ...) – ils ne devraient pas le faire, mais vous ne le saurez jamais.
Puisque vous dites que vous n'avez pas de changements locaux ou de validation, vous devez vous munir de votre référentiel de retour à un état de propreté par la réinitialisation de votre branche:
(Cela, vous perdrez toutes les modifications locales et faire des commits de l'actuel CHEF inaccessible!)
Ci-dessus suppose que vous allez (force) de pousser la nouvelle réinitialisation de l'état de votre branche à votre dépôt distant, sinon vous rencontrerez les conflits de nouveau lorsque vous essayez de tirer de
origin
.Si vous avez déjà eu engager localement, vous avez le rebase (ou cherry-pick) vos commits sur le dessus de l'amont de la branche, puis faire un coup de pouce à l'origine. De cette façon, vous ré-écrire votre histoire locale de la même façon en amont fait et appliquer vos modifications sur le dessus, c'est à dire:
git push
échoue, en me disant que j'ai besoin degit pull
d'abord; maisgit pull
produit le même fusionner les erreurs que j'ai la tête avant. C'est effectivement ce que je m'attend; ma compréhension est quegit reset
les changements de la branche actuelle à celle spécifiée, j'ai donc tout simplement une copie deupstream/allwinner-v3.0-android-v2
vérifié localement commeallwinner-v3.0-android-v2
. Mais étant donné que les conflits se produisent entreorigin/...
etupstream/...
, la seule chose qui a changé est que lorsque les conflits se produisent.git push où? Il échouera, depuis votre push n'est pas rapide vers l'avant. Vous mentionnez dans votre question que vous n'avez pas commis de rien, donc peut-être un seul forcé push est le chemin à parcourir?
Il y a toute une section sur la récupération à partir d'un amont rebase dans le
rebase
docs, il pourrait être utile si vous voulez vraiment un traitement complet: schacon.github.com/git/...Aussi, si vous ajoutez le
push -f
pour votre réponse, je vais l'accepter. Merci beaucoup.oui,
+branchname
se traduit par une contrainte de pression. A l'époque (en 2012)git push
n'a pas l'appui de la-f
/--force
option, il a été ajouté plus tard.OriginalL'auteur knittl
La
show-branch
sortieupstream
etHEAD
ont chacun ajouté deux commits depuis leur ancêtre commun (en supposant que c'est la pleine puissance de sortie). (Voir aussi: http://www.gitguys.com/topics/git-show-branch-to-see-branches-and-their-commits/) Si vous n'avez pas commis quelque chose de vous-même, cela ne signifie pas qu'en amont poussé un rebase (ou quelque chose qui a changé l'histoire). Puisque vous n'avez pas commis quoi que ce soit, knittl la réponse est exactement ce que vous voulez.Pour ce que ça vaut, j'aime aussi
git log --oneline --graph --decorate --remotes --branches
pour cela. Vous obtiendrez un fichier ASCII graphique avec toutes vos succursales et de télécommandes, de sorte que vous pouvez visualiser ce qui s'est passé où.OriginalL'auteur ellotheth