如何使用版本控制


19

我正在localhost中用php开发一个网站,当其模块完成时,我将其上传到云中,以便我的朋友可以对其进行alpha测试。

在继续开发的过程中,我有很多文件,而且我无法跟踪编辑或更改的文件等。我听说过“版本控制”功能可以管理所有文件,但不确定其工作方式。

因此,我的问题是:在我开发网站时,是否有一种简便的方法/服务/应用程序可用于跟踪所有编辑/更改/新文件并管理文件。在完成模块后,我想将其上传到云中(我正在使用Amazon Cloud Service)。如果新文件出了点​​问题,我可能想回到旧文件。也许单击或单击两次,就可以查看自上次上传以来已编辑或更改的文件?


5
关于使用哪种版本控制系统,有很多建议,老实说,所有这些建议都比您当前的“手动”方法更好。
约翰

Answers:


28

尽管可以肯定会从此开始,但版本控制软件配置管理的一部分,它比跟踪文件更改要复杂得多。但是,请务必阅读上面链接的Wikipedia文章以及Joel Spolky的Mercurial教程

首先,按顺序选择Mercurial,GIT或Bazaar中的一种,然后将其与适用于IDE和操作系统的工具一起安装(我更喜欢Mercurial和HGE for Eclipse)。

  1. 从工作目录初始化存储库(使用Mercurial 初始化hg)。
  2. 确定要跟踪的文件和目录,而不要跟踪。一般规则是不跟踪由编译器和其他工具生成的文件。
  3. 使用命令将文件和目录添加到存储库(hg add表示Mercurial)。
  4. 告诉工具您不想跟踪的文件的模式(为Mercurial 编辑.hgignore)。
  5. 执行一次提交以跟踪原始版本(hg ci)。
  6. 在每个逻辑里程碑之后执行一次提交,即使它很小。
  7. 创建新文件时添加它们。
  8. 重复最后两个。
  9. 尽可能合理地备份您的工作目录和存储库。

将文件保存在存储库中后,您就可以知道文件或目录的任何两个版本之间的差异,或者完整项目(hg diff)的差异,可以查看更改的历史记录(hg hist),以及回滚更改(hg up -r)。

在发布代码之前标记(hg tag)存储库是一个好主意,因此有一种简单的方法可以返回到您发布的内容以进行修订或比较。

如果您要尝试不同的开发路线,请通过克隆主存储库(hg clone)在一个简单的分支中进行此操作,直到实验结束后才进行回退。就像为实验使用其他工作目录一样简单。

如果实验是针对新的升级版本,则克隆然后分支(hg branch),这样您就可以使存储库的所有副本保持更新,而一个实验不会干扰另一个。

Linus Torvalds(在他的项目中处理成千上万的文件和数百万行代码的人)在Google上发表了演讲,介绍了为什么该工具不能是CVS,SVN或周围众多免费和商业工具中的任何一种; 非常值得一看。


1
我也更喜欢Mercurial。我喜欢Netbeans中的支持,因为在进行编码时,它会向您显示自上次提交以来已更改的每一行。它还会在产品树中为新/更改/未更改的文件进行颜色编码。听起来对OP会有帮助:I lose track of which file I've edited or changed。HGE也可以这样做,我没有使用过。
JD Isaacks 2011年

1
+1用于描述该过程以及使用工具进行此过程的一部分。
Donal Fellows,

作为附带问题,是否会将.xcodeprojXcode用于iOS项目的文件视为告诉Mercurial忽略的内容,还是使文件保持同步很重要?
Kevin Yap

1
@Kevin我不了解Xcode,但是最新的IDE和工具具有用于整体项目内容(语言和库版本,代码格式规则,依赖项等)和用户首选项(我放置内容,面板的目录)的单独配置文件布局,外观,字体大小,个人签名)。如果团队同意,则前者可以包含在资源库中。不应包括后者,因为存储库中的更新会覆盖其他人的偏好,这会很快变得烦人并且适得其反。
阿帕拉2011年

1
@John:NetBeans针对它支持的每个VCS进行此操作。此时,这只是IDE的基本功能。
2011年

13

我强烈推荐Git。在此处了解更多信息:https : //lab.github.com/

如果您不喜欢Git,还有其他版本控制解决方案。您可能会签出SVN。


1
作为Git的日常用户,我想补充一点,提取基本命令非常容易和直观。而且它的支持非常强大,因此您在寻求帮助时不会迷路。我曾经使用过SVN,但对我来说并不容易,但是对很多用户来说都可以。
穆罕默德·乌斯曼

1
+1还要考虑:人们选择从svn(VCS)迁移到git(DVCS-d = Distributed),而不是从GIT迁移到SVN(通过选择)。
Michael Durrant 2012年

7

就是您吗?使用DVCS

听起来有些违反直觉,但分布式版本控制系统(Mercurial,Git,Bazaar)比集中式系统(SVN,CVS)更好。为什么?,您将其安装在计算机上并在本地运行存储库,仅此而已。在诸如svn的集中式系统上,您需要设置客户端和服务器...,然后,需要连接到服务器以存储您的更改。

