2011-03-23 8 views
15

J'utilise git-svn pour gérer mes branches bugfix, mais cela me dit que j'ai des changements non fusionnés, même si je revois le repo SVN directement, je peux voir qu'ils ont été validés aussi. C'est comme si le rebasage du correctif de bogue ne réglait pas la branche comme fusionnée.git indique qu'une branche n'est pas fusionnée après rebasage - pourquoi?

Qu'est-ce que je fais mal, ici?

git checkout -b fix_bug_1234 

git add . 
git commit -m "first change" 
git add . 
git commit -m "second change" 

git rebase -i HEAD~2 // squash the two changes together 

git svn rebase // fetch any changes from svn 

git checkout master 
git rebase fix_bug_1234 
git svn dcommit 

git branch -d fix_bug_1234 
error: The branch 'fix_bug_1234' is not fully merged. 

Répondre

27

La raison en est que git rebase modifie les objets de validation. Ainsi, alors que le contenu réel (ou diff) est le même avec ces commits rebasés, ils font référence à un parent différent, et en tant que tels sont différents.

De cette manière, git branch -d ne peut pas vérifier que les modifications de ces validations sont incluses dans d'autres validations. Vous devez utiliser git branch -D (majuscule D) pour forcer la suppression. Sur une note de côté: git svn dcommit a le même effet que rebaser. Comme dcommit pousse les commits au serveur SVN, il reçoit ensuite les commits du serveur SVN à nouveau. Donc, vous finissez avec des objets différents de ceux que vous poussé. Bien qu'ils puissent être identiques dans leur contenu (sauf si vous avez eu des conflits), ils diffèrent toujours (la principale raison est que git svn ajoute une ligne au message de validation indiquant la version SVN à laquelle la validation appartient).

+0

Très bonne réponse, merci d'expliquer dcommit, aussi! –

3

Voici comment je fais ce genre de chose, et cela fonctionne. La réponse de l'utilisateur poke explique pourquoi le git rebase ne fait pas ce que vous voulez.

git rebase -i HEAD~2 // squash the two changes together 

git svn rebase // fetch any changes from svn 
git svn dcommit // you can commit to SVN from any branch 

git checkout master 
git svn rebase 
git branch -d fix_bug_1234 
+0

Eh bien, le rebase lui-même fait ce que je veux. C'est juste un peu effrayant de le voir me dire que je n'ai pas changé! Merci pour les conseils de flux de travail. –

+0

La rebase fait ce que vous voulez pour le contenu de vos fichiers. Cela ne préserve pas l'arbre de validation exact de SVN, donc vous avez vraiment des commits non fusionnés. Ils arrivent juste à aboutir au même contenu de fichier. –

Questions connexes