我们正在对我们的工作项目造成严重破坏,因为当我们跨文件移动信息时,我们的VCS正在进行一些糟糕的合并。
因此情况如下:
你有很多文件,比如包含有关词典中术语的信息,所以你有一个文件用于每个字母的字母。
输入术语的用户盲目地遵循字典顺序,因此他们会在B下面添加类似“踢桶”的条目,如果这是字典恰好列出的地方(或者它可能已经列在B,桶和K下面) ,踢)。
稍后,其他用户将这些条款移动到正确的文件中。在字典术语上一直在做很多工作。
e.g。用户A可能已经获取了B文件并详细说明了“踢桶”条目。用户B获取了B和K文件,并将“踢桶”条目移动到K文件。无论他们最终提交的订单是什么,VCS都可能会丢失条目而不会“弄清楚”条目已被移动。
(这些条目后来自动转换为SQL数据库。但是它们以“人性化”的形式保存,可以处理它们,有很多评论,例子等等。所以说“让你的用户”是不可接受的直接输入SQL“。)
我们现在几乎手动合并这些类型的文件是非常糟糕的,因为我们不能信任我们的VCS。 :(
那么解决方案是什么?我很想听到有一个VCS可以解决这个问题。还是更好的合并算法?或者,也许有人可以建议更好的工作流程或文件安排来尝试避免这个问题?
答案 0 :(得分:4)
我建议:
(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
主分支中有一个空的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>来自B中的devA的echo elabore def>> 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并告诉他/她停止,合并他的工作,然后继续使用正确的文件!)< / p>