web-dev-qa-db-fra.com

Comment synchroniser deux branches dans le même référentiel Git?

Voici un obstacle courant que je rencontre souvent:

master est notre branche "stable"

$ git status
# On branch master
nothing to commit (working directory clean)

Créer un module sur une branche

$ git checkout -b foo
$ echo "hello" > world
$ git add .
$ git commit -m "init commit for foo module"
$ git checkout master
$ git merge foo

Travaillez sur le maître ou d'autres branches

Au cours des deux prochaines semaines, plus de code sera engagé à maîtriser directement et par d'autres branches. La branche foo restera intacte pendant cette période.

Reprendre le travail/faire des mises à jour sur la branche foo

$ git checkout foo

Oh non! foo est massivement obsolète! Je comprends pourquoi , mais j'ai do besoin foo de nouveau synchronisé.

La question

Comment obtenir le dernier contenu de la branche master ?

31
maček

Si vous n'avez pas besoin de la branche:

Si vous avez fusionné foo pour revenir à master, "git branch -d foo" pour tuer la branche du sujet, puis "checkout -b foo" à l'avenir lorsque vous aurez besoin de le pirater à nouveau.

Si vous avez besoin de la branche:

Vous pouvez rebaser votre branche de sujet contre la branche principale:

git checkout foo
git rebase master

Ou:

git rebase master foo
33
Adam Vandenberg

La refondation est le processus de déplacement ou de combinaison d'une séquence de validations vers une nouvelle validation de base. Le remodelage est plus utile et facilement visualisable dans le contexte d'un flux de travail de branchement d'entités. Le processus général peut être visualisé comme suit:

Git Rebase visual explanation

L'exemple ci-dessous combine git rebase avec git merge pour conserver un historique de projet linéaire. Il s'agit d'un moyen rapide et facile de garantir que vos fusions seront transmises rapidement.

# Start a new feature
git checkout -b new-feature master
# Edit files
git commit -a -m "Start developing a feature"

Au milieu de notre fonctionnalité, nous réalisons qu'il y a une faille de sécurité dans notre projet

# Create a hotfix branch based off of master
git checkout -b hotfix master
# Edit files
git commit -a -m "Fix security hole"
# Merge back into master
git checkout master
git merge hotfix
git branch -d hotfix

Après avoir fusionné le correctif en maître, nous avons un historique de projet fourchu. Au lieu d'une simple fusion de git, nous allons intégrer la branche de fonctionnalité avec un rebase pour maintenir un historique linéaire:

git checkout new-feature
git rebase master

Cela déplace la nouvelle fonctionnalité vers la pointe du maître, ce qui nous permet de faire une fusion rapide standard à partir du maître:

git checkout master
git merge new-feature

Extrait de Atlassian Git Rebase Tutorial

6

J'utilise ce qui suit pour combiner les changements de deux branches (la mienne et la vôtre) et pour synchroniser les deux branches pour un travail continu. Cela à l'air de marcher. Quelqu'un y voit-il un problème?

git checkout mine # make sure I'm on my branch
git commit -a     # commit changes
git Push Origin mine  
git checkout yours # switch to your branch
git pull Origin yours # get changes you've committed & pushed
git checkout mine 
git merge yours # merge your changes into mine
git Push Origin mine 
git checkout yours 
git rebase mine # set your branch to the merged result
git Push Origin yours # Push the merged result up to your branch on Origin
git checkout mine # get back to my branch
1
user74279