SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 8923|回复: 0

[转贴] TFS 11中的合并增强功能与Git的对比

[复制链接]
发表于 2012-3-8 15:14:52 | 显示全部楼层 |阅读模式
我们在TFS 2010中收到的常见客户反馈信息,都说合并还是太复杂了,并且/或者说太有限了。我们已经在即将发布的版本中做了一些显著的改进:; M# Y7 r0 S; ]: r0 o
全新的差异/合并体验
# Z, |# H3 n4 K! u; `: S( Q
—我们过去5年来发布的就是原始SourceSafe 差异/合并工具—大约在1994年我们还停留在One Tree 软件时创建。多年来它一直被增强,以支持全球化,Unicode等,但它本质上是同一个diff工具。不过现在不再是了,都已经过去了。我们在VS编辑器的基础上新建了一个差异/合并体验。在你说“等等,我真的很喜欢kdiff!”之前,请不用担心——这仍然是可配置的,你可以使用自己喜欢的任何工具,但是话说回来,这次真的变得更好。为什么说它更好了呢?

$ R- z" Z8 \" S, k2 ?# K" f, @
  • 它同时支持“内联”和“并排”模式,你可以选择自己最喜欢的模式。
  • 它有句法高亮提示(VS编辑器中支持这个)
  • 单行中的个别变更会有高亮提示
  • 当同时进行比较和合并时,你可以利用VS编辑器的强大力量,包括其中的撤销,智能感应和其他功能。
  • Diff有一个很棒的“迷你地图”。
  • 现在你可以在视图中做更多的操作了(比如历史等等。)
  • Diff使用VS中全新的临时标签功能,以免弄乱你的文件。
  • 手动选择合并方案的改进方法。
  • 打开/关闭忽略空格的互动方法。
    % }6 q$ d) ]* F. _7 A
这里有些屏幕截图来展示这些功能,你会注意到很多我上述列举的优点:1 w% G, s5 h1 _6 t1 R1 `
临时标签中的并排差异视图(一直到右边),左边有变更高亮��示槽,同行内变更高亮提示,VS风格类/方法导航,句法上色等。没错在源代码上方文件名的文本看上去很傻,那是一个错误。9 M0 p9 r3 p) Z6 q3 C4 H

$ w' ^, o; `3 [) U5 c
: O( X  l! i7 R使用内部模式的相同diff:6 c) v; E2 F, d
! B) F' q0 a0 A( _2 r( Y* _1 w

+ j, }7 G; Q* F7 `! k1 d4 D- l. }! j2 t/ J  Y
以下是一些关于合并的截屏。我把你可以选择的三种视图都包含在其中了:9 @- {# [  Z! l! J8 g

3 X" d1 \# `- p8 @' s' t  {2 i+ a, R3 y5 \
  f+ [+ _/ w* z2 \

+ I$ {# {" {# i) b3 H' z) H" l4 M1 V% X; q. {$ p4 D

! c+ \# S  Q) s' q. Q1 d/ Y% Q4 g5 @# d1 L' q. Y

& z+ v$ k7 ]- K7 ?5 j, J
3 ^# o# ?& k7 L) O
1 |& k; v+ y* f3 q; L3 F# m1 Y总的来说,这是一款比我们以前更好的默认差异和合并体验。
- H0 }0 R/ h/ U* r/ J" V
9 S& P: r' |' D) V- P+ Z! h合并时最少化冲突—这大概是我们听到过的最大的关于合并的抱怨了,它的方式太麻烦了。我们花了很长时间来努力研究这个反馈,总结出首要的问题是做合并时会有太多冲突报告,而这些报告没有要求你做有意义的决定。大家希望它“处理”所有明显的合并并提请他们注意哪里他们有真正的工作要做。
% {0 j( v: m' k7 G. z" U8 @
8 j4 o4 |& q" {为展示TFS 2010和TFS 11间的区别,我运行了一个示例场景。它很简单,而且看上去有点刻意为之,但却能显示出其中的差异。我选取了一个充满TFS源代码的文件夹,并为它加分支。然后我在两个分支中把两个方法进行了重命名,并合并了结果。结果是源代码分支中48个文件改变了,而在目标分支中有90个文件改变了。结果报告中的冲突如下:
* p/ J5 E/ j+ p$ N$ z9 w
  • TFS 2010: 38 个冲突
  • TFS 11: 12 个冲突) N: t% F+ y6 q$ k, F
; e, M9 p7 ]0 e* u
差别在于TFS 11自动解决了26个冲突,无需经过用户交互。
+ `. F. c3 `: j! L* e- z* ^3 I' \" o( C! |( i- f) j: l
我总是听说Git是这种行为的“黄金标准”。所以,我们对Git和TFS合并行为做了一个点对点的比较,我们发现为了向Git体验看齐所必需的代码改动真的很小。所以我们比较了新版TFS和Git。我不想说这是耗费精力的测试,或者说我面面俱到,但我相信它覆盖了大部分常见情况,当你亲自体验时,如果发现我们遗漏了什么,请让我知道。: a2 Z4 ^- X! j4 W

