J'ai deux branches à savoir master
et development
dans un référentiel GitHub. Je fais tout mon développement dans la branche de développement comme indiqué.
git branch development
git add *
git commit -m "My initial commit message"
git Push -u Origin development
Maintenant, je veux fusionner toutes les modifications de la branche development
dans la master
. Mon approche actuelle est:
git checkout master
git merge development
git Push -u Origin master
S'il vous plaît laissez-moi savoir si la procédure que je suis est correcte.
J'aime généralement fusionner master
dans development
en premier de sorte que, s’il ya des conflits, je puisse résoudre le problème dans la branche development
elle-même et que master
reste propre.
(on branch development)$ git merge master
(resolve any merge conflicts if there are any)
git checkout master
git merge development (there won't be any conflicts now)
Il n’ya pas beaucoup de différence entre les deux approches, mais j’ai parfois remarqué que je ne souhaitais pas encore fusionner la branche en master
, mais qu’il y avait encore du travail à faire avant de les fusionner. fusionné, j'ai donc tendance à laisser master
intact jusqu'à la fin.
EDIT: De commentaires
Si vous souhaitez savoir qui a effectué la fusion et à quel moment, vous pouvez utiliser l'indicateur --no-ff
lors de la fusion. Cela n’est généralement utile que lors de la fusion de development
dans master
(dernière étape), car vous devrez peut-être fusionner master
dans development
(première étape) plusieurs fois dans votre flux de travail et créer un nœud de validation pour ces opérations risque de ne pas être très utile.
git merge --no-ff development
Personnellement, mon approche est semblable à la vôtre, avec quelques branches de plus et des écritures réduites quand elles retournent à master.
Un de mes collègues n'aime pas trop devoir changer de branche et reste dans la branche de développement avec une fonction similaire à la suivante, toutes exécutées à partir de la branche de développement.
git fetch Origin master
git merge master
git Push Origin development:master
La première ligne s'assure qu'il a des commits en amont à maîtriser depuis la dernière mise à jour de son référentiel local.
La seconde tire ces changements (le cas échéant) du maître dans le développement
La troisième pousse la branche de développement (maintenant complètement fusionnée avec le maître) jusqu'à Origin/master.
Son flux de travail de base est peut-être un peu faux, mais c'est l'essentiel.
Ce serait formidable si vous pouvez utiliser le flux de travail Git Flow. Il peut fusionner la branche de développement en maître facilement.
Ce que vous voulez faire, c'est simplement suivre les instructions de git flow mentionnées ici:
http://danielkummer.github.io/git-flow-cheatsheet/
pas:
Vérifiez le lien ci-dessus pour plus d'informations.
Explication du bas pour ceux qui sont venus ici sans aucune connaissance des branches.
La logique de développement de base de branche principale est la suivante: vous travaillez uniquement sur une autre branche et utilisez maître uniquement pour fusionner d'autres branches.
Vous commencez à créer une nouvelle branche de cette façon:
1) Clonez le référentiel nécessaire dans votre racine Web:
$ cd /var/www
$ git clone [email protected]:user_name/repository_name.git
2) Créer une nouvelle branche. Il contiendra les derniers fichiers de votre référentiel de branche maître
$ git branch new_branch
3) Changez la branche git en new_branch
$ git checkout new_branch
4) Coder, commettre, comme d'habitude…
$ git add .
$ git commit -m “Initial commit”
$ git Push (pushes commits only to “new_branch”)
5) Lorsque le travail est terminé sur cette branche, fusionner avec la branche «maître»:
$ git merge master
$ git checkout master (goes to master branch)
$ git merge development (merges files in localhost. Master shouldn’t have any commits ahead, otherwise there will be a need for pull and merging code by hands!)
$ git Push (pushes all “new_branch” commits to both branches - “master” and “new_branch”)
Oui, c'est correct, mais cela ressemble à un flux de travail très basique, dans lequel vous ne mettez que les modifications en mémoire tampon avant qu'elles ne soient prêtes pour l'intégration. Vous devriez vous pencher sur des workflows plus avancés pris en charge par git. Vous aimerez peut-être l'approche topic branch , qui vous permet de travailler sur plusieurs fonctionnalités en parallèle, ou l'approche graduation , qui étend légèrement votre flux de travail actuel.
git pull (branche de développement actuelle)
maître de caisse
git pull
développement de fusions
maître git Push Origin
Si vous êtes sur Mac ou Ubuntu, accédez au dossier de travail de la branche. Dans le terminal
supposons que harisdev soit le nom de la branche.
git checkout master
s'il y a des fichiers non suivis ou non validés, vous obtenez une erreur et vous devez valider ou supprimer tous les fichiers non suivis ou non validés.
git merge harisdev
git Push Origin master
Une dernière commande pour supprimer la branche.
$ git branch -d harisdev
C'est comme ça que je le fais d'habitude. Tout d’abord, assurez-vous que vous êtes prêt à fusionner vos modifications en maître.
git fetch
git checkout master
.git pull
.git merge development
.git Push -u Origin master
et vous avez terminé.Vous pouvez trouver plus d'informations sur git fusion dans l'article.
Étape 1
Créez et basculez vers une nouvelle branche "dev", dans laquelle vos fichiers git locaux sont synchronisés avec la télécommande, mais la branche "dev" n'existe pas encore.
git branch dev # create
git checkout dev # switch
# No need to git add or git commit, the current
# branch's files will be cloned to the new branch by-default.
git Push --set-upstream Origin dev # Push the "dev" branch to the remote.
Étape 2
Apportez vos modifications à la branche "dev" (votre courant si vous suivez l'étape 1), validez-les et envoyez-les dans la branche "dev" distante.
git add .
git commit -S -m "my first commit to the dev branch" # remove the -S if you're not "secure", secure = when you already setup crypto private and public keys (i.e "verified" green sign in github)
git Push -u Origin dev # Push the changes to the remote, -u Origin dev is optional but good to use.
Étape 3
Fusionner votre branche "dev" dans le "maître".
git checkout dev # switch to "dev" branch if you're not already.
git merge master # optionally, this command is being used to resolve any conflicts if you pushed any changes to your "master" but "dev" doesn't have that commit.
git checkout master # switch to "master", which is the branch you want to be merged.
git merge --no-ff dev # merge the "dev" branch into the "master" one.
1) Sur le développement de la branche, vérifiez le statut de git en utilisant la commande suivante:
git status
Il ne devrait y avoir aucun code non engagé. Si c'est le cas, envoyez votre code sur la branche Développement:
git add *
git commit -m "My initial commit message"
git Push Origin Development
2) Sur la branche Développement, exécutez les deux commandes suivantes:
git branch -f master HEAD
git Push -f Origin master
Il va pousser votre code de branche de développement à la branche principale.
Basé sur @Sailesh et @DavidCulp:
(on branch development)
$ git fetch Origin master
$ git merge FETCH_HEAD
(resolve any merge conflicts if there are any)
$ git checkout master
$ git merge --no-ff development (there won't be any conflicts now)
La première commande s'assurera que tous les commits en amont sont effectués sur le maître distant, avec une réponse Sailesh qui ne se produirait pas.
Le second effectuera une fusion et créera des conflits que vous pourrez ensuite résoudre.
Après cela, vous pouvez enfin valider master pour passer à master.
Ensuite, vous fusionnez la branche de développement sur le maître local. L'indicateur no-ff créera un nœud de validation dans le maître pour que la fusion soit traçable.
Après cela, vous pouvez vous engager et pousser votre fusion.
Cette procédure permet de s'assurer que les utilisateurs peuvent voir un engagement de fusion développement-développement que les utilisateurs peuvent consulter. Ensuite, s'ils consultent la branche Développement, ils peuvent voir les engagements individuels que vous avez effectués à l'égard de cet élément au cours de son développement.
Si vous le souhaitez, vous pouvez éventuellement modifier votre engagement de fusion avant de cliquer sur Push, si vous souhaitez ajouter un résumé de ce qui a été fait dans la branche de développement.
EDIT: ma réponse originale suggérait un git merge master
qui ne faisait rien, il vaut mieux le faire git merge FETCH_HEAD
après avoir récupéré l’origine/master
Une fois que vous avez "vérifié" la branche de développement, vous ...
git add .
git commit -m "first commit"
git Push Origin dev
git merge master
git checkout master
git merge dev
git Push Origin master
Si vous utilisez gerrit, les commandes suivantes fonctionnent parfaitement.
git checkout master
git merge --no-ff development
Vous pouvez enregistrer avec le message de validation par défaut. Assurez-vous que l'identifiant de modification a été généré. Vous pouvez utiliser la commande suivante pour vous en assurer.
git commit --amend
Ensuite, appuyez avec la commande suivante.
git Push Origin HEAD:refs/for/refs/heads/master
Vous pourriez rencontrer un message d'erreur comme ci-dessous.
! [remote rejected] HEAD -> refs/for/refs/heads/master (you are not allowed to upload merges)
Pour résoudre ce problème, l’administrateur du projet gerrit doit créer une autre référence dans gerrit nommée 'refs/for/refs/head/master' ou 'refs/for/refs/heads/*' (qui couvrira toutes les branches à l’avenir). Ensuite, accordez l’autorisation «Push Merge Commit» à cette référence et l’autorisation «Soumettre» si nécessaire pour soumettre le GCR.
Maintenant, essayez à nouveau la commande Push ci-dessus, et cela devrait fonctionner.
Crédits:
https://github.com/ReviewAssistant/reviewassistant/wiki/Merging-branches-in-Gerrit
Je pense que la solution la plus simple serait
git checkout master
git remote update
git merge Origin/Develop -X theirs
git commit -m commit -m "New release"
git Push --recurse-submodules=check --progress "Origin" refs/heads/Master
Cela préserve également l'historique de toutes les branches utilisées