Windows下Git与TortoiseGit使用教程


Windows 下 Git 与 TortoiseGit 使用教程(Github 为例) 作者:小刀 博客:blog.csdn.net/jarelzhou 微博:weibo.com/jarelzhou 邮箱:jarel.zhou@gmail.com 写在前面 为什么会有这篇文章 因为正在准备好几个比赛项目,另外也算是为了以后接项目,或者是自己的项目做一些 准备,所以版本控制系统还是很有必要的。 顺便吐槽一下百度,这两天由于种种原因,不得不切换成百度,结果各种资料查不到, 不说了,还是切换回 Google,虽然翻墙麻烦一点,但是起码可以找到需要的资料。中文的 开发资料还是相当不全面,对 Git 和 TortoiseGit 的介绍几乎就是简单地提提几个命令,看 完完全不明所以,最后还是在 Google 上面找到的英文资料,很详实。 在看了一大堆资料以及折腾了一整天之后,终于算是对 Git 有了一点浅显的理解,写这 份教程,一来是给自己备忘,二来是给现在以及以后要和我一起做项目的同仁一份参考,分 享出来,也算是对 Git 初学者的一点帮助。 为什么选择 Git 效率 很多人有一种习惯吧,什么软件都要最新的,最好的。其实吧,软件就是工具,生产力 工具,为的是提高我们的生产力。如果现有的工具已经可以满足生产力要求了,就没有必要 换了。生产效率高低应当是选择工具的第一位。 历史 开源世界的版本控制系统,经历了这么几代: 第一代,CVS,开创性的产品,至今很多古老项目仍在使用,但存在不少设计上的缺 陷。 第二代,SVN,在 CVS 基础上大幅度改进,很快就取代了 CVS 的地位,现在的项目 数量仍然非常庞大,而且 SVN 的缺陷不算多,很多商业项目似乎没有迁移到下一代版本控 制系统的打算。比如 Chrome 就是使用 SVN 的。 第三代,Hg 与 Git。说起这两个,有种既生瑜,何生亮的感脚。这两个项目几乎是同 时启动的,目标都是为 Linux kernel 提供一个开源可靠的分布式版本控制系统,同样优秀, 只不过 Git 是 Linus 亲自带队做的,于是 Git 就成了 Linux 的选择。除此之外,Eclipse 从原 本的 SVN 转移到了 Git,而 Firefox 与 Python 则使用 Hg,国内的金山软件也使用 Hg,而 Cocos2d 则是 Git,孰优孰劣,不好说。 总的来说吧,前两代由于集中式管理的缺陷,现在用的肯定会越来越少,不过老项目往 往不会轻易换。Git 胜在功能强大,分支完善,败在设计复杂,难以理解。Hg 胜在清晰易 懂,功能完善,败在不利于从 SVN 迁移,相应的社区活跃度不如 Github。 我们暂时会使用 git,也许以后也会尝试另一个。 TortoiseXXX 是什么东西 也许你已经看到了 TortoiseSVN、TortoiseGit 与 TortoiseHg 这三个项目,你也许想知 道这三个是什么东西。事实上,SVN、Git 与 Hg 都是命令行的程序,对于大多数人来说, 尤其是 Windows 平台下,难以上手,门槛较大,而这三个项目正是解决这个问题。 TortoiseXXX 会在 Windows 的右键菜单下添加绝大多数的版本控制功能,免去了命令行的 麻烦。但是说实话,右键菜单的效率和命令行的效率哪一个高,不好说,不过 TortoiseXXX 还是降低了门槛,对于初学者有很大的帮助,毕竟不是谁都能熟记那么多的命令的。 准备工作 软件安装 我指的是 Windows 下。由于 Git 从来没有官方的 windows 版(可以理解,linus 做的嘛), windows 下有两种非官方使用途径,一个是 Cygwin,另一个是 msysGit。Cygwin 比较凶残, 直接把 Gnu 工具集转移到了 windows 上,不过不推荐,cygwin 这个东西,如果不做嵌入式, 不需要交叉编译,用不着这么凶残,msysGit 就足够了,也更简单。目前是1.8.0。 TortoiseGit 同时支持两种使用 Git 的方式。它只是一个壳,实际调用的还是 Git 本身。 这两个软件安装也没有什么好说的,除了安装路径之外,其他的全部默认就 OK。 TortoiseGit 安装后,请设置好你的姓名邮箱,这将会记录到版本信息中。开始菜单找到 tortoisegit 的 settings 就可以了,不用细说吧? 密钥 Git 的身份验证不是密码,而是密钥。通常我们会有一个 Git 服务器,而我们的电脑就 是工作机,我们需要一个 RSA 密钥来确认身份。密钥分为两个:私有的和公开的,其实是 这样,公开的存放在服务器上,而私有的放在你手里,核对的时候通过一系列复杂算法就可 以匹配了。私有密钥绝对不要被其他人看到,这是一个项目中,确认每个人身份的标识。 密钥可以用命令行生成一个。不过我们有 TortoiseGit,看一下 TortoiseGit 的开始菜单, 是不是有一个叫 Puttygen 的东西?密钥这个东西有很多工具都可以生成,Puttygen 就是个 图形化的工具。使用很简单,只要运行 Puttygen,把右下角的数值改成4096(这个是最长 的)然后点击“Generate”就可以了。点击之后它会要求你随机移动鼠标,直到进度条满 为止。 生成完之后呢?千万不要关闭这个窗口!要是手贱关了,那么……再来一遍吧。你要在 passphrase 和下面的确认框输入密码,这个密码你自己写咯,不过记着哦。写好之后,点 “save private key”保存就行。 Public key 是填在服务器上的,我们以 github 为例,如果是别的代码托管网站,或者你 自己搭建,原理都一样。打开你的 Github 账户,Edit YourProfile,然后 SSH keys,然后 add,然后把 putty 生成的 public key 贴进去就行了。 Github 的那点事 Github 是开源社区目前最活跃的项目托管网站,类似的网站还有 SourceForge, bitbucket,google code 等,每个网站支持的版本控制系统不一样,主要就是 SVN、Git 与 Hg,github 仅支持 Git,其他协议需要很麻烦的插件来扩展,一般很少会用。 尽管 Git 本身是分布式的,但我们通常仍然需要一个中心的作为标准的服务器,方便协 同开发。Github 就是起到了这个作用。 通常我们这样进行协同开发:项目有几个成员,创建者在 Github 上创建项目,并把其 他人添加到项目中。项目组成员可以直接向中心库提交代码,而其他人如果想参与进来,就 需要用“fork”创建一个项目的分支副本,然后向原始项目提交合并申请,非项目组成员的 提交是需要批准才能合并的。这也是通常的开源软件的开发模式:核心成员主导方向,所有 开发人员都可以参与进来。 当然了,非开源项目就没有那么麻烦,只要项目成员向中心库提交代码就行了。 Git 工作流程 不要着急,我们在正式使用之前,需要对 Git 的基本工作流程有一个清晰的理解。 从本地库单一分支开始 Git 是分布式的,因此,服务器上的库和你本地的库其实是同等的,两边的库都是具有 完整的历史版本信息的。事实上,如果没有服务器,那么成员之间也是可以直接进行代码同 步的,只不过这样会很混乱。这一点和 SVN 与 CVS 这样的集中式系统是很不同的。 我们先研究本地的单一分支库。 文件状态 文件的两种基本状态:被追踪,和不被追踪。 原因很简单,项目中有我们需要进行控制的代码文件,也有不需要的临时文件。如果我 们新添加了一个文件,那么它默认是不被追踪的,你需要主动去添加到追踪文件中(add 操 作)。 对于被追踪的文件,有三种状态,已修改(modified),已暂存(staged),已提交(commit)。 已修改:你把原有的库中的某个文件进行了修改,此时由于文件的校验值发生了变化, Git 会检测到你做了修改。此时我们需要做暂存的操作。 已暂存:在修改之后,你可以把修改暂时写入缓冲区,在积累了几次修改足够构成一次 提交之后,再一次性提交(commit)到本地库。其实上面讲的“add”操作,完整的应该说 是什么?应该是“add files to stage”。 已提交:注意这个提交是提交到本地库,因为本地也有一套完整的代码库。 暂存的历史不会被记录,只有 commit 到库中的信息才会被记录到版本信息库中,以后 可以随时回滚查看。 可能有的时候你会觉得,中间的那个暂存区要来干嘛?很多余嘛。小项目当然完全无所 谓,但是如果项目大了,那么版本的历史信息会很复杂的。这个时候,不必要的版本过多, 也不好。暂存区就是用来防止一些不必要的 commit。 分支的作用 分支是 git 的最突出的一个地方。 其实概念很简单,看名字就知道了,不过为什么要分支? 比如一个项目,现在要同时开发 A 功能和 B 功能,怎么处理? 其实也很简单,比如有一个中心库,然后你克隆到本地,做了一些修改,commit 到版 本 A,而我呢,commit 到版本 B,然后呢?合并吗?合并的结果是什么,合并之后,如果 代码一点问题都没有,如果 A 和 B 两个功能我们不需要再回溯,那么什么都不是问题。但 是往往现实中,如果 A 突然发生了问题怎么办。 分支就要用上了:我们有一个主干分支,然后分别开一个 A 分支和 B 分支,你做你的, 我做我的,然后确认无误之后,合并到主干。那这样,如果发生问题,是不是就比原来要容 易解决多了?否则你都不知道问题出在了哪里。 流程 真正开发的时候,往往至少会有两个长期的分支(develop,master),最新的进度在 develop 中,而 master 则是稳定可靠的随时可以发布的版本。当然,develop 中的代码也 是可运行的完整代码,不能有残缺的代码。开发中会有很多临时的分支,用来开发一些新功 能,在确认无问题之后,合并到 develop 中,然后删除临时分支。Develop 中的代码不一定 是合适发布的,可能是实验性的,在 develop 中的某个版本到了比较成熟的时候,去和 master 合并。 当 master 中有 bug 了怎么办?那就新开一个 bugfix 分支,解决掉 master 的 bug,同 时再和 master 与 develop 合并(develop 一般也会存在同样的 bug 嘛),然后删除临时分支。 我们在开始工作前,先从服务器上拉去最新的版本,然后开发,然后把自己的版本合并 到服务器上去。 正式开始 建立 github 仓库 建立仓库的操作需要在网站上进行。我们通常是在服务器上建立仓库(repository),然 后克隆(clone)到本地。如果你想在本地直接建立仓库(init),那么通常是本地的单人代 码库,或者是局域网内部共享的库,或者你就是代码服务器的管理员。 Github 上建立仓库的操作很简单,打开网站,右上角右数第三个按钮就是了(看图)。 你只需要输入项目名字,以及建立“.gitignore”文件就行。这个文件其实就是我们明确指 明不需要版本跟踪的文件,上文已经提到过了。通常这个文件是我们自己写的,但是 github 已经为我们的各种常见项目提供了现成的样板,更加方便。 一般不会有什么问题,你填写完之后“create repository”就行了,我们会看到这样的 页面: 这样就创建成功了。可以看到,现在初始的库中,有一个 master 分支,并且有了一次 commit,作为初始化的操作。你也可以在本地建立仓库查看,其实是一样的。不过我们通 常不在本地建立仓库,如果你需要协同开发的话,因为你不能让服务器去克隆你电脑上的仓 库,只能是你去克隆服务器的仓库。当然了,如果你不打算用服务器的话,那是另外一回事 了。 可以看到上面有项目的三种协议的地址:http,ssh,以及 git 协议的。这三种协议各有 优缺点,都是指向同一个项目的。你还可以下载 zip 压缩包,或者用 github 的 windows 客 户端进行方便的克隆。这个客户端做的不错,不过它只能用在 github 上面,其他的代码托 管平台不能用,这个就不好了。我们还是用 msysgit+tortoisegit 的方式,对命令行熟悉的童 鞋可以考虑直接上命令行啦。又扯开去了,不说了。 克隆仓库到本地 我们用 ssh 的协议为例。ssh 的仓库地址大概是长这个样子: git@github.com:jarelzhou/testproject.git 在你想要放本地仓库的地方,右键,git clone… 据说本地仓库不建议放在 eclipse 的 workspace 中,不知为何。题外话了,这样可能会 造成项目间的混乱。 右键之后,看到这样的界面,url 中填写之前 github 提供的 ssh 地址,putty key 记得选 择之前我们创建的 private key。 然后会要你输入 passphrase,这也是之前设置好的: 创建中: 然后是这个警告窗口,这个窗口只会出现一次,以后就不会有了,这是要你核对 sshkey 的,你可以核对一下: 如果没错的话,点“Yes”就行了。过了一小会儿,会出来提示成功: 这个关掉就可以了。 此时仓库信息中已经有了原本仓库的位置了,不再需要额外的设置。 有没有看到,仓库已经克隆下来啦?被版本控制的目录会打上绿勾,如果没有的话你可 以刷新一下看看,windows 的图标缓存有 bug,而且至今没有解决,刷新如果还没有的话可 能得注销一下了。 做一些改动 我们现在来尝试给这个测试的项目添一点东西。比如添加一个 main.cpp: 保存之后看到目录变成了这个样子: 发现有一个~结尾的存档文件,不应该被跟踪的。右键文件,选择 ignore 即可。添加到 忽略列表之后,你再刷新,就可以看到,main.cpp~这个文件上的图标消失了。 而 main.cpp 这个文件是我们要添加到控制中的。右键,Tortoisegit-》add,它就从未 跟踪状态到被跟踪状态,而且是被添加到了 stage 中。 有一种说法,.gitignore 本身也应该被忽略,不过这样的话可能大家添加的文件不一致, 所以我们还是不忽略了。 这个时候,我们来 commit 一下,记录到本地版本库中。右键,commit 即可。注意, git 要求每次 commit 必须输入描述信息。 点 OK 就可以了。此时目录中所有文件又变成了绿勾的状态。 推送到服务器端 我们已经在本地做了修改,并 commit 到了本地的库。Git 不允许直接 commit 到远程库, 只允许两个库之间的同步操作,而没有 commit 的修改,是没有记录到仓库中的。现在,我 们来推送(push)到服务器端。 仍旧是强大的右键……tortoisegit 把几乎全部的操作放到了右键菜单中去。选择 push: 点 OK 就行了。然后又是一个乌龟翻跟斗的动画: 推送完了之后,关掉这个窗口就行了。 现在我们回到 github 的网站,刷新一下,看看,是不是文件被推送上去啦? 除此之外,还有 pull 操作,是从服务器端拉取最新的版本库,因为可能项目组的其他 成员已经做了修改,你需要把其他人的改动同步下来。 分支操作 我们现在只有一个分支,更合理的设置是两个常设分支,然后按需出现的临时分支。建 立分支的方法:右键,create branch,设置好这个分支是从哪个状态分叉出来的,默认是 当前的工作状态,你也可以设成其他的。切换工作分支是 checkout/switch。 在同步的时候,我们通常是每个分支单独同步的,你需要推送什么分支,就选择哪个分 支,不要推送错了。Pull 的时候,也是这样。Tortoisegit 提供了拉取/推送全部分支的选项, 不过你在做这个操作之前,必须要清楚你在做什么。 最后 写到这里,windows 下 tortoisegit 的大概操作就说完了。你可以发现,我其实并没有过 多地去描述 tortoisegit 怎么操作,我更多的是在讲,git 的设计,以及一种比较清晰的工作 流程。这种工作流程不仅仅是 tortoisegit,这在你用命令行的 git,甚至是其他的版本控制系 统,都是差不多的。工具不重要,重要的是如何去用工具提高我们的效率。写这篇文章到最 后,我也把整个的过程理了一遍,对 git 也有了更深的理解。还是写下来比较清楚。 联系方式 E-Mail: jarel.zhou@gmail.com 新浪微博: http://weibo.com/i/jarelzhou
还剩12页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

xcy2

贡献于2015-08-31

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf