SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 9578|回复: 0

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

[复制链接]
发表于 2012-3-8 15:14:52 | 显示全部楼层 |阅读模式
我们在TFS 2010中收到的常见客户反馈信息,都说合并还是太复杂了,并且/或者说太有限了。我们已经在即将发布的版本中做了一些显著的改进:; _; [$ a! H$ B" e9 E6 v5 J' t  e7 a
全新的差异/合并体验0 r  W3 a$ e- ^/ F
—我们过去5年来发布的就是原始SourceSafe 差异/合并工具—大约在1994年我们还停留在One Tree 软件时创建。多年来它一直被增强,以支持全球化,Unicode等,但它本质上是同一个diff工具。不过现在不再是了,都已经过去了。我们在VS编辑器的基础上新建了一个差异/合并体验。在你说“等等,我真的很喜欢kdiff!”之前,请不用担心——这仍然是可配置的,你可以使用自己喜欢的任何工具,但是话说回来,这次真的变得更好。为什么说它更好了呢?
6 f; w8 S, j' W* Y
  • 它同时支持“内联”和“并排”模式,你可以选择自己最喜欢的模式。
  • 它有句法高亮提示(VS编辑器中支持这个)
  • 单行中的个别变更会有高亮提示
  • 当同时进行比较和合并时,你可以利用VS编辑器的强大力量,包括其中的撤销,智能感应和其他功能。
  • Diff有一个很棒的“迷你地图”。
  • 现在你可以在视图中做更多的操作了(比如历史等等。)
  • Diff使用VS中全新的临时标签功能,以免弄乱你的文件。
  • 手动选择合并方案的改进方法。
  • 打开/关闭忽略空格的互动方法。* E# M  e/ ~5 ?
这里有些屏幕截图来展示这些功能,你会注意到很多我上述列举的优点:
- o0 ^7 V6 ]& ^2 N4 q+ \临时标签中的并排差异视图(一直到右边),左边有变更高亮��示槽,同行内变更高亮提示,VS风格类/方法导航,句法上色等。没错在源代码上方文件名的文本看上去很傻,那是一个错误。
/ `' h5 o: |8 [8 C3 H/ t( E
. ?% {& ^! ?6 v1 p+ |  u6 a5 O4 V, C1 J% i: [! @
使用内部模式的相同diff:+ j+ N3 q; x1 C

! S/ Z9 A4 L; `9 a; n' ~
# ~4 e- b8 Q5 f% _
3 |' e2 @9 v2 e  N- ~以下是一些关于合并的截屏。我把你可以选择的三种视图都包含在其中了:9 V2 }' y1 q% A. T: P% Y! G2 x
5 R! y, }& j& G

