J'ai deux branches de mon maître:
- v2.1 : (version 2) sur lequel je travaille depuis plusieurs mois
- wss : que j'ai créé hier pour ajouter une fonctionnalité spécifique à mon master (en production)
Existe-t-il un moyen de copier les validations d'hier de wss vers la v2.1?
git
branching-and-merging
Bob Walsh
la source
la source
Réponses:
Vous devriez vraiment avoir un workflow qui vous permet de tout faire en fusionnant:
Donc, tout ce que vous avez à faire est
git checkout v2.1
etgit merge wss
. Si, pour une raison quelconque, vous ne pouvez vraiment pas le faire et que vous ne pouvez pas utiliser git rebase pour déplacer votre branche wss au bon endroit, la commande pour récupérer un seul commit quelque part et l'appliquer ailleurs est git cherry-pick . Vérifiez simplement la branche sur laquelle vous souhaitez l'appliquer et exécutezgit cherry-pick <SHA of commit to cherry-pick>
.Certaines des façons dont le rebasage peut vous sauver:
Si votre histoire ressemble à ceci:
Vous pouvez utiliser
git rebase --onto v2 v2-only wss
pour déplacer wss directement sur la v2:Ensuite, vous pouvez fusionner! Si vous ne pouvez vraiment, vraiment, vraiment pas arriver au point où vous pouvez fusionner, vous pouvez toujours utiliser rebase pour effectuer efficacement plusieurs sélections à la fois:
Remarque: la raison pour laquelle cela nécessite un travail supplémentaire est de créer des validations en double dans votre référentiel. Ce n'est pas vraiment une bonne chose - le but de la branchement et de la fusion faciles est de pouvoir tout faire en faisant des commit un seul endroit et en les fusionnant là où ils sont nécessaires. Les commits en double signifient une intention de ne jamais fusionner ces deux branches (si vous décidez de le faire plus tard, vous aurez des conflits).
la source
git-svn-id
références incorrectes avant dedcommit
réingérer. Bien que j'aurais probablement pu laisser de côté l'étape de sélection de cerise et juste utiliser un rebase seul.Utilisation
à appliquer
<commit>
à votre succursale actuelle .Moi-même, je recouperais probablement les commits que je sélectionne
gitk
et les sélectionne avec un clic droit sur l'entrée de validation à la place.Si vous voulez aller plus automatiquement (avec tous ses dangers) et en supposant que toutes les validations depuis hier se sont produites sur wss, vous pouvez générer la liste des validations en utilisant
git log
(avec--pretty
suggéré par Jefromi)donc tout ensemble en supposant que vous utilisez
bash
Si quelque chose ne va pas ici (il y a beaucoup de potentiel), vous avez des problèmes car cela fonctionne sur la caisse en direct, alors faites des choix manuels ou utilisez un rebase comme suggéré par Jefromi.
la source
git rebase
dans ma réponse est plus robuste. En particulier, en utilisant une boucle for comme celle-ci, si l'un des choix de cerise échoue, il essaiera toujours de faire tous les autres. C'est ... très très pas bon, disons.git
réponse simple et directe à la solution, au lieu de parcourir les subtilités de git pour prouver à quel point le répondeur le sait.git cherry-pick
: Appliquer les modifications introduites par certaines validations existantesSupposons que nous ayons la branche A avec (X, Y, Z) les commits. Nous devons ajouter ces commits à la branche B . Nous allons utiliser les
cherry-pick
opérations.Lorsque nous utilisons
cherry-pick
, nous devons ajouter commits sur la branche B dans le même ordre chronologique que les commits apparaissent à la Direction A .cherry-pick prend en charge une gamme de validations, mais si vous avez des validations de fusion dans cette gamme, cela devient vraiment compliqué
Exemple de workflow:
Nous pouvons utiliser
cherry-pick
avec des options-e ou --edit : Avec cette option, git cherry-pick vous permettra de modifier le message de validation avant de valider.
-n ou --no-commit : Habituellement, la commande crée automatiquement une séquence de validations. Cet indicateur applique les modifications nécessaires pour sélectionner chaque validation nommée dans votre arborescence de travail et l'index, sans effectuer de validation. De plus, lorsque cette option est utilisée, votre index n'a pas besoin de correspondre à la validation HEAD. La sélection est effectuée par rapport à l'état de début de votre index.
Voici un article intéressant concernant
cherry-pick
.la source
Vous pouvez créer un correctif à partir des validations que vous souhaitez copier et appliquer le correctif à la branche de destination.
la source
git format-patch <revision range>
etgit am *.patch
.checkout
une autre branche.Ou si vous êtes un peu moins du côté de l'évangéliste, vous pouvez faire un peu laid que j'utilise. Dans deploy_template, il y a des commits que je veux copier sur mon maître en tant que branche de déploiement
Cela créera une nouvelle branche de déploiement (j'utilise -f pour remplacer la branche de déploiement existante) sur deploy_template, puis rebasera cette nouvelle branche sur master, en laissant deploy_template inchangé.
la source
Pour le cas simple de simplement copier le dernier commit de la branche wss vers v2.1, vous pouvez simplement récupérer l'id de commit (
git log --oneline | head -n 1
) et faire:la source
La commande cherry-pick peut lire la liste des validations à partir de l'entrée standard.
La commande suivante cherry-picks valide les commits créés par l'utilisateur John qui existent dans la branche "develop" mais pas dans la branche "release", et le font dans l'ordre chronologique.
la source