2011-03-23 132 views
15

我使用git-svn來管理我的bugfix分支,但它告訴我我沒有合併的更改,即使如果我直接查看SVN回購,我也可以看到他們也一直在提交。這就像錯誤修復的rebase沒有將分支設置爲合併。git指出分支之後沒有合併 - 爲什麼?

我在做什麼錯,在這裏?

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. 

回答

27

原因是git rebase更改了提交對象。因此,雖然實際內容(或差異)與重新提交的提交相同,但它們指的是不同的父級,因此是不同的。

那樣git branch -d無法驗證這些提交的更改是否包含在其他一些提交中。您需要使用git branch -D(大寫D)強制刪除。

附註:git svn dcommit與基底具有相同的效果。由於dcommit將提交信息推送到SVN服務器,之後再次從SVN服務器獲取提交信息。所以你最終會得到不同於的物體。雖然內容可能相同(除非有衝突),但它們仍然不同(主要原因是git svn在提交消息中添加了一行,指出提交所屬的SVN版本)。

+0

很好的答案,謝謝你解釋dcommit! – 2011-03-24 15:36:19

3

這是我如何做這種事情,它的工作原理。用戶戳的答案解釋了爲什麼git rebase沒有做到你想要的。

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

那麼,rebase本身正在做我想要的。看到它告訴我我沒有改變!感謝您的工作流程提示。 – 2011-03-24 15:38:35

+0

rebase正在做你想要的文件內容。它不會保留來自SVN的確切提交樹,所以你確實有沒有提交的提交。它們恰好導致相同的文件內容。 – 2011-03-24 17:30:59