2017-10-04 10 views
0

J'ai une histoire qui ressemble un peu comme suitGit, annuler commit de fusion sur rebasage

* (TOPIC) topic 3 
    | 
| * merge master onto topic 
|/| 
* | master 3 
| * topic 2 
* | master 2 
| | 
| * topic 1 
|/ 
* master 1 
| 

à savoir la branche en amont est fusionnée en sujet une fois. Maintenant, je veux rebasculer interactivement cette branche de sujet sur la même base, mais annuler la fusion (fusionner la validation elle-même et tous les commits du maître introduit par la fusion). Comment est-ce possible?

Répondre

2

permet d'utiliser des identifiants valides pour les commits représentés dans votre dessin:

* topic3   (TOPIC) topic 3 
    | 
| * topic2merge  merge master onto topic 
|/| 
* | master3 
| * topic2 
* | master2 
| | 
| * topic1 
|/ 
* master1 
| 

Si vous souhaitez supprimer la fusion commit (faire topic2 le seul parent du premier engagement après merge master onto topic) vous devez exécuter les éléments suivants commande git rebase:

git rebase --onto topic2 topic2merge topic3 

Si la branche courante est déjà topic3 vous pouvez omettre topic3 de la commande ci-dessus (si elle est présente, la première chose qui git rebase le fait à la caisse, si ce n'est pas la branche actuelle déjà).

Après cette opération, le graphique ressemble à ceci:

| * topic3  <-- (TOPIC) topic 3 
| | 
* | master3 
| * topic2 
* | master2 
| | 
| * topic1 
|/ 
* master1 
| 

Les commits entre et y compris topic2merge et topic3 sont encore présents dans le dépôt, mais ils ne sont pas plus visibles. Ils sont toujours visibles s'ils sont joignables et cela arrive s'il y a des branches qui les pointent. Même les branches éloignées.

Si vous avez déjà poussé topic3 à une prise en pension à distance, vous devez exécuter git push -f origin topic3 (remplacer origin avec le nom de votre télécommande) et d'informer vos collègues sur le fait que vous avez changé l'histoire. Ils ont besoin de savoir cela; dans leurs dépôts topic3 a toujours topic2merge dans son histoire et le changement que vous avez fait représente une ligne d'histoire alternative leurs repos ne prennent pas automatiquement. Ils doivent utiliser git reset --hard ou git rebase ou git cherry-pick pour continuer.

2

Vous pouvez utiliser la commande

git rebase -i --onto master1 master topic 

Cela prendra toutes les non-fusion engage qui sont en topic mais pas dans master (qui sont sujet1, sujet2, topic3) et les appliquer au-dessus de master1 commettras.