Version control 哪些SCM/VCS能够很好地处理文件之间的文本移动?

Version control 哪些SCM/VCS能够很好地处理文件之间的文本移动?,version-control,merge,commit,conflict,Version Control,Merge,Commit,Conflict,我们的项目在工作中遭到了严重破坏,因为当我们在文件间移动信息时,我们的VCS正在进行一些糟糕的合并 因此,情况是: 你有很多文件,比如说,包含字典中的术语信息,所以你有一个文件来记录字母表中的每个字母 用户盲目地按照字典顺序输入术语,因此如果字典碰巧在B下列出了类似“kick the bucket”的条目(或者可能同时在B、bucket和K、kick下列出),他们会在B下放置类似“kick the bucket”的条目 稍后,其他用户会将术语移动到正确的文件中。词典中的术语一直在做大量的工作 e

我们的项目在工作中遭到了严重破坏,因为当我们在文件间移动信息时,我们的VCS正在进行一些糟糕的合并

因此,情况是:

你有很多文件,比如说,包含字典中的术语信息,所以你有一个文件来记录字母表中的每个字母

用户盲目地按照字典顺序输入术语,因此如果字典碰巧在B下列出了类似“kick the bucket”的条目(或者可能同时在B、bucket和K、kick下列出),他们会在B下放置类似“kick the bucket”的条目

稍后,其他用户会将术语移动到正确的文件中。词典中的术语一直在做大量的工作

e、 g.用户A可能已经获取了B文件,并详细说明了“kick the bucket”条目。用户B获取B和K文件,并将“kick the bucket”条目移动到K文件中。无论最终以何种顺序提交,风投都可能会丢失条目,而不会“发现”条目已被移动

(这些条目稍后会自动转换为SQL数据库。但它们以“人性化”的形式保存,用于处理它们,带有大量注释、示例等。因此,不能说“让您的用户直接输入SQL”。)

这太糟糕了,我们现在几乎要手动合并这些类型的文件,因为我们不能信任我们的VCS(

那么解决方案是什么呢?我很想听到有一家风投公司可以解决这个问题。或者有一个更好的合并算法?或者,也许有人可以建议一个更好的工作流或文件安排来尝试避免这个问题?

我建议:

  • 使用分支(这样,提交的顺序无关紧要:每个开发人员在自己的分支中记录自己的修改集)
  • 将分支机构合并到可以解决冲突的主要“dico”分支机构上
(这方面特别擅长)


您可以快速测试它:

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
主分支中有一个空dico。
德瓦出现了:

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(-)
DevB出现并获得了devA的工作:

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分支中修复。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:\test\git\dico>echo elabore def from devA in 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(-)
如果devB检查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
C:\test\git\dico>git签出dev
切换到“devB”分支
C:\test\git\dico>git merge devA
自动合并B.txt
冲突(内容):在B.txt中合并冲突
自动合并失败;修复冲突,然后提交结果。
C:\test\git\dico>git diff
diff--cc B.txt
索引1cc6ea9,a986721..0000000
---a/B.txt
+++b/b.txt
@@@ -1,1 -1,3 +1,6 @@@
B字
++>德瓦

他将从B.txt中删除额外的定义,并将其添加到K.txt中(然后将转到devA,并告诉他/她停止、合并他的工作,然后在正确的文件中继续!)

刚刚添加了一个说明这种工作流程的场景:作为一个“Pythonista”,您可能会更习惯Mercurial(),它完成了Git的大部分工作。