2009-06-10 6 views
35

J'ai fait accidentellement 10 commits sur la branche "testing" quand j'ai eu l'intention de les commettre sur la branche "master". Les autres validations sur la branche "testing" sont garbage, donc je ne veux pas le fusionner avec "master". Au lieu de cela, je veux juste rejouer les 10 derniers commits sur le maître.Relire le dernier N commit sur une branche différente

Répondre

16
  1. git checkout maître
  2. git WhatChanged test
  3. git écrémer _________

?

+5

Juste un fyi-cherry-pick ne fera qu'un seul commit à la fois, donc vous devrez faire des tests de cerise ~ 9 puis tester ~ 8 puis ... tester. C'est pourquoi je préfère l'approche de rebasage proposée par Talljoe ... bien sûr, le résultat est le même. En fait, si vous faites le rebasage de façon interactive, git utilisera en fait la cueillette des cerises sous le capot. –

+9

@PatNotz 'git cherry-pick' peut actuellement faire plusieurs commit à la fois (par exemple' 'git cherry-pick testing ~ 10..testing'). –

+0

Vous ne devriez jamais utiliser 'cherry-pick'. Lisez [cet article] (http://www.draconianoverlord.com/2013/09/07/no-cherry-picking.html) pour plus d'informations. – Tim

80

Rebase devrait le faire.

git rebase -p --onto master testing~10 testing 

Cela copiera les dix derniers commits sur les tests de maîtriser et de faire que le nouveau test (l'ancien test sera orphelin). Ensuite, vous pouvez fusionner maître à tester en tant que rapide-avant.

git checkout master 
git merge testing 
+0

Utilisé la réponse de Ron avant que cela ne soit posté. –

+8

Peut-être vaut-il la peine de noter que cela laisse le test au même point que le maître, laissant les commits "garbage" orphelins. Cela peut ou peut ne pas être une bonne chose. Une autre possibilité serait git checkout master; git reset - tests de résistance; git rebase --onto HEAD @ {1} HEAD ~ 10 –

+0

@CharlesBailey Quel git flog avez-vous l'intention d'atteindre? – Fredrick

2

Comme dit dans les commentaires, la réponse rebase -inspired est laissant le 'déchets' commits devenus orphelins.

Il suffit d'utiliser des outils simples:

git checkout master 
git merge testing 
git checkout testing 
git reset --hard HEAD~10 # Go back 10 commits (*1) 
git checkout master 

(* 1) Vous ne serez "perdre" engage de la branche testing, puisque vous aurez les commits en master grâce à la merge.

Questions connexes