web-dev-qa-db-fra.com

Rebaser des branches distantes dans Git

J'utilise un référentiel Git intermédiaire pour mettre en miroir un référentiel SVN distant, à partir duquel les utilisateurs peuvent cloner et travailler. Le référentiel intermédiaire voit sa branche principale rebasée tous les soirs à partir du SVN en amont et nous travaillons sur des branches d'entités. Par exemple:

remote:
  master

local:
  master
  feature

Je peux avec succès pousser ma branche de fonctionnalité vers la télécommande et me retrouver avec ce que j'attendais:

remote:
  master
  feature

local:
  master
  feature

J'ai ensuite reconfiguré la branche pour suivre la télécommande:

remote:
  master
  feature

local:
  master
  feature -> Origin/feature

Et tout va bien. Ce que je voudrais faire ici, c’est redéfinir la branche de fonctionnalités sur la branche principale de la télécommande, mais j’aimerais le faire à partir de mon ordinateur local. J'aimerais pouvoir faire:

git checkout master
git pull
git checkout feature
git rebase master
git Push Origin feature

Pour maintenir la branche de fonctions distante à jour avec le maître distant. Cependant, cette méthode amène Git à se plaindre:

To <remote>
 ! [rejected]        feature -> feature (non-fast-forward)
error: failed to Push some refs to '<remote>'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git Push --help' for details.

git pull fait le tour mais provoque une fusion que je voudrais éviter. Je crains que le message indique feature -> feature plutôt que feature -> Origin/feature mais cela peut n'être qu'une présentation.

Est-ce que je manque quelque chose ou est-ce que j'y vais d'une manière complètement fausse? Il n'est pas essentiel d'éviter de créer la base sur le serveur distant, mais il est beaucoup plus difficile de résoudre les conflits de fusion à partir de la base.

125
kfb

Il s’agit de savoir si la fonctionnalité est utilisée par une personne ou si d’autres en travaillent.

Vous pouvez forcer le Push après la base si ce n'est que vous:

git Push Origin feature -f

Cependant, si d'autres personnes y travaillent, vous devez fusionner et non rebaser le maître.

git merge master
git Push Origin feature

Cela garantira que vous avez une histoire commune avec les personnes avec lesquelles vous collaborez.

À un autre niveau, vous ne devriez pas effectuer de fusion arrière. Ce que vous faites, c'est polluer l'historique de votre branche de fonctionnalité avec d'autres commits n'appartenant pas à la fonctionnalité, ce qui rend le travail ultérieur avec cette branche plus difficile - modifier la base ou non.

Ceci est mon article sur le sujet appelé branche par fonctionnalité .

J'espère que cela t'aides.

172
Adam Dymitruk

Bien que vous ayez abordé ce sujet.

C’est une idée/un concept important dans git qu’un grand nombre d’utilisateurs git gagnerait à connaître. git rebase est un outil très puissant qui vous permet d'écraser les commits ensemble, de les supprimer, etc. Mais comme pour tout outil puissant, vous devez savoir ce que vous faites ou quelque chose pourrait mal tourner.

Lorsque vous travaillez localement et que vous bousculez vos succursales locales, vous pouvez faire ce que vous voulez tant que vous n'avez pas mis les modifications à jour dans le référentiel central. Cela signifie que vous pouvez réécrire votre propre histoire, mais pas celle des autres. En ne jouant qu'avec vos données locales, rien n’aura d’impact sur les autres référentiels.

C'est pourquoi il est important de se rappeler qu'une fois que vous avez poussé les commits, vous ne devez pas les rebaser plus tard. C’est important, c’est que d’autres personnes prennent en compte vos commits et s’appuient sur vos contributions à la base de code, et si vous décidez plus tard de déplacer ce contenu d’un endroit à un autre (le rebaser) et changements, alors d'autres personnes auront des problèmes et devront rebaser leur code. Maintenant, imaginez que vous avez 1000 développeurs :) Cela provoque beaucoup de retouches inutiles.

30
ralphtheninja

Comme vous avez modifié la base feature par-dessus le nouveau master, votre feature local n'est pas une avance rapide de Origin/feature plus. Donc, je pense que dans ce cas, il est parfaitement correct de contourner le contrôle d’avance rapide en faisant git Push Origin +feature. Vous pouvez aussi le spécifier dans votre configuration

git config remote.Origin.Push +refs/heads/feature:refs/heads/feature

Si d’autres personnes travaillent sur Origin/feature, ils seront dérangés par cette mise à jour forcée. Vous pouvez éviter cela en fusionnant le nouveau master dans feature au lieu de changer de base. Le résultat sera en effet une avance rapide.

5
Tilman Vogel

Vous pouvez désactiver la vérification (si vous êtes vraiment sûr de savoir ce que vous faites) en utilisant le --force option à git Push.

1
Andrew Aylett