Une nouvelle branche de master
est créée, nous l'appelons test
.
Il existe plusieurs développeurs qui s'engagent master
ou créent d'autres branches et fusionnent plus tard master
.
Disons que le travail test
prend plusieurs jours et que vous souhaitez rester constamment à test
jour avec des commits à l'intérieur master
.
Je ferais git pull origin master
de test
.
Question 1: Est-ce la bonne approche? D'autres développeurs auraient pu facilement travailler sur les mêmes fichiers que moi.
Mon travail test
est terminé et je suis prêt à le fusionner master
. Voici les deux façons dont je peux penser:
UNE:
git checkout test
git pull origin master
git push origin test
git checkout master
git pull origin test
B:
git checkout test
git pull origin master
git checkout master
git merge test
Je n'utilise pas, --rebase
car d'après ma compréhension, rebase récupérera les modifications master
et empilera les miennes en plus, ce qui pourrait écraser les modifications apportées par d'autres personnes.
Question 2: Laquelle de ces deux méthodes est la bonne? Quelle est la différence là-bas?
Le but dans tout cela est de garder ma test
branche à jour avec les choses qui se passent master
et plus tard je pourrais les fusionner pour master
espérer garder la chronologie aussi linéaire que possible.
Réponses:
Comment je ferais ça
Si j'ai une branche locale d'une télécommande, je ne me sens pas à l'aise pour fusionner d'autres branches que celle-ci avec la télécommande. De plus, je ne pousserais pas mes modifications, jusqu'à ce que je sois satisfait de ce que je veux pousser et aussi je ne pousserais pas du tout les choses, qui ne sont que pour moi et mon référentiel local. Dans votre description, il semble que ce
test
soit uniquement pour vous? Donc pas de raison de le publier.git essaie toujours de respecter les vôtres et les autres, et il en sera de même
--rebase
. Je ne pense pas pouvoir l'expliquer correctement, alors jetez un œil au livre Git - Rebasing ou git-ready: Intro into rebasing for a little description. C'est une fonctionnalité assez coolla source
git merge test
me donnefatal: 'test' does not point to a commit
. Je dois recherchergit log
le point de validation sur la branche de test, revenir à la branche principale, puis le fairegit merge 0f37d3154abbf52a4cbbbb5109f08af6a7567234
.test
doit exister. Bien sûr, vous pouvez utiliser le hachage de validation à la place, mais il est généralement plus facile d'utiliser le nom de la branche. En interne, il récupère simplement le hachageHEAD
de la branche.C'est une question très pratique, mais toutes les réponses ci-dessus ne sont pas pratiques.
Comme
Cette approche présente deux problèmes :
Ce n'est pas sûr, car nous ne savons pas s'il y a des conflits entre la branche test et la branche master.
Il "resserrerait" toutes les validations de test en une seule validation de fusion sur le maître; c'est-à-dire sur la branche principale, nous ne pouvons pas voir tous les journaux des modifications de la branche de test.
Ainsi, lorsque nous soupçonnons qu'il y aurait des conflits, nous pouvons avoir les opérations git suivantes:
Testez
merge
avantcommit
, évitez une validation rapide par--no-ff
,En cas de conflit, nous pouvons exécuter
git status
pour vérifier les détails des conflits et essayer de résoudreUne fois que nous avons résolu les conflits, ou s'il n'y a pas de conflit, nous
commit
etpush
euxMais cette façon perdra l'historique des modifications consigné dans la branche de test, et il serait difficile pour les autres développeurs de comprendre l'historique du projet.
Donc, la meilleure méthode est que nous devons utiliser à la
rebase
place demerge
(supposons, quand dans ce temps, nous avons résolu les conflits de branche).Voici un exemple simple, pour les opérations avancées, veuillez vous reporter à http://git-scm.com/book/en/v2/Git-Branching-Rebasing
Oui, lorsque vous avez terminé les tiges, toutes les validations de la branche Test seront déplacées vers la tête de la branche Master. Le principal avantage du rebasage est que vous obtenez un historique de projet linéaire et beaucoup plus propre.
La seule chose que vous devez éviter est: ne jamais utiliser
rebase
sur une branche publique, comme la branche principale.Ne faites jamais d'opérations comme les suivantes:
Détails pour https://www.atlassian.com/git/tutorials/merging-vs-rebasing/the-golden-rule-of-rebasing
annexe:
la source
Ni un rebase ni une fusion ne doivent remplacer les modifications de quiconque (sauf si vous choisissez de le faire lors de la résolution d'un conflit).
L'approche habituelle lors du développement est
Lorsque vous êtes prêt à fusionner de nouveau en maître,
Si vous craignez de casser quelque chose lors de la fusion,
git merge --abort
est là pour vous.Utiliser push puis pull comme moyen de fusion est idiot. Je ne sais pas non plus pourquoi vous poussez le test vers l'origine.
la source
git stash
est pour.Je voudrais d'abord rendre la branche à fusionner aussi propre que possible. Exécutez vos tests, assurez-vous que l'état est comme vous le souhaitez. Nettoyez les nouveaux commits par git squash .
Outre la réponse de KingCrunches , je suggère d'utiliser
Vous avez peut-être effectué plusieurs validations dans l'autre branche, qui ne devrait être qu'une seule validation dans la branche principale. Pour garder l'historique des validations aussi propre que possible, vous voudrez peut-être écraser toutes vos validations de la branche de test en une seule validation dans la branche principale (voir aussi: Git: squash ou pas squash? ). Ensuite, vous pouvez également réécrire le message de validation en quelque chose de très expressif. Quelque chose de facile à lire et à comprendre, sans creuser dans le code.
modifier: Vous pourriez être intéressé par
Donc sur GitHub, je finis par faire ce qui suit pour une branche de fonctionnalité
mybranch
:Obtenez les dernières informations sur l'origine
Trouvez le hachage de base de fusion:
Assurez-vous maintenant que seul le premier est
pick
, le reste ests
:Ensuite, choisissez un très bon message de validation et envoyez-le à GitHub. Faites ensuite la demande de tirage.
Après la fusion de la demande d'extraction, vous pouvez la supprimer localement:
et sur GitHub
la source
Vieux fil, mais je n'ai pas trouvé ma façon de le faire. Cela peut être utile pour quelqu'un qui travaille avec rebase et veut fusionner toutes les validations d'une branche (fonctionnalité) au-dessus de master. S'il y a un conflit sur le chemin, vous pouvez les résoudre pour chaque commit. Vous gardez un contrôle total pendant le processus et pouvez abandonner à tout moment.
Obtenez le Master et la branche à jour:
Fusionner la branche au-dessus du maître:
Facultatif: si vous rencontrez des conflits pendant la rebase:
Tout d'abord, résolvez le conflit dans le fichier. Alors:
Poussez votre branche rebasée:
Maintenant, vous avez deux options:
Terminé.
la source
C'est le flux de travail que j'utilise dans mon travail avec l'équipe. Le scénario est tel que vous l'avez décrit. Tout d'abord, lorsque j'ai fini de travailler,
test
je rebase avec master pour récupérer tout ce qui a été ajouté à master pendant le temps que je travaille sur latest
branche.git pull -r upstream master
Cela va tirer les modifications vers master depuis que vous avez forké la
test
branche et les appliquer, puis appliquez les modifications que vous avez apportées pour tester "en plus" de l'état actuel de master. Il peut y avoir des conflits ici, si les autres personnes ont apporté des modifications aux mêmes fichiers que vous avez modifiés dans le test. S'il y en a, vous devrez les corriger manuellement et valider. Une fois que vous avez fait cela, vous pourrez passer à la branche principale et fusionnertest
sans problème.la source
Après la fusion, si le fichier est modifié, lorsque vous le fusionnerez, il résultera d'une erreur de «résolution de conflit»
Donc, vous devez d'abord résoudre tous vos conflits, vous devez à nouveau valider toutes vos modifications, puis pousser
C'est mieux de faire qui a fait des changements dans la branche de test, car il savait quels changements il avait faits.
la source
J'utiliserais la méthode de rebase. Principalement parce qu'il reflète parfaitement votre cas sémantiquement, c'est-à-dire. ce que vous voulez faire, c'est actualiser l'état de votre branche actuelle et "faire semblant" comme si elle était basée sur la dernière.
Donc, sans même vérifier
master
, je voudrais:Bien sûr, le simple fait de récupérer à partir de l'origine ne rafraîchit pas l'état local de votre
master
(car il n'effectue pas de fusion), mais cela convient parfaitement à notre objectif - nous voulons éviter de basculer, pour gagner du temps.la source
La réponse de @ KingCrunch devrait fonctionner dans de nombreux cas. Un problème qui peut survenir est que vous pouvez être sur une machine différente qui doit tirer la dernière version du test. Donc, je recommande d'abord de tirer le test. La révision ressemble à ceci:
la source
Vous devez faire extraire la branche pour tirer, car tirer signifie fusionner dans le maître, et vous avez besoin d'un arbre de travail pour fusionner.
Pas besoin de vérifier d'abord; rebaser fait la bonne chose avec deux arguments
git push par défaut pousse toutes les branches qui existent ici et sur la télécommande
la source
Comme le titre l'indique "Best way", je pense que c'est une bonne idée de considérer la stratégie de fusion de patience .
De: https://git-scm.com/docs/merge-strategies
Usage:
Git Alias
J'utilise toujours un alias pour cela, par exemple exécuter une fois:
Maintenant, vous pouvez faire:
la source
C'est de GitLab: Suivez simplement les instructions:
la source
Je répondrai selon les branches de développement et de fonctionnalité,
si vous êtes sur une branche de fonctionnalité et devez la mettre à jour avec develop, utilisez les commandes ci-dessous: git checkout develop git pull git checkout feature / xyz git merge develop
Maintenant que votre fonctionnalité est mise à jour avec develop, vous pouvez pousser vos modifications.
la source