2013-01-14 46 views
3

我正在使用git-svn,并且已经在一系列提交的本地主题分支上工作,并且遇到了一些麻烦,将我的更改合并到了主内容中。如果我在合并之前忘记做git svn rebase,该怎么办?

这些都是已经得到了我我在我这里的步骤:

git commit (on topic branch) 
git checkout master 
git svn fetch (numerous files pulled down from origin) 
git merge <topic branch> 

在这一点上我有一个合并冲突,我固定,然后做了git add <file>加我固定的文件。

现在我的git status报告所有文件(包括所有从服务器提取的文件)都是要提交的更改。我忘了做一个git svn rebase,我认为这是我的问题。

我是相当新的git,所以我甚至不确定我所看到的是否是预期的行为,但它似乎是可疑的。我遗忘的git svn reabse是否让我陷入困境?我该如何摆脱这种潜在的混乱?

回答

2

假设你用树干工作,放弃你的合并提交

git reset --hard remotes/trunk 

赶上任何变化,颠覆

git svn fetch 
git svn rebase 

现在你有两个选择。你可以重订工作的特性分支和合并它:

git checkout <topic branch> 
git rebase remotes/trunk 
git checkout master 
git reset --hard remotes/trunk 
git merge <topic branch> 
git svn dcommit 

你可能更喜欢壁球合并代替,这意味着泥包上的一个分支都变成一个单一的提交。丢弃,取,并与上述变基,然后

git merge --squash <topic branch> 

清洁合并会去,你可以用

git diff --cached 

的任何冲突都将在工作树留审查索引,你可以看到他们

git diff 

解决任何冲突,上演他们git add,然后git commit要给你新的提交。

+0

这工作完美!你救了我很多头痛。 'git checkout master'之后的第二个'git reset --hard remotes/trunk'的目的是什么? –

+0

不客气!我很高兴它有帮助。如果发生新的检查,那么硬重置会将您的索引和工作树与Subversion同步。因为你是git的新手,**要非常小心**'git reset --hard'。它是少数将会破坏工作的git命令之一,但它对于'git svn'来说是一个尴尬的必需品。测量两次;切一次。 –