% ?- H$ ], k9 W* R* _  V针对这个情况,我想比较不同冲突的行为。我创建了一个含有9个文件的文件夹,并进行了分支,然后安排了一个特定模式的变更,以激起冲突。以下就是变更:
3 S( r2 }( {9 b! p2 \" \$ r
File* ]+ S; {  E& m  a! C) g! N
Source change$ @1 [  U- P7 N- |! x, y# @
Destination change5 I! I, r; {( `" z7 _" D# Z3 j
Comment6 T9 P% U4 k. h: _; o/ A8 f2 |
file1.txt
  p; D+ y5 k' A: c( ^
unchanged
' u! m( y+ g2 s2 r$ n
unchanged; H! A' J3 ~' @+ R$ Z
Trivial case, nothing to merge and nothing in the destination
+ {0 c6 z8 g- k7 d6 x
file2.txt
# \1 Z% K" f& ~3 j, m
edit line 3
: ?, T) j/ g& _* q/ b
unchanged
8 j. B9 T1 _& e  w
Just merge the change into the destination4 u8 D, i' j. N- d2 [2 O
file3.txt+ W6 o5 W6 l4 ~8 p# e/ X
unchanged/ `  c9 m* b  o$ a
edit line 35 k- c- I: r4 x) O9 I! f
Nothing to merge over and the change in the destination should affect it% A/ T# j8 ~: L  k) l) \
file4.txt7 K  C( Q1 T2 {5 D* x9 Q9 ]
edit line 3
7 [' Y- |6 j5 N
edit line 7
: }& O! m, [* g3 A
Distinct changes in source and destination
6 f% z) ?* b3 x1 z% }" a' z
file5.txt7 R8 \: Y- W) ?+ g5 m
edit line 5$ W! Y& z2 g- T. J) e2 a: H
same edit line 5
) B9 T' Z" Z. s- x
Same change in both files should merge well
4 C  Y# K; [+ v* o' r4 H
file6.txt0 h' s. S( Y- v) s3 f6 m5 b
edit line 5* g. x  k( ^* P( y- s2 f. @
different edit line 5
6 D0 |4 l$ h* ^" N2 [( V" a
This is a conflict that will require user interaction to resolve
/ f  [/ Y/ h6 _
file7.txt. ^" J9 L! G6 n) O+ e; g
delete file, g7 B- A* T5 b  ~$ C
unchanged8 \9 G1 y1 {3 g, @; R- ^' `( D, g
Delete the file in the source an no changes in the destination
7 m* x* q, k) i+ N& U/ l
file8.txt! g9 L' _2 k$ W( R6 t
delete file" D% Z& |' U3 \" r/ @% u
edit line 5
2 i4 {6 Y7 |, `! }4 S3 Y/ N0 D
A file delete in the source conflicting with an edit in the destination
( P) e4 `& i  {" L
file9.txt
# W( e6 Q3 I1 `
rename file4 T7 n- l  C; p0 A; d
unchanged. u2 k3 k: V- P
Should not really be any conflict here- w7 A* c5 D' D, r$ f% L
/ n5 A9 i. T* i; }
然后我在TFS 2010,TFS 11和Git中创建了同样的场景,并查看结果。在这个场景中,我对三个产品都使用了命令行。( ?6 `: q' Q' B$ C6 v% }
" c/ i. F% i* R- W- C7 ~
以下是TFS 2010的合并输出:9 F: k. d; X. U7 [; `
$ l+ N5 @0 j" {0 ?+ R1 g. |' ^

" b: d- L5 |2 j! F
) b( r$ s0 E8 X2 w, F0 H注意其中列出了3个冲突,还有4个额外的合并。文件1和3无需任何兼并。以下是tf状态输出:5 ?6 E. Z! X# c) Y5 B' d
3 j. x; \0 R4 W& p1 J$ d4 v, N

' e2 {; y$ T: m8 a) ^
, J+ x7 d1 q) C1 t2 b我们可以看到有7个变化有待解决(期望的,基于我们在合并输出中看到的)
* j0 s2 t2 ?6 w) }3 a, t. K# k+ A7 G  n* c
以下是同样场景中Git的合并输出:
6 _- l3 o" ]  x  v4 Z7 X5 R6 j; m& F
( q  l* u( O/ f& D0 _  ?. }) u9 {
  _+ B" i7 x3 ~9 g
以下是状态输出:5 k+ d" J( _$ ]* b
" k/ D5 y, f4 q; u; v4 p
+ }) R& i/ ~9 [! a
, l8 \. L& b3 A; G3 U* r
首先要注意的是Git只显示了2个冲突—文件4被自动解决,而在TFS 2010中并没有。我还注意到文件5完全没有显示(记得那是源代码和目标中发生相同变化的地方)。除此之外,合并/冲突结果是相同的。我还注意到TFS合并输出的外形不易于阅读,Git中的着色代码更好,而且还在状态输出中包含了冲突信息,这也很不错。+ L5 N5 z, b# Z( O7 @
% Z/ E' K  `% `, A) J* Y0 n# Y
然后我在TFS 11中运行了同样的场景:+ L; X0 c# p3 U! e
6 x5 U6 q" h4 Q; P( ^
4 Y' b4 p; M/ n
- I3 y  y1 v8 u. r1 j
# _' N$ r) G; f
) L3 |  o5 C! m3 _5 |
现在冲突的数量和Git相同。我们在显示文件5.txt上还是存在差别的,因为我们在合并上做的借记/贷记逻辑需要待决定定的变化来辨认合并已经发生。我要更留心地看看它。输出是相同的,我也和团队说了要在这里做一些改进,以提高可读性,减少冗长。
0 m. x6 Q  X3 Q6 S! {6 C6 Y2 d) _7 c  _
3 F3 O( l7 r6 R" E2 |1 V# N+ g, e当我在做与Git的比较时,我很惊讶的发现我们在2010中解决的冲突种类数量没想象的那么高。不过,还没把频繁度算进去(所以我才先做了一个重命名。)我们没有处理的一个类型正好是最常见的,所以对开发者来说小小的变化就会产生很大的影响。* @* I( ~* [3 s: J5 o7 Z
2 d. T/ W, Q3 ~  c1 w
UI中无基合并—还有一个大家一直都很希望解决的就是希望能在UI中实行无基合并。我们在命令行中支持这个,当我也很多次在Power Tools的博文中说到过回滚这个问题,对很多人来说,不在UI中就等于不在产品中。现在UI中也有了。当你从源代码控制管理器中启动合并时,会有一个浏览器按钮,你能通过它来找到分支以完成无基合并。9 a6 q( R- V$ E

! Y# J1 `, v1 w0 L我们来看一个例子。我从这样的分支结构着手:
5 {. N! X9 n4 O7 B  f6 r1 Z& R' H6 s5 B) ]4 {

& c1 }' }, ?0 `6 R
$ H5 W5 U0 k& D. y你会发现在destination和AlternateDestination间没有合并关系。但让我们来想象一下我在destination中有一些改变,我想在AlternateDestination中有相同的改变,但我又不想通过Source来实现。我希望从destination到AlternateDestination做无基合并。我现在就可以转到源代码控制管理器,开始标准合并体验了。8 J' z( x, y& {) e  E$ T

6 i& z$ i' M$ R$ ]" J
# _4 M: m# q/ o6 G
, B4 c) t4 `" m2 E一如往常,在列表中只有Source,这是唯一和destination相关的分支。然而,和TFS不同,现在有了一个浏览……按钮,达成无基合并。如果你点击它,你会得到:
7 F8 E# Y; I' z( {! {% J* I6 f
1 I! Q) V2 {/ W3 u: ?  m* Z- P. B2 d
8 K, _' K/ B! w; o: g' h
在这里你可以看到我可以选择AlternateDestination。如果我选中,并点击确定,我就会回到向导:8 K! u( P1 e7 V3 ~4 v/ l) F

2 J$ A- @) p0 F% A6 _+ S3 a1 P* u0 P6 T3 j* ]
) B0 H+ W' r/ W
而且它警高我,我正在做无基合并,但是我可以点击下一步,然后完成并继续进行。所以,你现在可以在UI界面中做无基合并了。
( v6 U7 n4 L. a1 I: I3 B' Q0 I% h3 G0 M: O
未搁置上兼并—从一开始人们就喜欢搁置,把它看做是打包变化并将其放在一边的一个简单干净的方法。然而,我们经常听到抱怨无法搁置待定改变到工作空间,无法处理合并冲突,这是个严重的限制。现在不会了!我们把合并融入了未搁置操作,它用起来就像在产品的任意地方进行合并一样。' z$ b% r3 Z# W
3 S0 U' w8 I! A' ~. T1 n
这篇博文写得已经很长了,所以我也不再发这一点的截屏了。在这个场景中新版功能如下,合并被执行了,冲突也被提交了等等。所有周边的UI与合并发生的其他场景中(像合并与获得)一样。
7 O$ f$ t  @  J  O4 s
: N5 X- j& {9 c0 w呵呵!已经说得很多了,但其实我还有很多想讲的,我会在这个系列中继续写博文的。
8 L$ T+ [; V" B* O
( _; N4 `; @- x% ?. o) ]原文发表地址 Merge enhancements in TFS 11
; [( O: ?! z! o, Q8 o
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

SCMLife推荐上一条 /5 下一条

QQ|小黑屋|手机版|无图版|SCMLife.com ( 京ICP备06056490号-1 )

GMT+8, 2020-1-22 08:05 , Processed in 0.071530 second(s), 6 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

快速回复 返回顶部 返回列表