使用DVCS,您可以是本地存储库,如果需要的话,可以使用bitbucket.org或github.com之类的服务。

恕我直言,Mercurial是一款更友好且功能相同的DVCS。

还有其他吗?使用DVCS!

使用DVCS与团队合作时有很多优点,与集中式系统相比,最重要的一点是没有提交竞赛,这是因为从技术上讲,每个人的存储库都是一个分支,并且当您共享自己的存储库时,更改这些分支会为您合并,您甚至不会注意到,这意味着与其拥有这样的版本历史记录,不如让人们将他们的工作沿一条直线汇入:

在此处输入图片说明

您最终会遇到类似这样的情况,每个人都只是临时提交:

在此处输入图片说明

每个人仅在版本控制时担心自己的工作(即不争先恐后地提交),而不必担心仅与提交有关的服务器连接。

祝好运


1
+1非常好的例子!您应该进行编辑以强调使用现代工具在复杂的合并树中所没有的痛苦。
2011年

5

简而言之,有许多替代方案,其中Subversion(SVN)和Git似乎最受欢迎(因此最容易在网络上找到解决方案)。

他们俩都不同。SVN更简单,但是Git不需要您以服务器开头-您可以在本地控制版本。

假设您拥有Linux,并希望开始使用Git:

  1. 安装Git
  2. 转到目录并执行命令“ git init”
  3. 了解如何添加文件,查看更改,提交文件...
  4. ...并做更多高级工作(查看日志,还原更改,忽略文件,创建分支,合并分支,创建和使用遥控器,使用子模块,使用SVN支持等)。

希望这可以帮助您开始。


1
SVN不需要服务器,但是它确实要求存储库位于与工作目录不同的目录中。通常不推荐使用SVN和CVS,而无需使用GIT和Mercurial等工具,这些工具不需要网络连接即可进行日常工作,也不需要中央存储库来进行协作和分布式软件开发。
2011年

您不认为这实际上与在localhost上创建SVN存储库服务器相同吗?您需要配置并维护中央存储库,并且在移动文件时,请确保SVN存储库仍可访问(甚至在每次将文件移动到另一台计算机时都不要考虑复制整个中央存储库)。我也不认为Subversion被弃用了(尽管我不是在谈论CVS)-它只是集中化的,在某些情况下,实施集中化是一个更好的主意。
塔德克2011年

阿巴拉拉(Apalala),一个问题:Mercurial如何处理哪个用户撰写了特定更改的信息?在Git中,您可以更改它,然后像其他人一样提交更改,从而造成混乱(有一些功能可以区分提交者和提交者,但这还不够明显)。Mercurial是否解决了与分布式版本控制相关的问题?
塔德克2011年

2
在我的理解中,这不是Mercurial和GIT的工作方式。在这些文件中,一个人负责存储库中的内容,无论是通过提交,提取还是修补程序。在分布式存储库中,如果某人具有推送特权,那么您已经全心全意地信任它们。莱纳斯·托瓦尔兹(Linus Torvalds)在这次演讲中对此做了很好的解释:youtube.com/watch?
v=4XpnKHJAok8

@Tadeck关于SVN,我经常使用它,最终我认为它与CVS无关(CVS至少具有纯ASCII存储库,并且已经成熟到永远不会破坏它们)。同样,Torvalds在我之前链接的视频中对此进行了很好的解释。无法脱机工作以及无法合并使旧的SCM工具过时。
2011年

2

正如Apalala建议的那样,我建议签出hginit。由于您不熟悉版本控制,因此可以跳过首页。那应该给您一个很好的介绍,之后,如果您有特定问题,可以在SO上发布。


0

我将反对多数意见,并建议Subversion。Subversion易于使用,可满足个人和小型团队的所有需求。这是一个成熟的产品,因此每个IDE都对此提供了良好的支持。是的,它没有Git的所有功能。(我从未使用过Mercurial,所以我不会谈论它。)但是,大多数开发人员实际上并不需要这些附加功能。

多个存储库?我敢肯定这些有一些合法用途,但我从未遇到过。

能够进行本地提交,而无需网络访问?如果您碰巧要进行几次离散更改而又无法访问存储库服务器,那真是太好了,但是老实说,这种情况多久发生一次?

Git确实使处理分支和合并变得更加容易。但是对于一个单人团队来说,这没什么大不了的。

对于Linux内核规模的东西-是的,请使用Git。对于我们其他人来说,Subversion足够好。


投票失败。SVN中没有的Git功能(例如轻量级分支和易于合并)对于小型项目和大型项目都是有帮助的,甚至是必不可少的。
Marnen Laibow-Koser

1
@ MarnenLaibow-Koser是的,那是我当时的观点,但是在专业使用Git几年之后,我必须同意您的看法。
Mike Baranczak

优秀!您将被同化。:D
Marnen Laibow-Koser '18

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.