5
votes

Git fusion avec master sans checkout pour master

Chaque fois que j'ai besoin de fusionner développer avec master , je le fais:

git checkout master

git merge develop

Parfois, j'oublie de quitter le master . Pour cette raison, j'apporte par erreur des modifications au code alors que je suis toujours sur master . Cela peut être compliqué. Je me suis engagé à master plusieurs fois par erreur.

Existe-t-il un moyen de fusionner avec master sans passer d'abord à master ?


0 commentaires

4 Réponses :


1
votes

Non.

Je suppose que vous pourriez écrire un petit script shell pour effectuer les trois étapes:

#!/bin/sh
set -e
git checkout master
git merge develop
git checkout develop

Vous pouvez également ajouter un git push maître d'origine avant le dernier paiement.


0 commentaires

8
votes

Si vous voulez faire une fusion réelle dans master, non. Une vraie fusion a besoin, au moins potentiellement, d'un arbre de travail dans lequel travailler. Il utilise également l'index, qui doit correspondre à la branche actuelle à l'extérieur de l'opération (voir la méthode git worktree add ci-dessous).

Si vous souhaitez effectuer une avance rapide opération (pas une véritable fusion), c'est possible. Par exemple:

git worktree add ../master   # NB: assumes ../master is available as a directory name
cd ../master
git merge feature/X
...                 # do what it takes to complete the merge here

cd -                # return to your main repository
rm -rf ../master    # remove added worktree
git worktree prune  # clean up list of added worktrees

(notez l'absence de signe + ou d'option --force ) tentera de transférer votre master vers le même commit que votre develop . Utilisez HEAD pour désigner la branche courante:

 ! [rejected]              [name] -> master (non-fast-forward)

Celles-ci ne fonctionnent que si l'avance rapide est possible. Sinon, vous obtiendrez une erreur de la forme:

git push . HEAD:master

qui vous indique que vous avez besoin d'un arbre de travail dont la branche est master dans laquelle pour exécuter git merge .

Pour ce faire sans changer la branche de votre arbre de travail actuel , utilisez git worktree add code >, si votre Git est d'au moins 2,5 (de préférence au moins 2,15). Par exemple, supposons que vous soyez dans le niveau supérieur de votre référentiel, sur la branche feature/X:

git push . develop:master

L'arbre de travail ajouté a son propre index (et son propre HEAD ) donc git merge a maintenant un index et un arbre de travail dans lequel faire son travail, ou laisser son désordre pour que vous le corrigiez, selon ce qui est réellement se produit (voir commentaire de kostix) a>.


2 commentaires

J'ajouterais les anecdotes nécessaires: une fusion "réelle" sans utiliser l'arbre de travail (l'extraction) est impossible simplement en raison de la raison pour laquelle une véritable fusion peut entraîner un conflit de fusion qui nécessite 1) une configuration spéciale de la zone de préparation; 2) insérer des marqueurs de conflit dans les fichiers pertinents; 3) interaction humaine pour résoudre les conflits et élaborer l'état de l'index prêt à être validé - pour finaliser la fusion.


Great Post - aimez les détails. git push. HEAD: master sera ma nouvelle commande fav. Pour référence, si quelqu'un veut une autre façon de dire la même chose, ce blog montre quelques exemples supplémentaires sur la façon de faire des "commits" à avance rapide, sans changer de branche: samuelgruetter.net/blog/2018/08/31/git-ffwd-without-checkout Ce message combiné avec ce blog a clarifié, pour moi, comment utiliser cette variante de commande.



0
votes

alias git qui fusionne la branche actuelle avec master et retourne à la branche actuelle:

git config alias.merge-to '!f() { !curbr=$(git rev-parse --abbrev-ref HEAD) && destbr="{$1:-master}" && git checkout $destbr && git merge $curbr && git checkout -; }; f'

Appelez-le comme git merge2master . Pour le rendre complètement paramétré:

git config alias.merge2master '!curbr=$(git rev-parse --abbrev-ref HEAD) && git checkout master && git merge $curbr && git checkout -'

Appelez-le git merge-to ou git merge-to somebranch . La valeur par défaut est master


2 commentaires

Notez que vous pouvez également utiliser git checkout - pour revenir en arrière.


Oui, merci! N'achète pas grand-chose car je dois de toute façon calculer curbr .



1
votes

Vous pouvez essayer une commande appelée git graft fourni par git-extras .

Ce n'est pas correctement une commande git, mais git-extras fournit un tas d'outils pour travailler avec les dépôts git.

Dans votre cas, git graft develop master peut vous donner le résultat que vous recherchez.


0 commentaires