Comment copier des commits d'une branche à l'autre?
j'ai deux branches de mon maître:
- v2.1 : (version 2) j'ai travaillé pendant plusieurs mois", 151960920"
- wss : que j'ai créé hier pour ajouter une caractéristique spécifique à mon maître (en production)
Est-il un moyen de copier hier s'engage à partir de wss pour v2.1?
6 réponses
vous devriez vraiment avoir un flux de travail qui vous permet de faire tout cela en fusionnant:
- x - x - x (v2) - x - x - x (v2.1)
\
x - x - x (wss)
donc tout ce que vous avez à faire est git checkout v2.1
et git merge wss
. Si pour une raison quelconque vous ne pouvez vraiment pas faire cela, et vous ne pouvez pas utiliser git rebase pour déplacer votre branche wss au bon endroit, la commande pour saisir une seule propagation de quelque part et l'appliquer ailleurs est git cherry-pick . Il suffit de vérifier la branche que vous voulez appliquer il est allumé, et exécute git cherry-pick <SHA of commit to cherry-pick>
.
Certaines façons de rebase pourrait vous sauver:
Si votre histoire ressemble à ceci:
- x - x - x (v2) - x - x - x (v2.1)
\
x - x - x (v2-only) - x - x - x (wss)
vous pouvez utiliser git rebase --onto v2 v2-only wss
pour déplacer wss directement sur v2:
- x - x - x (v2) - x - x - x (v2.1)
|\
| x - x - x (v2-only)
\
x - x - x (wss)
alors vous pouvez fusionner! Si vous vraiment, vraiment, vraiment ne peut pas arriver au point où vous pouvez fusionner, vous pouvez toujours utiliser rebase pour faire efficacement plusieurs choix à la fois:
# wss-starting-point is the SHA1/branch immediately before the first commit to rebase
git branch wss-to-rebase wss
git rebase --onto v2.1 wss-starting-point wss-to-rebase
git checkout v2.1
git merge wss-to-rebase
Note: la raison pour laquelle il faut un peu de travail supplémentaire pour faire cela est qu'il crée des propagations dupliquées dans votre dépôt. Ce n'est pas vraiment une bonne chose - le but de brancher et fusionner facilement est d'être capable de tout faire en faisant des commits(s) un seul endroit et en les fusionnant là où ils sont nécessaires. Dupliquer s'engage signifie une intention de ne jamais fusionner ces deux branches (si vous décidez que vous voulez plus tard, vous obtiendrez des conflits).
Utiliser
git cherry-pick <commit>
pour appliquer <commit>
à votre branche courante .
moi-même je croiserais probablement les commits que je choisis dans gitk
et les choisir avec des clics droits sur l'entrée de commit là à la place.
si vous voulez aller plus automatique (avec tous ses dangers) et en supposant tout commet depuis hier s'est produit sur wss vous pourriez générer la liste des commits en utilisant git log
avec ( --pretty
suggéré par Jefromi)
git log --reverse --since=yesterday --pretty=%H
donc tout ensemble en supposant que vous utilisez bash
for commit in $(git log --reverse --since=yesterday --pretty=%H);
do
git cherry-pick $commit
done
si quelque chose se passe mal ici (Il ya beaucoup de potentiel) vous êtes en difficulté depuis que cela fonctionne sur la caisse en direct, donc soit faire des sélections manuelles ou utiliser rebase comme suggéré par Jefromi.
vous pouvez créer un patch à partir des commits que vous voulez copier et appliquer le patch à la branche de destination.
git cherry-pick
: appliquer les changements introduits par certains commits existants
supposons que nous avons la branche A avec (X, Y, Z) commits. Nous devons ajouter ces commits à la branche B . Nous allons utiliser les opérations cherry-pick
.
lorsque nous utilisons cherry-pick
, nous devrions ajouter commits on branch B dans le même ordre chronologique que les commits apparaissent dans Branch Un .
cherry-pick ne supporte une gamme de commits, mais si vous avez la fusion commits dans cette gamme, il devient vraiment compliqué
git checkout B
git cherry-pick SHA-COMMIT-X
git cherry-pick SHA-COMMIT-Y
git cherry-pick SHA-COMMIT-Z
exemple de flux de travail:
nous pouvons utiliser cherry-pick
avec options
-e ou --edit : Avec cette option, git cherry-pick vous permettra d'éditer le message de propagation avant de le propager.
-n ou --no-commit : en général, la commande crée automatiquement une séquence de commits. Cette option applique les modifications nécessaires pour sélectionner chaque commit dans votre arborescence de travail et dans l'index, sans faire de commit. De plus, lorsque cette option est utilisée, votre index n'a pas à correspondre à la propagation en tête. Le pic à Cerise est fait contre l'état de début de votre index.
voici un intéressant article concernant cherry-pick
.
ou si vous êtes un peu moins du côté de l'évangéliste, vous pouvez faire un peu moche de la façon que j'utilise. Dans deploy_template il y a des commits que je veux copier sur mon master en tant que branche déployer
git branch deploy deploy_template
git checkout deploy
git rebase master
cela créera une nouvelle branche deploy (j'utilise-f pour écraser la branche deploy existante) sur deploy_template, puis rebaser cette nouvelle branche sur master, laissant deploy_template intact.
pour le cas simple de copier la dernière propagation de la branche wss vers v2.1, vous pouvez simplement saisir l'ID de propagation ( git log --oneline | head -n 1
) et faire:
git checkout v2.1
git merge <commit>