我痛恨 Git 的 10 个理由(转)

 Git 是一个源代码版本控制系统,正在迅速成为开源项目的标准。它有一个强大的分布式模型,允许高级用户用分支来处理各种棘手的问题和改写历史记录。但是,要学习 Git 是需要付出更多的努力,让人不爽的命令行接口以及 Git 是如此的忽视它的使用者。

  下面是我为什么如此痛恨 Git 的 10 个理由:

  1. 复杂的信息模型

  Git 的信息模型是很复杂的,而且你必须对他们都很了解。在这个方面上你看看 Subversion:有文件、工作目录、资源库、版本、分支和标签。你需要了解的就是这些东西,实际上,分支、标签和文件你已经了解,但如果使用 Git ,你拥有更多的概念需要了解:文件、工作树、索引、本地资源库、远程资源库、远程、提交、treeishes、分支和 stash。你需要了解比 Subversion 更多得多的知识点。

  2. 让人抓狂的命令行语法

  Git 的命令行语法完全是随意的而且不一致,例如 git pull 基本上跟 git merge 和 git fetch 一样,git branch 和 git checkout 合并就变成 git checkout -b,git reset 命令的不同参数做的事情完全不一样,指定文件名后命令的语义完全不同等等。

  而最为壮观的就是 git am 命令了,据我所知,这是因为 Linus 在当年某个晚上为了解决通过电子邮件阅读补丁而使用的不同的补丁语法,特别是在邮件的标题上。

  3. 蹩脚、让人费解的文档

  说起 Git 的这个文档,我唯一想说的就是“操”。他们是为计算机科学家在写文档,而不是用户。在这里举个例子:

  git-push – Update remote refs along with associated objects

  如果是针对用户而言,应该描述为:

  git-push – Upload changes from your local repository into a remote repository

  另外一个例子:

  git-rebase – Forward-port local commits to the updated upstream head

  翻译: git-rebase – Sequentially regenerate a series of commits so they can be applied directly to the head node

  4. 信息模型的扩散

  刚才我在第一点提到的 Git 的信息模型是非常复杂的,而且还想癌细胞一样一直在扩散,当然一直在使用 Git ,就会不断的冒出各种新的概念,例如 refs, tags, the reflog, fast-forward commits, detached head state (!), remote branches, tracking, namespaces 之类的。

  5. 漏洞百出的抽象

  Git 包含太多不是抽象的抽象,在定义用户接口和实现上经常没有任何区别,这是可以理解的,对一个高级用户来说他需要了解一些功能的具体实现,以掌握各个命令的微妙之处。但大量的内部细节对初学者来说简直是噩梦。有这么一个说法,关于水暖器材和瓷器,但你必须成为一个水暖工才能知道器材如何安装在瓷器上。

  很多人对我的抱怨予以回应说:你无需使用所有的命令,你可以向 Subversion 一样来使用 Git。这是狡辩,就好比是告诉一个老奶奶说高速公路并不可怕,她可以在高速路上靠左边的快车道上以时速 20 公里爬行,一样的道理。Git 并没有提供任何有用的子集,每个命令都会连带着对其他命令的要求,很简单的动作经常需要很复杂的动作来撤销或者改进。

  下面是一个 Github 项目维护者的一些善意的建议:

  在分支和 master 上寻找合并的基准: ‘git merge-base master yourbranch’

  假设你已经提交了更改记录,从对你的提交重新基准化到合并准,然后创建一个新分支

  git rebase –onto HEAD~1 HEAD

  git checkout -b my-new-branch

  检出你的 ruggedisation 分支,然后移除提交: ‘git reset –hard HEAD~1′

  合并新的分支到 ruggedisation: ‘git merge my-new-branch’

  检出 master (‘git checkout master’), 合并新分支 (‘git merge my-new-branch’), 然后检查合并后的情况,接着移除合并 (‘git reset –hard HEAD~1′).

  提交新的分支 (‘git push origin my-new-branch’) 并记录 pull 请求

  翻译:“奶奶,在高速公路上开车很容易的。松开离合器,让转速超过 6000 转使车轮打滑,然后进入第一个弯道并上高速公路,看路牌到出口前,使用手刹漂移转向出口。

  6. 维护简单,但是提交麻烦

  Git 很强大的一点就是代码基准库的维护,你必须合并来自大量不同源的提交,非常适合大规模并行开发。但是这些都不是为大多数 Git 的用户设计的,他们只是需要编写代码,可能好几个月都在同一个分支上,对他们来说 Git 是带有 4 个手柄的双锅的咖啡机,但用户只想立即喝到咖啡。

  有趣的是,我并不认为这是 Git 在设计中做的权衡。它完全是忽视了真正的用户需求、混淆架构和接口。如果你是一个架构师,那么 Git 是很棒的。但对用户来说它很糟糕,已经有不少人在为 Git 编写一些简化的接口,例如 easygit。

  7. 不安全的版本控制

  作为一个版本控制系统而言,它必须承诺的就是:一旦代码提交到系统,那么我将保证代码的安全,你做的任何改动你都可以找回。而 Git 食言了,有很多方法可以让整个资料库完全崩溃而且不可恢复:

  git add . / … / git push -f origin master

  git push origin +master

  git rebase -i / git push

  8. 将版本控制库维护者的责任移给贡献者

  在传统的开源项目中,只需要一个人负责处理分支和合并这样复杂的操作,那就是维护者。而其他人只需要简单的更新提交、更新提交、不断的更新提交。而现在 Git 让每个用户都需要了解作为维护者才需要知道的各种操作,烦不胜烦。而维护者呢,无所事事,翘起二郎腿喝咖啡。

  9. Git 的历史是一堆谎言

  开发工作主要的产出就是源代码,一个维护良好的代码历史就对一个产品来说非常的重要,关于重新基准化有很多的争论,多数是依赖于对凌乱合并和不可读的日子的审美判断。而重新基准化为开发者提供一个“干净整洁”的却毫无用途历史记录,而实际上正确的解决方法是更好的日志输出以及对不想要的合并进行过滤。

  10. 简单任务也要诸多命令

  如果你在开发一个开源项目,你做了一些改变,然后想与其他人分享,你只需要:

  修改代码

  执行 svn commit

  如果你增加了一些新文件:

  添加文件

  svn add

  svn commit

  如果你的项目托管在 Github 类的网站中,那么你需要:

  Make some changes

  git add [not to be confused with svn add]

  git commit

  git push

  到此为止,你的更改只完成了一半,接下来你需要登录到 Github,查找你的提交,然后发布一个 “pull request” ,这样其他人才可以获取你的改动

  在现实中,Github 的维护者希望你的改动是功能方面的分支,他们会要求你这样操作:

  git checkout master [to make sure each new feature starts from the baseline]

  git checkout -b newfeature

  Make some changes

  git add [not to be confused with svn add]

  git commit

  git push

  然后登录到 Github,切换到你的新特性分支,发布 “pull request”

  为了将你的更改从你的本地目录中移到实际的项目资源库,你需要:add, commit, push, “click pull request”, pull, merge, push.

  下面是一个流程图向你展示一个典型的开发者在 Subversion 上要做的工作:

  "Bread and butter" 是与远程 SVN 资料库操作的命令和概念。

  然后我们再来看看如果你的项目托管在 Github 上会是怎样的:

  •   如果 Git 的强大之处是分支和合并,那么它的弱点就是让简单的任务变得非常复杂

