Pourquoi est-ce que je fusionne "remote-tracking branch 'origin/develop' en develop"?

je suis le seul dans mon organisation qui fait commits avec le message suivant:

fusionner la branche de suivi à distance "origine / développement" en une branche de développement

Je ne sais pas ce que je fais pour les provoquer, mais j'aimerais arrêter.

quelle commande suis-je en train de lancer pour créer ce commit, et quelle est la commande correcte que je devrais utiliser pour ne pas le produire?

Merci,

~J

97
demandé sur Jordan Feldstein 2011-06-20 08:15:59
la source

2 ответов

git pull crée probablement la commit. Si vous faites une validation puis exécuter git pull , après que quelqu'un pousse un engager dans le dépôt Git de téléchargements de l'autre développeur commit, puis les fusionne dans votre succursale locale.

Comment éviter cette fusion commet à l'avenir

vous pourriez utiliser git pull --rebase pour empêcher que cela se produise dans le futur, mais rebasing a ses périls, et je recommande éviter pull tout à fait .

au lieu de cela, je vous encourage à suivre ce modèle d'utilisation:

# download the latest commits
git remote update -p

# update the local branch
git merge --ff-only @{u}

# if the above fails with a complaint that the local branch has
# diverged:
git rebase -p @{u}

explication

  • git remote update -p télécharge toutes les propagations dans les dépôts à distance et met à jour les branches de suivi à distance (par exemple, origin/master ). Il ne touche pas à votre répertoire de travail, à votre index ou à vos branches locales.

    le -p argument prunes supprimé branches en amont. Ainsi, si la branche foo est supprimée dans le dépôt origin , git remote update -p supprimera automatiquement votre référence origin/foo .

  • git merge --ff-only @{u} "dit à Git de fusionner la branche amont (l'argument @{u} ) dans votre branche locale mais seulement si votre branche locale peut être "fast forwarded" vers la branche amont (en d'autres termes, si elle n'a pas divergé).

  • git rebase -p @{u} déplace effectivement les commits que vous avez fait mais n'avez pas encore poussé sur la branche amont, ce qui élimine la nécessité de créer les commits de fusion stupide que vous essayez d'éviter. Cela améliore la linéarité de l'historique du développement, ce qui facilite la révision.

    l'option -p indique à Git de préserver les fusions. Ceci empêche Git de linéariser les propagations étant rebasé. Ceci est important si, par exemple, vous Fusion d'une branche caractéristique en master . Sans -p , chaque propagation sur la branche de fonctionnalité serait dupliquée sur master dans le cadre de la linéarisation effectuée par git rebase . Cela rendrait l'histoire du développement plus difficile à examiner, pas plus facile.

    méfiez-vous : git rebase pourrait ne pas faire ce que vous attendez qu'il fasse, donc passer en revue les résultats avant de pousser. Par exemple:

    git log --graph --oneline --decorate --date-order --color --boundary @{u}..
    

je préfère cette approche à git pull --rebase pour les raisons suivantes:

  • il vous permet de voir les commits entrants en amont avant de modifier votre historique pour les incorporer.
  • il vous permet de passer l'option -p ( --preserve-merges ) à git rebase dans le cas où vous devez rebaser une fusion intentionnelle (par exemple, Fusion d'une branche de caractéristique déjà poussée dans master ).

Shorthand: git up au lieu de git pull

pour faciliter la tâche, je recommande la création d'un alias appelé up :

git config --global alias.up '!git remote update -p; git merge --ff-only @{u}'

maintenant, tout ce que vous devez faire pour mettre votre branche à jour est de courir:

git up

au lieu de git pull . Si vous obtenez une erreur parce que votre branche locale a divergé de la branche amont, c'est votre signal pour rebase.

pourquoi pas git pull --rebase ?

exécuter git pull --rebase équivaut à exécuter git fetch suivi de git rebase . Cela tente de passer rapidement aux nouvelles propagations amont, mais si cela n'est pas possible, alors cela va rebaser vos propagations locales sur les nouvelles propagations amont. C'est généralement OK, mais faites attention:

  • Rebase est un sujet avancé, et vous devez comprendre les implications avant de changement d'année de base.
  • git pull --rebase ne vous donne pas la possibilité d'examiner les commits avant de les incorporer. Selon ce qui a changé en amont, il est tout à fait possible que rebase soit la mauvaise opération-un rebase --onto , merge , reset , ou push -f pourrait être plus approprié qu'un simple rebase .
  • il n'est pas (actuellement) possible de passer --preserve-merges à l'opération rebase, donc toute fusion intentionnelle d'une caractéristique la branche sera linéarisée, rejouant (et donc dupliquant)toute la propagation de la branche.

de "fixer" une fusion existant commettre créé par git pull

si vous n'avez pas encore poussé un commit de fusion créé par git pull , vous pouvez reformuler le commit de fusion. En supposant que vous n'avez pas fait de fusions intentionnelles (par exemple, la fusion d'une branche déjà poussée dans votre branche actuelle), ce qui suit devrait le faire:

git rebase @{u}

la commande ci-dessus dit à Git de sélectionner tout le non-merge commits reachable de HEAD (le commit actuel), moins tous les commits reachable de @{u} (qui est raccourci pour "la branche en amont", i.e., origin/master si HEAD est master ), les rejouer (cerise-pick) sur le dessus de la branche en amont, et puis déplacer la référence actuelle de la branche au point de résultat de rejouer le commits. Ce déplace effectivement la non-fusion commits sur la propagation amont la plus récente, ce qui élimine la fusion créée par git pull .

si vous avez un commit de fusion intentionnel, vous ne voulez pas exécuter git rebase @{u} parce qu'il rejouera tout de l'autre branche. Traiter cette affaire est beaucoup plus compliqué, c'est pourquoi il est bon d'utiliser git up et éviter git pull tout à fait. Vous devrez probablement utiliser reset pour annuler la fusion créée par pull et puis faire git rebase -p @{u} . L'argument -p à git rebase n'a pas fonctionné de manière fiable pour moi, donc vous pourriez finir par avoir à utiliser reset pour annuler la fusion intentionnelle, mettre à jour votre branche locale à @{u} , et puis refaire la fusion intentionnelle (qui est une douleur s'il y avait beaucoup de conflits de fusion velue).

167
répondu Richard Hansen 2017-05-23 15:34:45
la source
git fetch
git rebase origin/master

ça devrait le faire. Ou si vous voulez continuer à utiliser pull

git pull --rebase

vous pouvez également configurer cette branche dans votre config pour qu'elle soit rebasée automatiquement, ou être configuré comme cela automatiquement pour toutes les autres branches de suivi que vous créez à l'avenir. Ensuite, vous pouvez revenir à l'utilisation de

git pull

plus à ce sujet dans la section "pull with rebase instead of merge" de cette page:

http://mislav.uniqpath.com/2010/07/git-tips /

14
répondu Adam Dymitruk 2011-06-20 10:07:48
la source