真的,一个具体的例子,在Git中合并比SVN更容易?
堆栈溢出问题是一个很好的问题,有一些很好的答案。然而,没有一个简单的例子显示在Git中进行合并比在Git中进行合并更好 如果这个问题有可能以重复的形式结束,那是什么真的,一个具体的例子,在Git中合并比SVN更容易?,git,svn,merge,Git,Svn,Merge,堆栈溢出问题是一个很好的问题,有一些很好的答案。然而,没有一个简单的例子显示在Git中进行合并比在Git中进行合并更好 如果这个问题有可能以重复的形式结束,那是什么 具体的合并场景 在SVN中有多困难 同样的合并在Git中如何更容易 有几点: 没有哲学或深刻的解释什么是DVCS请。这些都很好,真的,但我不希望他们的细节混淆了这个(IMHO)重要问题的答案 我现在不在乎“历史SVN”。请比较现代Git(1.7.5)和现代SVN(1.6.15) 请不要重命名-我知道Git会检测重命名和移动,而SV
- 没有哲学或深刻的解释什么是DVCS请。这些都很好,真的,但我不希望他们的细节混淆了这个(IMHO)重要问题的答案
- 我现在不在乎“历史SVN”。请比较现代Git(1.7.5)和现代SVN(1.6.15)
- 请不要重命名-我知道Git会检测重命名和移动,而SVN不会。这是伟大的,但我正在寻找一些更深层次的,不涉及重命名或移动的例子
- 没有重基或其他“高级”Git操作。请给我看看合并
trunk
,而不提交未完成的代码)。当开发人员最终提交时,将有大量的更改汇总到一次提交中。对于其他希望将自己的工作与“大爆炸”提交合并的开发人员来说,VCS工具没有足够的信息来说明第一个开发人员是如何达到他们提交的目标的,所以你只能得到“整个功能中存在巨大的冲突,去解决它”
另一方面,使用Git和其他具有廉价本地分支的DVC的通常方式是定期提交。一旦你完成了一点非常有意义的工作,你就要去做。它不一定是完美的,但它应该是一个连贯的工作单元。当您返回合并时,您仍然有较小提交的历史记录,它显示了从原始状态到当前状态的过程。当DVCS将此内容与其他人的工作合并时,它会提供更多关于何时进行了哪些更改的信息,并且最终会减少冲突
关键是,只有在完成某件事情之后,才能通过一次大爆炸提交来解决与Git的合并问题。Git鼓励您进行更小的提交(通过尽可能减少痛苦),这使得将来的合并更容易。我没有具体的例子,但是任何类型的重复合并都是困难的,特别是所谓的
a
/ \
b1 c1
|\ /|
| X |
|/ \|
b2 c2
合并b2和c2
Subversion wiki上的wiki页面描述了DVCS中基于mergeinfo的非对称Subversion合并(具有“同步”和“重新整合”方向)和基于合并跟踪的对称合并之间的差异,其中有一个部分“在DVCS中保持答案简短,因为您有本地源代码控制,如果在合并过程中出现问题(这可能发生在大型合并中),您可以始终回滚到以前的本地版本,该版本包含合并前所做的更改,然后重试
因此,基本上您可以进行合并,而不必担心本地更改在合并过程中会受到损坏。我只能告诉您一个小实验,Git并不比Subversion好(同样的问题) 我想知道这个案子: 从两个分支“mytest1”和“mytest2”开始,这两个分支都基于相同的提交。 您有一个包含函数blub()的C文件。 在分支mytest1中,将“blub()”移动到文件中的其他位置并提交。 在分支mytest2中,修改blub()并提交。 在分支mytest2上,您尝试使用“git merge mytest1” 似乎产生了合并冲突。 我希望Git能够认识到“blub()”是在mytest1中移动的,然后能够将mytest2中的修改与mytest1中的移动自动合并。但至少当我尝试时,这并没有自动起作用 所以,虽然我完全理解Git在跟踪已经合并的内容和还没有合并的内容方面做得更好,但我也怀疑是否存在Git比SVN更好的“纯”合并案例 现在因为这个问题困扰了我很长时间,我真的试图创建一个具体的例子,在这个例子中Git更好,而在SVN中合并失败了 我在这里找到了一个,但这包括一个重命名,这里的问题是一个没有重命名的案例 下面是一个SVN示例,它基本上尝试了这一点:
bob +-----r3----r5---r6---+
/ / \
anna / +-r2----r4----+--+ \
/ / \ \
trunk r1-+-------------------r7-- Conflict
这里的想法是:
- Anna和Bob都是拥有自己分支的开发人员(在r2和r3中创建)李>
- 安娜做了一些修改(r4)
- Bob做了一些修改(r5)李>
- Bob将Anna的修改合并到他的分支中;这会产生冲突,Bob会修复冲突,然后提交(r6)李>
- ANAS修改被合并回主干(r7)李>
- Bob试图将他的修改合并回主干中,这再次引起冲突
svn merge
替换为
svn merge ^/trunk branches/bob
这也显示了冲突
这与Git 1.7.9.5相同:
#!/bin/bash
cd /tmp
rm -rf rep2
mkdir rep2
cd rep2
git init .
echo -e "A\nA\nB\nB" > f.txt
git add f.txt
git commit -m "Initial file"
git branch anna
git branch bob
git checkout anna
echo -e "A\nMA\nA\nB\nB" > f.txt
git commit -a -m "anna added text"
git checkout bob
echo -e "A\nMB\nA\nB\nMB\nB" > f.txt
git commit -a -m "bob added text"
git merge anna
echo -e "A\nMAB\nA\nB\nMB\nB" > f.txt
git commit -a -m "anna merged into bob with conflict"
git checkout master
git merge anna
git merge bob
f.txt的内容如下所示
初始版本
A
A
B
B
安娜的修改
A
MA
A
B
B
A
MB
A
B
MB
B
鲍勃的修改
A
MA
A
B
B
A
MB
A
B
MB
B
安娜的分行并入鲍勃的分行后
A
MAB
A
B
MB
B
正如许多人已经指出的那样:问题是,subversion不记得Bob已经解决了冲突。所以当你现在试着
88807ab HEAD@{0}: merge bob: Fast-forward
346ce9f HEAD@{1}: merge anna: Fast-forward
15e91e2 HEAD@{2}: checkout: moving from bob to master
88807ab HEAD@{3}: commit (merge): anna merged into bob with conflict
83db5d7 HEAD@{4}: commit: bob added text
15e91e2 HEAD@{5}: checkout: moving from anna to bob
346ce9f HEAD@{6}: commit: anna added text
15e91e2 HEAD@{7}: checkout: moving from master to anna
15e91e2 HEAD@{8}: commit (initial): Initial file
tree b634f7c9c819bb524524bcada067a22d1c33737f
author Ingo <***> 1475066831 +0200
committer Ingo <***> 1475066831 +0200
Initial file
tree f8e16dfd2deb7b99e6c8c12d9fe39eda5fe677a3
parent 83db5d741678908d76dabb5fbb0100fb81484302
parent 346ce9fe2b613c8a41c47117b6f4e5a791555710
author Ingo <***> 1475066831 +0200
committer Ingo <***> 1475066831 +0200
anna merged into bob with conflict
1 2 3
…--o--o--o trunk
\4 5
o--o branches/feature_1
# thank goodness for the addition of the --reintegrate flag in SVN 1.5, eh?
svn merge --reintegrate central/repo/path/to/branches/feature_1
# build, test, and then... commit the merge
svn commit -m "Merged feature_1 into trunk!"
1 2 3 6
…--o--o--o------o /trunk
\4 5/
o--o /branches/feature_1
v-- master, HEAD
1 2 3
…--o--o--o
\4 5
o--o
^-- feature_branch
# Attempt a merge
git merge feature_branch
# build, test, and then... I am done with the merge
1 2 3 4 5
…--o--o--o--o--o
^-- feature_branch, master, HEAD
# build, test, and then... just publish it
git push