, Q+ ~2 ]! G( J/ U+ q
) W! y+ X4 [# d' q
+ C- j! `6 C, F( M- a/ Z# m- ^

. `' D' h1 q6 [7 ~) |( `, l% r$ b; f2 G/ }

8 [& D& V$ [- a: b6 y7 l
8 O" b' Q0 f  _7 A3 \! F3 q. M5 s9 B2 Y3 q
: N1 _: w, i) i  `/ u$ M! w2 V
总的来说,这是一款比我们以前更好的默认差异和合并体验。4 l' x+ p$ R1 i# l5 S9 i* y5 j

4 K9 A. ^* Y5 {7 ^3 Z* }合并时最少化冲突—这大概是我们听到过的最大的关于合并的抱怨了,它的方式太麻烦了。我们花了很长时间来努力研究这个反馈,总结出首要的问题是做合并时会有太多冲突报告,而这些报告没有要求你做有意义的决定。大家希望它“处理”所有明显的合并并提请他们注意哪里他们有真正的工作要做。. E6 X2 e, [, c, s# _# Z% A- Q
5 L; x- `+ @+ X! |
为展示TFS 2010和TFS 11间的区别,我运行了一个示例场景。它很简单,而且看上去有点刻意为之,但却能显示出其中的差异。我选取了一个充满TFS源代码的文件夹,并为它加分支。然后我在两个分支中把两个方法进行了重命名,并合并了结果。结果是源代码分支中48个文件改变了,而在目标分支中有90个文件改变了。结果报告中的冲突如下:
  U8 h1 ?1 Q: T8 b. m
  • TFS 2010: 38 个冲突
  • TFS 11: 12 个冲突1 O6 A9 [& e: U0 r! s) z

9 ?0 y. x8 X, C8 U4 ?& F# q差别在于TFS 11自动解决了26个冲突,无需经过用户交互。
8 M- Q; Z) }# t; m
9 d. q9 }$ w  G4 k1 t) E! z3 r. d( `我总是听说Git是这种行为的“黄金标准”。所以,我们对Git和TFS合并行为做了一个点对点的比较,我们发现为了向Git体验看齐所必需的代码改动真的很小。所以我们比较了新版TFS和Git。我不想说这是耗费精力的测试,或者说我面面俱到,但我相信它覆盖了大部分常见情况,当你亲自体验时,如果发现我们遗漏了什么,请让我知道。
, P! Y% h7 w! }2 [- a- D
# b. P: D& L6 ^/ }( ]  F针对这个情况,我想比较不同冲突的行为。我创建了一个含有9个文件的文件夹,并进行了分支,然后安排了一个特定模式的变更,以激起冲突。以下就是变更:
2 v& [- ?; X: ?) E; q& o% X7 ~) m
File
( v# \) D; L8 ]3 K7 P- Z' J/ U
Source change! j$ R- L+ l- P  [: E3 i8 O
Destination change7 y% X6 t& G2 G% A2 e
Comment* d. A" F& C5 T" X. S1 p
file1.txt& c, H9 e. _( }) X/ ?8 ^7 A1 m, w
unchanged7 e- ]8 G6 _- G' v+ @4 x
unchanged
! v% Q. b1 u' v# m- o& d
Trivial case, nothing to merge and nothing in the destination
4 q, _9 i6 e! k- T# b
file2.txt
. g6 K; n+ u# D* d+ |
edit line 3
: L9 M' y9 w7 h' _, T
unchanged
4 b" d5 J& b) I) u
Just merge the change into the destination% E& V2 @4 t, m7 ^1 G
file3.txt
, k, S/ f/ ?8 o* l7 ]8 W8 L( K( U
unchanged
& d+ J' }. k  `& |  ^; g, P, L
edit line 31 p) }2 j5 {$ G) \. y1 q: }$ q. b
Nothing to merge over and the change in the destination should affect it! y: _$ r1 y+ ~" H5 B
file4.txt
, w! Y0 a: N" e' o4 {5 M+ _
edit line 3
, J. \" y: {. i, m# w
edit line 71 D* D3 ~9 j, t5 j; G7 f
Distinct changes in source and destination
& V2 {% a! k7 f+ J: U! a, S
file5.txt$ X3 x3 j0 A7 L
edit line 5
# W9 ^$ u3 C, {0 `% `- o
same edit line 5& v- Y+ x' b9 I) L9 A! g8 b# H
Same change in both files should merge well# B- G( m! W8 ~$ y
file6.txt
4 Z6 v- x3 ~0 p+ V1 z
edit line 55 Z% Z+ D0 ?4 \/ O" t
different edit line 5
  B! X0 I: K4 b4 J7 w% t) y
