2009-09-22 61 views
2

我們在工作中破壞了我們的項目,因爲當我們跨文件移動信息時,我們的VCS正在進行一些糟糕的合併。哪個SCM/VCS可以很好地處理文件之間的文本移動?

的情況是這樣的:

你有很多的是,比如說,包含約從字典方面的信息,所以你必須爲每個字母一個文件中的文件。

用戶輸入術語時會盲目地遵循字典順序,因此如果字典出現在列表中,它們會在B下面放置一個類似「kick the bucket」的條目(或者它可能已列在B, K,踢)。

之後,其他用戶將這些條款移至正確的文件。大量的工作正在完成字典條款。

例如用戶A可能採取了B文件並詳細說明了「踢出桶」的條目。用戶B拿走了B和K文件,並將「kick the bucket」條目移至K文件。無論他們最終承諾採用哪種順序,VCS都可能會丟失條目,而不是「確定」某個條目已被移動。 (這些條目後來自動轉換爲SQL數據庫,但它們保存在一個「人性化」的表單中,用於處理它們,有很多註釋,例子等等。所以不可以接受這樣的說法:「讓你的用戶直接輸入SQL「)。

現在我們差不多手動合併這些類型的文件了,因爲我們不能相信我們的VCS。 :(

那麼該如何解決呢?我很想聽聽,有可能會應對這一個VCS,或者更好的融合算法?或者以其他方式,也許有人可以提出一個更好的工作流程或文件的安排,試圖避免這個問題

+0

只需添加說明這種工作流程 – VonC 2009-09-22 09:13:42

+0

注意的情景:作爲一個「Pythonista」,你可能會更舒服水銀(http://mercurial.selenic.com/wiki/),這確實是什麼混帳做了大部分。 – VonC 2009-09-22 11:15:15

回答

4

我會建議:使用分支

  • (這樣的提交順序並不重要:每個開發人員記錄他/她自己的一套在他/她自己的分支修改)
  • 合併可以解決衝突的主'dico'分支上的分支

Git在這個特別好)


您可以快速測試:

C:\test\git>mkdir dico 
C:\test\git>cd dico 
C:\test\git\dico>git init 
Initialized empty Git repository in C:/test/git/dico/.git/ 
C:\test\git\dico>echo words for B> B.txt 
C:\test\git\dico>echo words for K> K.txt 
C:\test\git\dico>git add -A & git commit -m "first letters" 
[master (root-commit) e91d6fa] first letters 
2 files changed, 2 insertions(+), 0 deletions(-) 
create mode 100644 B.txt 
create mode 100644 K.txt 

你必須在主分支空迪科。
德瓦走來:

C:\test\git\dico>git checkout -b devA 
Switched to a new branch 'devA' 
C:\test\git\dico>echo Kick the Bucket: my def from devA>>B.txt 
C:\test\git\dico>type B.txt 
words for B 
Kick the Bucket: my def from devA 
C:\test\git\dico>git add -A & git commit -m "def from devA" 
[devA 0f27595] def from devA 
1 files changed, 1 insertions(+), 0 deletions(-) 

發展局走來,並得到德瓦的工作:

C:\test\git\dico>git checkout master 
Switched to branch 'master' 
C:\test\git\dico>type B.txt 
words for B 
C:\test\git\dico>git checkout -b devB 
Switched to a new branch 'devB' 
C:\test\git\dico>git merge devA 
Updating e91d6fa..0f27595 
Fast forward 
B.txt | 1 + 
1 files changed, 1 insertions(+), 0 deletions(-) 

C:\test\git\dico>type B.txt 
words for B 
Kick the Bucket: my def from devA 

哦,不!這個定義錯誤的地方!

C:\test\git\dico>echo words for B>B.txt 
C:\test\git\dico>echo Kick the Bucket: my def from devA>>K.txt 
C:\test\git\dico>git add -A & git commit -m "move def to K by devB" 
[devB 473614d] move def to K by devB 
2 files changed, 1 insertions(+), 1 deletions(-) 

修復devB分支。發展局接着說:

C:\test\git\dico>echo add to def by devB>>K.txt 
C:\test\git\dico>git add -A & git commit -m "elaborate def by devB on K" 
[devB f9ae17d] elaborate def by devB on K 
1 files changed, 1 insertions(+), 0 deletions(-) 

含義,在德瓦分支,德瓦還對這個定義的工作:

C:\test\git\dico>git checkout devA 
Switched to branch 'devA' 
C:\test\git\dico>type B.txt 
words for B 
Kick the Bucket: my def from devA 
C:\test\git\dico>type K.txt 
words for K 

C:\測試\ git的\迪科>回聲elabore DEF從德瓦在B >> B.txt

C:\test\git\dico>type B.txt 
words for B 
Kick the Bucket: my def from devA 
elabore def from devA in B 

C:\test\git\dico>git add -A & git commit -m "devA go on on B.txt" 
[devA 1da899a] devA go on on B.txt 
1 files changed, 1 insertions(+), 0 deletions(-) 

如果發展局檢查DEVA的工作,他將檢測到衝突,妥善解決它:

C:\test\git\dico>git checkout devB 
Switched to branch 'devB' 

C:\test\git\dico>git merge devA 
Auto-merging B.txt 
CONFLICT (content): Merge conflict in B.txt 
Automatic merge failed; fix conflicts and then commit the result. 

C:\test\git\dico>git diff 
diff --cc B.txt 
index 1cc6ea9,a986721..0000000 
--- a/B.txt 
+++ b/B.txt 
@@@ -1,1 -1,3 +1,6 @@@ 
    words for B 
++<<<<<<< HEAD 
++======= 
+ Kick the Bucket: my def from devA 
+ elabore def from devA in B 
++>>>>>>> devA 

他會從B.txt中刪除額外的定義並將其添加到K.txt中(然後會去devA並告訴他/她停止,合併他的工作,然後繼續在正確的文件中!)

相關問題