2010-09-05 39 views
0

基本上,當我想在一個git add --patch <file>操作導致的同一個文件中提交兩個單獨的更改時,git svn rebase稍後會引發1-2個衝突在使用git add進行第二次更改時更改。git-svn問題與git add --patch產生衝突

所以我基本上是做這個(我是主分支,並已獲取的svn庫):

git checkout -b feature 
... make two unrelated changes to file test.txt... 
git add --patch test.txt 
... add first change but ignore second one 
git commit -m "change1" 
git stash 
git checkout master 
git merge feature 
git svn rebase 
git svn dcommit 
git checkout feature 
git stash apply 

現在這裏有兩種方法可以做到這一點,首先是工作的一個:

git add --patch test.txt 
... select everything (which is the second change in this case) 
git commit -m "change 2" 
git checkout master 
git merge feature 
git svn rebase 
git svn dcommit 

這裏是一個不工作:

git add test.txt #notice there's no --patch 
git commit -m "change 2" 
git checkout master 
git merge feature 
git svn rebase #yields a conflict 

那麼爲什麼使用時對於第二次更改,我可以承諾svn存儲庫沒有問題,但是當第二次更改使用git add時,它會導致衝突?我對git很陌生,所以這可能是一個愚蠢的問題,但正如我所看到的,兩個命令集應該完全一樣。

回答

1

你爲什麼要爲你的2個提交創建一個分支然後合併回來?我想這可能會帶來問題,因爲git中的合併工作與svn中的工作方式不同。

這應該工作(「應該」,但我敢肯定它):

# on master, no need to create a branch 
$ git add -p file 
$ git commit -m "first set of changes" 
$ git add file 
$ git commit -m "the remaining changes" 
# apply your commit on top of eventually new changes upstream 
$ git svn rebase 
# commit your 2 commits to svn 
$ git svn dcommit 

在SVN分支只是一個目錄的副本(最常見的主幹目錄),合併提交與正常提交沒有區別(除了以svn 1.6開頭的新svn:mergeinfo屬性)

git中的提交不同,每個提交都存儲指向它的父提交的鏈接。 svn不需要這個,因爲它可以簡單地使用REV-1。合併提交git因此有多個父母(合併分支和合並分支)

我不知道如果你將一個git傳遞給svn會發生什麼,但它可能只會提交合並提交本身,沒有歷史(消息就像「合併分支」bla'到'master')

當你運行svn commit時只有你的新改變被髮送到服務器以節省帶寬現在,在git中合併工作不同,並且與以前版本的區別將會可能不是你期望的那樣,這就是爲什麼git svn dcommit失敗的原因。

它甚至在git svn文檔中這麼說:不要合併使用g它和dcommit他們SVN,它很可能會弄亂你的歷史

運行git合併或混帳拉不建議 您計劃從 dcommit一個分支。 Subversion不會 表示以合理的方式合併或以有用的方式合併;因此使用 Subversion的用戶無法看到您所做的任何合併 。此外,如果合併 或從SVN分支的鏡像的git分支中提取,dcommit可能會將 提交給錯誤的分​​支。 git svn docs

+0

http://andy.delcambre.com/2008/03/04/git-svn-workflow.html我一直在關注這個教程(我是很新,GIT),他說,這是不建議在主分支上工作。我嘗試了它的主人(不完全是你的方式,因爲我想成爲兩個不同的rebase/dcommit svn),它沒有問題。你介意解釋svn和git合併到我的區別,這將不勝感激? – Zenon 2010-09-05 11:53:23

+0

@Zenon:我不明白你的意思»我想成爲兩個不同的rebase/dcommit svn«?你能詳細說明嗎? – knittl 2010-09-05 12:32:17

+0

哦,我的意思是我第一次改變 - > svn rebase&svn dcommit,然後將第二次換回,然後再次svn rebase&svn dcommit。我基本上把所有事情做成了一種概念證明。例如,我正在git的分支上工作,添加一些新的東西,只是破解一些無關的變化。稍後,我想檢查一下我添加到master並隨後添加到svn中的一些內容,然後繼續處理git分支中的其他更改,並在稍後完成時提交它們。這樣,編碼時就不必擔心源控制。 – Zenon 2010-09-05 12:41:10