2013-01-14 88 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'來說是一個尷尬的必需品。測量兩次;切一次。 –