This is a conflict that will require user interaction to resolve8 C8 Q7 Y( _- M+ h2 n: l1 k
file7.txt
) s7 d; I5 h- Y4 N* w9 d
delete file: d2 ]) S9 l8 M
unchanged* i0 ?+ X6 W* p5 y, y+ m6 n
Delete the file in the source an no changes in the destination# z# t$ i# X: j
file8.txt
' y9 }. p* K7 r8 f) m  w
delete file! C1 }! D# D: m3 Y
edit line 5
/ N0 `; m+ P7 A+ O
A file delete in the source conflicting with an edit in the destination* Y- m) Q* ?& ]& p& R1 d2 d8 ^
file9.txt
* ^8 F0 R* o% @  d# v5 K8 W; i1 Q
rename file
$ ?& g. v- N, L8 r* |( q
unchanged
& s2 B4 c; W/ u3 [3 q4 i
Should not really be any conflict here3 S7 z1 t# W0 t: G' E" L) I# N
$ _, W0 o: ~4 u* }, D* n
然后我在TFS 2010,TFS 11和Git中创建了同样的场景,并查看结果。在这个场景中,我对三个产品都使用了命令行。& w6 ?  M6 t3 Z9 ?/ A/ w
; W  ^! s9 O: @/ }
以下是TFS 2010的合并输出:
7 l; T- q. N4 v; O6 l$ h. g' X" C: h' N
4 \5 w  K9 m' j5 K' ]" [/ l  m
( i" U: C# j6 [/ h
. E2 W" n; `3 z& G6 @- u注意其中列出了3个冲突,还有4个额外的合并。文件1和3无需任何兼并。以下是tf状态输出:' C6 Z& D$ K+ x# j4 {
" j! g; B" y! a, I' F3 ]

) J0 h( w, ?; Y# {: w# P
! r0 p9 ]1 P) {8 I1 N2 z3 \5 _我们可以看到有7个变化有待解决(期望的,基于我们在合并输出中看到的)
: _0 k# S+ {2 j1 ]/ s! z8 ?
% i& r: X, b$ z  W$ }5 J$ K6 {7 B以下是同样场景中Git的合并输出:
5 H; x9 C! [8 k( ~- v
# A7 U, X) ~7 N( c" ]3 K# r- B  {, ?
; Z" q; |% J" i  H5 R7 m1 f: Q8 G( ^7 ?% q+ \
以下是状态输出:
9 D* w# ~2 v: \1 k/ T' U/ W5 ~& R) g* Q1 t; m
9 I+ G* }- u( j, O- X
& Y$ _( \) K# V4 t% t+ j  a
首先要注意的是Git只显示了2个冲突—文件4被自动解决,而在TFS 2010中并没有。我还注意到文件5完全没有显示(记得那是源代码和目标中发生相同变化的地方)。除此之外,合并/冲突结果是相同的。我还注意到TFS合并输出的外形不易于阅读,Git中的着色代码更好,而且还在状态输出中包含了冲突信息,这也很不错。
. ?! U* V: X! m' C8 X" `7 u1 V, J+ f
然后我在TFS 11中运行了同样的场景:' _+ Z6 L' U6 H2 E4 x

, N8 s9 k1 X. K* J! B; W/ q" K" y; [  {
! n8 t/ }' v; d6 l
: |" |! X& q! d

* _  S/ J  q6 a+ k  J# |- k现在冲突的数量和Git相同。我们在显示文件5.txt上还是存在差别的,因为我们在合并上做的借记/贷记逻辑需要待决定定的变化来辨认合并已经发生。我要更留心地看看它。输出是相同的,我也和团队说了要在这里做一些改进,以提高可读性,减少冗长。
; {1 E  ]+ n* x) f$ V0 s
# i) x' J+ c3 S: y9 x0 ]! h0 j( v当我在做与Git的比较时,我很惊讶的发现我们在2010中解决的冲突种类数量没想象的那么高。不过,还没把频繁度算进去(所以我才先做了一个重命名。)我们没有处理的一个类型正好是最常见的,所以对开发者来说小小的变化就会产生很大的影响。
' P( ^6 h  g8 h0 R' }) y( V' P- ], D
UI中无基合并—还有一个大家一直都很希望解决的就是希望能在UI中实行无基合并。我们在命令行中支持这个,当我也很多次在Power Tools的博文中说到过回滚这个问题,对很多人来说,不在UI中就等于不在产品中。现在UI中也有了。当你从源代码控制管理器中启动合并时,会有一个浏览器按钮,你能通过它来找到分支以完成无基合并。( k- h* O7 a, |# Y

# Q2 W6 Z$ N  h# ]我们来看一个例子。我从这样的分支结构着手:
. E! n. c8 A" G/ P5 T3 C' Y  j: [1 U  ?) k4 \9 D1 H
5 [# \# g0 y% F( C7 }& p" Y& \

; `$ B- y3 W- D: d6 i+ K- W8 f0 f你会发现在destination和AlternateDestination间没有合并关系。但让我们来想象一下我在destination中有一些改变,我想在AlternateDestination中有相同的改变,但我又不想通过Source来实现。我希望从destination到AlternateDestination做无基合并。我现在就可以转到源代码控制管理器,开始标准合并体验了。
: `+ Y+ _( V8 ~9 M5 d+ d: o! w% C8 E. a  z9 d8 b
7 {  P0 E5 r, A; x1 m' V3 l

7 j. d0 t* [, z- u2 `一如往常,在列表中只有Source,这是唯一和destination相关的分支。然而,和TFS不同,现在有了一个浏览……按钮,达成无基合并。如果你点击它,你会得到:
! O  }6 j/ M* C, g
. w' A& Z( X5 a. t5 x, B% |& f5 b
& A& v% V+ r4 J% }, R6 L! g( J. T$ q! W/ T! V
在这里你可以看到我可以选择AlternateDestination。如果我选中,并点击确定,我就会回到向导:- P' h& j, d# N+ W. M
2 k& j; V! P! d. l
. V- ^$ [. _) u
& Q% y! d& ]8 V7 F( b+ |
而且它警高我,我正在做无基合并,但是我可以点击下一步,然后完成并继续进行。所以,你现在可以在UI界面中做无基合并了。
3 L2 L8 z7 U  S& E+ B; I/ V2 R9 Z( E' s
未搁置上兼并—从一开始人们就喜欢搁置,把它看做是打包变化并将其放在一边的一个简单干净的方法。然而,我们经常听到抱怨无法搁置待定改变到工作空间,无法处理合并冲突,这是个严重的限制。现在不会了!我们把合并融入了未搁置操作,它用起来就像在产品的任意地方进行合并一样。
' ]9 B: Y' B) W( M6 f( ]( ?( {
9 k' f- l( H: o4 |- P5 _2 {# l这篇博文写得已经很长了,所以我也不再发这一点的截屏了。在这个场景中新版功能如下,合并被执行了,冲突也被提交了等等。所有周边的UI与合并发生的其他场景中(像合并与获得)一样。
2 T$ G* D( c; a- e
8 [/ w- T& J# d5 L; G1 {4 C呵呵!已经说得很多了,但其实我还有很多想讲的,我会在这个系列中继续写博文的。
+ L/ p1 c5 }0 q' _$ M
+ E* X1 h8 F1 z. ~8 G' V, ^7 j原文发表地址 Merge enhancements in TFS 11
2 w9 Z( H* ?  E. O4 B/ s+ J
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

SCMLife推荐上一条 /5 下一条

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

GMT+8, 2020-8-4 19:42 , Processed in 0.111572 second(s), 7 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

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