52 votes

Fusionner à une branche dans git sans y basculer

J'ai une application qui fonctionne dans un dépôt git sur une branche (disons dev ). L'application modifie le contenu de certains dépôts et les commet. Je dois maintenant fusionner ces changements dans une autre branche (disons master ) mais le hic, c'est que je ne veux pas git checkout master avant de faire ça. Existe-t-il un moyen de dire "fusionner la branche actuelle dans master" ?

6 votes

Et comment comptez-vous précisément résoudre les conflits ?

5 votes

Disons que je suis sûr que je n'en aurai pas. Puis-je le faire alors ?

3 votes

+1 C'est en effet une question très intéressante qui fait avancer la connaissance de git et qui mérite plus de upvotes !

42voto

Anil Points 316

Le "master" dans votre cas semble être "fast-forwardable". Vous pourriez "pousser" la branche vers master.

cd /path_to_dir_with_no_branch_switch/
git push . appbranch:master

0 votes

Intéressant... Je n'avais pas pensé à ça.

10 votes

Beaucoup plus rapide serait git push . appbranch:master

2 votes

+1 Je n'ai jamais pensé à pousser à l'auto. Très soigné en effet ! Les solutions simples sont souvent les plus belles.

6voto

G-Man Points 484

Cela fonctionne très bien pour moi lorsque je veux fusionner deux branches sans avoir à vérifier l'une ou l'autre :

git fetch . <modified branch>:<destination branch>

D'autres options sont décrites aquí .

4voto

VonC Points 414372

Une solution possible serait de clone créer un autre arbre de travail à partir du même dépôt local et effectuer la fusion dans ledit arbre de travail (avec main vérifié), en étant capable d'y résoudre les conflits potentiels.
La création d'un arbre de travail séparé est beaucoup plus rapide que la création d'un clone séparé (ce qui était ma suggestion initiale en 2011) : elle utilise la fonction Git 2.5+ (juillet 2015) git worktree commandement.

Puis, à une date ultérieure, lorsqu'il sera possible de passer à main dans le repo local (votre premier arbre de travail, là où vous travaillez), vous restaureriez alors la version mise à jour de main de l'arbre de travail séparé.


Alternativement, Bernardo Dal Corno suggère dans les commentaires un outil/script de 2014 : schuyler1d/git-forward-merge de Schuyler Duveen .

git forward-merge crée un fichier d'index et un répertoire de travail Git temporaires qui seront utilisés uniquement pour la fusion, sans interférer avec le fichier d'index et le répertoire de travail actuels.
(A moins que la fusion ne soit un fast-forward, auquel cas la fusion est faite trivialement par un push local).

0 votes

Je ne pourrai pas passer à la caisse master dans mon dépôt d'origine. J'ai juste besoin de fusionner les dev changements en elle. Votre solution est celle que j'utilise actuellement. Le problème est que le clonage prend du temps et je cherche des moyens de l'optimiser.

2 votes

@Noufal Ibrahim : Si le clone prend beaucoup de temps, cela me laisse penser que vous utilisez une URL pour laquelle le hard-linking ne sera pas utilisé par défaut. Avez-vous essayé d'ajouter --local à votre git clone invocation pour forcer cela ?

0 votes

C'est une horrible piraterie. Imaginez faire ça avec de gros dépôts ou fréquemment.

1voto

jthill Points 10384

Même si votre branche n'est pas rapide et même si elle présente de réels conflits, vous pouvez toujours fusionner sans effectuer un checkout complet. Disons que vous voulez fusionner votre bout actuel dev sur master . Cela vaut la peine d'essayer le git push . dev:master si vous pensez que cela peut fonctionner, cela vérifie si un fastforward est le bon mouvement et si c'est le cas, le fait juste là, mais si vous ne pouvez pas simplement ré-accrocher l'étiquette, votre prochaine étape est

git clone -nsb master . `mktemp -d`
cd $_
git reset -q
git merge origin/dev
git push
cd -

et vous avez maintenant fait une "fusion avec vérification minimale". Le clone, le cd et la réinitialisation prennent moins de temps à exécuter qu'il n'en faut pour taper sur un projet qui n'est pas petit (3,5G d'historique, 1,2G de checkout complet est >70K fichiers) sur un midrange vieux de dix ans parce qu'il ne duplique rien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X