我痛恨 Git 的 10 个理由(转)

时间: 2024-11-09 06:12:39

我痛恨 Git 的 10 个理由(转)的相关文章

Git 2.10.0 发布,分布式版本控制系统

Git 2.10.0 发布了,发布说明如下: UI, Workflows & Features * "git pull --rebase --verify-signature" learned to warn the user   that "--verify-signature" is a no-op when rebasing. * An upstream project can make a recommendation to shallowly cl

高校应该使用 Drupal 的10大理由

使用 Drupal 已经成为全球顶尖高校中的一种潮流,它已经被全球数以百计的院校选择并应用,无论是哈佛.斯坦福.杜克.布朗.罗格斯.剑桥.耶鲁还是其它众多知名高校,都已经选择 Drupal 作为它们理想的内容管理框架,因为它不仅能高校们现在的需求,更能够容纳关于未来的无限可能性. 简单来讲,Drupal 已经被证实它足以满足高校中对于各种网站的需求.如果你有兴趣,可以了解一下有关 Drupal 适用于高校的10大理由. (译注:因为国内外环境差异较大,本文所述的10大理由也并非完全适用于国内高校

爱上 SQLAlchemy 的 10 个理由(转)

原文:http://python.jobbole.com/82453/ 本文由 伯乐在线 - Namco 翻译,唐尤华 校稿.未经许可,禁止转载!英文出处:Paul Johnston.欢迎加入翻译组. 最近,我见到了很多针对 ORM 的抨击,但是我觉得有些批评是莫须有的.我本人就是 SQLAlchemy 的忠实拥趸.在我的项目里很多地方都用到了 SQLAlchemy,我也为 SQLAlchemy 项目贡献了一些代码.这篇文章里,我会阐述你应当爱上 SQLAlchemy 的10个理由.说实话,除了

喜爱Sahi的10个理由

使用Sahi作为web自动化测试工具一年以来,深深喜欢上了这个小巧简单却功能强大的工具.下面列举喜爱Sahi的10个理由. 工具与语言本身 1. 容易上手 个人体验,Sahi学习起来要比QTP.Selenium更简单.Sahi网站有一个长约5分钟的视频(http://sahi.co.in/static/sahi_tutorial.html)非常值得一看.看完视频,下载完Sahi,一天之内你应该就可以开发出自己的第一个Sahi脚本. 2.2. 对ExtJS支持不错 QTP能支持的对于动态ID的支持

使用消息队列的 10 个理由

We’ve been working with, building, and evangelising message queues for the last year, and it’s no secret that we think they’re awesome. We believe message queues are a vital component to any architecture or application, and here are ten reasons why:

使用FreeMarker替换JSP的10个理由

你还在使用 Java 服务器页面(俗称JSP)吗?我曾经也是,但是几年前我抛弃了它们,并且再也没有用过JSP了.JSP 是个很好的概念,但是它却剥夺了 web 开发的乐趣. 对我而言,这些都是小事,比如无法在页面模板上使用单独的文件header.jsp 和 footer.jsp,不能调用表达式语言的方法,在运行时无法合并,重新排列页面的各个部分.所以我转而使用 FreeMarker 模板.FreeMarker 已经存在一段时间了,如果你最近没有关注过 FreeMarker 的话,那这有些建议给你

【扣丁学堂】10个理由让你继续干IT

每日一课:扣丁学堂 作为iOS与Android培训领头羊的扣丁学堂,对iOS与Android的研究都是走在互联网发展的潮流最前沿,把最新最好的技术教导给学生. 在课程体系外,还有很多有趣的IT资讯分享给大家: 我曾在"正规"IT这个行当中几进几出.已经从挫折这所学校里面了解到了许多坚守下来的理由.说实话,或多或少地,上述每一条我都有做不到的地方.当你真正了解了干IT的基本理由之后,你就会知道,是IT而不是别的职业能够满足技术头脑的更多需求. 1.钱,钱,钱 对,我们努力工作就是为了赚钱

您不是专业测试人员的10个理由!

为什么测试人员在某些组织中没有得到专业治疗. 你是专业测试员吗? 如果您在空闲时间阅读与质量保证相关的文章以提高您的测试技能,那么您将成为确定为专业测试人员的小型(并且希望增长)工程师. 在镜子里寻找答案 说实话,无论我们不被视为(测试)专业人士,我们都没有优先考虑像专业测试人员那样行事. 基于我有限的经验,无论我在哪里看到测试人员认真对待他们的工作并努力提高智慧,我还看到他们如何受到尊重以及他们的工作如何受到赞赏,这归功于它为本组织带来的价值. 所以说到这一点: 您不是专业测试人员的10个主要

爱上 Java 的10 大理由,Python 弱爆了!

Java和JVM已经存在了很长一段时间了,基于这个事实,一些程序员开始将很多事情视为理所当然.今天我们就来说一说"Java之所以能够成为并将继续是软件项目领先平台"的十大理由. 1.高性能JVM Java最初的开发目的"一次编写到处运行",并由虚拟机提供运行平台.点击这里查看JVM内存模型详解.没有JVM,Java就必须遵循Ruby和Python的步伐--在痛苦中进一步提高其便携性.随着物联网的出现,一个强大的虚拟机变得越来越重要. 2.核心API 最让人喜欢的就是