2

我们在工作中对我们的项目造成了严重破坏,因为当我们跨文件移动信息时,我们的 VCS 正在做一些糟糕的合并。

因此,场景是:

例如,您有很多文件,其中包含有关字典中术语的信息,因此您有一个包含每个字母的文件。

输入术语的用户盲目地按照字典顺序输入,所以如果字典恰好列出了它,他们会在 B 下放置一个类似“kick the bucket”的条目(或者它可能已经在 B,bucket 和 K,kick 下列出) .

稍后,其他用户将这些条款移至其正确的文件中。一直在对字典术语进行大量工作。

例如,用户 A 可能已经获取了 B 文件并详细说明了“kick the bucket”条目。用户 B 拿走了 B 和 K 文件,并将“踢桶”条目移动到 K 文件中。无论他们最终以哪种顺序提交,VCS 都可能会丢失条目,并且不会“确定”条目已被移动。

(这些条目稍后会自动转换为 SQL 数据库。但它们以“人性化”的形式保存,用于处理它们,有很多评论、示例等。所以说“让你的用户直接输入 SQL”是不可接受的“。)

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

那么解决方案是什么?我很想知道有一个 VCS 可以解决这个问题。还是更好的合并算法?或者,也许有人可以建议更好的工作流程或文件安排来尝试避免这个问题?

4

1 回答 1

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

您在 master 分支中有一个空的 dico。
DevA 出现:

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(-)

这意味着,在 devA 分支中,devA 也适用于这个定义:

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

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

于 2009-09-22T09:05:29.603 回答