使用 Git 管理源代码

     原链接地址:https://www.ibm.com/developerworks/cn/linux/l-git/

 在现代软件开发项目中,要成为一个有效的软件开发人员,我们必须能够与其他项目贡献者并行进行开发。源代码管理(SCM)系统不是什么新思想。为了编写一些能够更快速、简单地开发以后软件项目的软件,已经进行了很多尝试。最新的源代码解决方案都包含了版本控制系统,它可以对源代码的修改进行回滚,从而将有害的代码剔除出项目之外,或者简单地跟踪哪些人修改了代码的哪些行的内容。版本控制系统试图解决开发人员在试图同时对某个文件进行修改时所出现的冲突问题,可以防止用户覆盖其他人所作的修改。源代码管理使用的很多流行解决方案都试图解决以前
SCM 解决方案中的失效问题。

集中化的版本控制系统通常采用两种方式:

  • 有些提供了文件锁来防止多个用户的并行访问。这些系统对文件进行加锁,这样在某个时间只有一个开发人员对中心仓库具有写入权限。
  • 另外一些工具,例如 CVS,允许多个开发人员同时对相同的文件进行编辑,并提供了一些机制稍后合并这些修改。

流行的版本控制系统包括:

  • CVS
  • Subversion
  • Arch
  • Bazaar
  • BitKeeper

什么是Git?

Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper,后者之前一直是 Linux 内核开发人员在全球使用的主要源代码工具。开放源码社区中的有些人觉得 BitKeeper 的许可证并不适合开放源码社区的工作,因此 Torvalds 决定着手研究许可证更为灵活的版本控制系统。尽管最初 Git 的开发是为了辅助 Linux 内核开发的过程,但是我们已经发现在很多其他自由软件项目中也使用了 Git。例如,X.org 最近就迁移到 Git 上来了,很多 Freedesktop.org
的项目也迁移到了 Git 上。

Git 目前主要由寻找 CVS 或专有代码管理解决方案替代物的软件开发人员所使用。Git 与 CVS 有很多区别:

  • 分支更快、更容易。
  • 支持离线工作;本地提交可以稍后提交到服务器上。
  • Git 提交都是原子的,且是整个项目范围的,而不像 CVS 中一样是对每个文件的。
  • Git 中的每个工作树都包含一个具有完整项目历史的仓库。
  • 没有哪一个 Git 仓库会天生比其他仓库更重要。

安装

要安装当前版本的 Git,我们可以使用供应商在 Linux 发行版中提供的包,或者从最新的稳定快照开始手工进行编译。我建议下载包含最新 Git 源代码稳定快照的 tarball;截止到撰写本文时这个版本是 v1.4.0。我们可以在下面的参考资料 一节中找到链接。

有了这个 tarball 之后,请确保初始安装所依赖的包都已经安装了。系统中必须包含以下包,以及相应的开发头文件:

  • zlib
  • libcurl
  • libcrypto(OpenSSL)
  • rsync(2.6.0 或更高版本)

这些条件满足之后,我们就可以开始编译初始的 Git 安装系统了。这个过程对于大部分一直使用 Linux 的开发人员来说应该非常熟悉了。首先使用对应下载的包格式的命令将包展开:

$ tar -jxvf git-1.4.0.tar.bz2

$ tar -zxvf git-1.4.0.tar.gz

然后切换到适当的目录中,并执行 make 命令。(注意目录名取决于我们下载的快照的日期。)

$ cd git-1.4.0/
$ make prefix=/usr/local install
$ sudo make prefix=/usr/local install

您会被提示输入 sudo 密码才能继续安装。现在就已经准备好使用 Git 工具了。


获得最新的源代码树

在使用 Git 管理源代码仓库时,我们可以使用两种方法开始我们的工作。我们可以使用现有代码的一个本地目录,然后从中生成一个仓库;也可以映射其他人发布的仓库。

对于本文的目的来说,我们将获得 Torvalds 发布的 Git 仓库的一个镜像。下面的命令将创建一个名为 linux-2.6 的 Git 仓库。这个目录包含了一个隐藏目录 .git/ 。

$ git-clone \
 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git \
 linux-2.6

这个步骤会执行很长时间,因为 Git 正在将内核源代码(这有数百兆大)从 kernel.org 传输到本地机器上。输出结果可能有些晦涩难懂,但是如果您有一个快速的 Internet 链接,卷屏的速度应该相当快。输出结果应该类似于图 1 所示。

图一在下载内核源代码树过程中产生的输出

现在切换到包含新下载的内核的目录中:

$ cd linux-2.6

现在,我们应该在本地机器上有一个可以工作的 Linux 2.6 仓库了!此时我们就可以对这个仓库进行一些基本的操作了。

更新本地Git仓库

在使用 Git 时,我们通常可以假设自己的仓库可能比 kernel.org 的仓库有些滞后。因此我们通常都是首先将自己的仓库更新成最新的上游内核树。这个过程有时称为快速合并(fast-forward merge)。严格来说,我们现在并不需要执行这个过程,因为我们刚刚安装了自己的仓库,它应该还没有过期。但是检查一下毕竟没有坏处:

$ cd linux-2.6
$ git-pull git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
		...

如果成功,我们就应该会看到类似于下面的输出结果:

receiving file list ... done

sent 130 bytes  received 21677 bytes  14538.00 bytes/sec
total size is 127865858  speedup is 5863.52
Already up-to-date.
$>

如果我们的仓库不是最新的,就会看到有些内容通过网络传输到本地机器上了。

从仓库中导出文件

我们需要将文件从 Git 仓库(隐藏目录中的那些文件)中导出到工作目录中才能开始自己的 hack 过程。下面的命令会在当前目录中写入没有隐藏的目录,其中包含了 Linux 的源代码:

$ git-checkout

如果您希望覆盖本地修改,可以使用 -f 选项导出文件,这样就可以将您带回到一个干净的状态:

$ git-checkout -f

现在在当前工作目录中,我们应该就可以看到熟悉的 Linux 源代码目录结构了,然后我们可以对这些源代码任意进行修改。

修改现有文件

我们现在可以修改所选择的任何文件。举一个简单的例子来说,我们将修改 docs 目录中的一些内容:添加一条以后可以很容易识别的信息。为了让我的例子更容易试验,我没有选择修改源代码;不过只要您希望,欢迎继续重写整个内核的子系统。

首先,让我们在编辑器中打开一个文件:

$ vi ./Documentation/ManagementStyle

显然,我使用的是 vi;不过您当然可以使用自己喜欢的任何编辑器来完成这项工作。在编辑文件时,我在第一段前面添加了一行:“Eli shall be in charge of managing sandwich consumption. See Documentation/Sandwiches for more.”

如果您对自己所做的修改非常满意,并且觉得自己已经准备好将其作为仓库的一个永久部分了,就需要使用下面的命令导入您的修改:

$ git-commit Documentation/ManagementStyle

您会被提示说要求提供一个提交消息,它是一个用户生成的注释,用来帮助其他开发人员(也可能是您自己以后)理解刚才的实现到底进行了哪些修改。在我们的例子中,提交消息是一个描述刚才对文档所做修改的短句。

如果您希望检查一下到目前为止工作的状态,可以执行 git-log 来查看本地仓库的历史(它继承了所克隆的仓库的信息)。您的提交消息应该在日志的最上面。


添加或删除文件

但是请等一下!我们还没有添加 Documentation/Sandwiches 文件呢,因此我们需要将其添加到工作目录中,并告诉 Git 何时这个文件已经准备好了。我使用echo 命令创建了想要添加的文件,因为这只是一个简单的例子而已。同样,您也可以使用自己喜欢的工具。

$ echo "Turkey is superior" > Documentation/Sandwiches

现在我们已经添加了一个文件,接下来需要将这个文件添加到 Git 中,从而让 Git 了解这种变化,然后才能提交这个版本。我们可以通过执行下面的命令来完成这些任务:

$ git-add Documentation/Sandwiches
$ git-commit Documentation/Sandwiches

如果您添加了多个文件,可以在同一行中的 git-add 命令后面列出这些文件,不过您也不必一次将它们全部添加到仓库中去。如果要删除某个文件,并且没有git-add 之类的特殊命令;您只需要删除这个文件,然后提交就可以了。

现在应该查看一下 git-log,从而确保到现在为止所做的事情都是正确的。这一次,我们将使用 -p 选项来以单独的补丁格式查看日志。

$git-log -p


创建diff文件

最后,我们希望生成一个包含您修改后的文件和原文件之间区别的文本文件。这个文件通常是使用 diff 工具创建的,因此就称为
diff
文件。diff 可以帮助我们创建补丁文件(patch file),后者是我们向很多开放源码软件项目发送代码提交时通常使用的方法。有关 diff 的更多内容,请参看下面参考资料 部分中有关 Kernel.org 的链接。


Git还可以干什么

我们可以使用 Git 来管理本地仓库,而不用镜像其他人的工作。例如,如果我们喜欢使用 Git 来管理自己个人对某个开放源码项目贡献的文件,就可以从项目快照中生成一个 Git 仓库。

假设我们已经有了一个名为 release.tar.gz 的标准 release tarball,可以执行下面的命令来创建一个本地的 Git 仓库:

$ tar -zxvf release.tar.gz
$ cd release
$ git init-db

我们可以看到消息说 Git 是 “默认于本地存储区域的”。这些消息都是正常的,说明我们有一个 Git 仓库。

现在我们已经对工作目录进行了初始化,接下来在项目目录中应该会看到一个新目录 .git。为了告诉 Git 我们希望对这个项目中的每个文件都进行跟踪,请执行下面的命令:

$ git add .

最后,使用下面的命令将所监视的文件提交到仓库中:

$ git commit -a

同样,系统会提示我们输入提交消息。从现在开始,我们就可以在自己的 Git 仓库中使用 Git 所提供的完整功能了,例如对实验特性进行分支,为了追踪回归测试问题而将代码一分为二,并使用常见的版本历史功能。

有关 Git 的分支管理和其他有趣特性的更多信息,请参看 Kernel.org 上给出的 Git 的优秀教程(参见 参考资料 中的链接)。


结束语

现在我们已经知道如何使用 Git 来获取 Linux 内核源代码和其他 Git 管理的项目了,接下来可以选择使用 Git 来管理下一个开发项目。 Git 仍然相对较新,仍然处于不断开发中。其他脚本和工具正在实现用来简化 Git 的使用;请参看参考资料 中给出的例子。

参考资料

学习

获得产品和技术

  • 下载 Git 源代码。
  • QGit 是一个基于 QT 的 Git GUI。
  • 订购免费的 SEK for Linux,这有两张 DVD,包括最新的 IBM for Linux 的试用软件,包括 DB2、Lotus、Rational、Tivoli 和 WebSphere。
  • 在您的下一个开发项目中采用 IBM 试用软件,这可以从 developerWorks 上直接下载。

讨论

关于作者

Eli Dow 是位于纽约 Poughkeepsie 的 IBM Linux Test and Integration Center 的软件工程师。他取得了 Clarkson 大学计算机科学与心理学的学士学位和计算机科学硕士学位。他的兴趣包括 GNOME 桌面、人机交互和 Linux 系统编程。他是 IBM 红皮书Linux for IBM System z9 and IBM zSeries 的作者之一。

时间: 2024-08-02 20:32:33

使用 Git 管理源代码的相关文章

基于git的源代码管理模型——git flow

说明: 本文以nvie的"a successful git branching model"为蓝本,结合我个人理解写成.如有谬误,还请各位指出.多谢! Note: This article is highly based on nvie's a successful git branching model. Thanks nvie. Git Flow 是什么 Git Flow是构建在Git之上的一个组织软件开发活动的模型,是在Git之上构建的一项软件开发最佳实践.Git Flow是一套

《DevOps实战:VMware管理员运维方法、工具及最佳实践》——3.4 管理源代码

3.4 管理源代码 源代码管理(SCM,Source Code Management)是DevOps环境中必不可少的元素.想象一下:如果你要把基础设施转换为代码,重要的是有一种回顾任何更改.在新更改引入问题(例如,在最好的情况下是定期出现不稳定的情况,在最糟糕的情况下引起停机)时回到文件不同版本的手段.有些人可能认为"容易"的方法是建立文件的多个拷贝,每个都使用唯一的名称(Vagrantf?ile1.Vagrantf?ile2.Vagrantf?ile01012015等),但是接着当你

【git学习】git管理本地项目

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景        最近打算使用git管理本地的项目,网上的资料很多,但是很杂,这这整理一下. 2.git使用 (1)初始化 新建一个git文件夹,cd进去,建立代码仓库 git init            进入该文件夹,将文件显示隐藏可见,里面会生成.git文件,如下图 将需要被管理的项目放到这个git文件夹下,或者从服务器clone需要的项目.我将testDraft放了进去 这时候输入以下命令,查

git管理冲突解决方案…………

问题描述 git管理冲突解决方案---- 如果你注意到了我的提问,说明你已经是git管理高手,或者你曾经也遇到过这样的问题: git管理下的项目merge之后冲突,显示包内容方式打开.xocdeproj文件手动解决有<<<<<< 标示的冲突问题后,还是打不开,终端显示也还是打不开,接下来我怎么是好?求解决方案! 解决方案 用编辑器打开.xocdeproj看看有什么不对的地方呢 解决方案二: 用记事本,打开xocdeproj文件,手工修改<<<<&

《Puppet实战手册》——1.4 利用Git管理配置清单

1.4 利用Git管理配置清单 把Puppet配置清单存放在版本控制系统Git或Subversion中管理(推荐Git),所有Puppet管理的机器都从仓库取出配置,这是一个非常好的想法.它有以下几个优点. 可以取消对配置清单的更改并回滚至以前任意一个版本. 可以使用新的分支(branch)来测试新功能. 如果有多人需要修改配置清单,可以分别独立在自己的工作副本上进行,然后再合并所有的修改. 可以使用git log功能查看谁在什么时候做了什么修改. 准备工作 本节将导入现有的清单文件到Git仓库

【git学习三】git基础之git管理远程仓库

1.背景                git管理远程仓库,本文以github为例. 2.管理远程仓库                 1.本地ssh认证,在github建立一个repo叫做ospaf-GetWordFre            2.添加远程仓库,可以用git remote 命令实现,o是仓库名,可以用git remote -v查看 git remote add o git://github.com/jimenbian/ospaf-GetWordFre.git      3.接着

slab内存管理源代码分析

学习计算机原理,最好是实践或看高手写的源代码,在一定程度上就不再会感到原理的抽象.关于slab一些原理资料,可以在这里下载或到网站有更多的信息和资料.Slab内存管理机制已被广泛使用,要找到使用slab管理内存的开源代码也不难,如一些OS内核中的内存管理.既然要分析理解slab,最好还是选择复杂度和代码量都不要太大的,在这里我选取了glib-2.12.9的gslice.c实现的slab机制相关代码作为分析对象.注意Glib库是针对用户级的而非OS内核级别的. gslice.c中实现了三种内存分配

Git系列(七):使用Git管理二进制大对象

通过这系列的前六篇文章,我们已经学会使用 Git 来对文本文件进行版本控制的管理.我们不禁要问,还有二进制文件呢,也可进行进行版本控制吗?答案是肯定的,Git 已经有了可以处理像多媒体文件这样的二进制大对象块(blob)的扩展.因此,今天我们会学习使用 Git 来管理所谓的二进制资产. 似乎大家都认可的事就是 Git 对于大的二进制对象文件支持得不好.要记住,二进制大对象与大文本文件是不同的.虽然 Git 对大型的文本文件版本控制毫无问题,但是对于不透明的二进制文件起不了多大作用,只能把它当作一

优秀的GIT管理工具SourceTree下载

SourceTree是一个比较优秀的Git代码管理工具,能够替代大部分的命令行工作,在合并代码,查看diff的时候都非常方便,能大大提高生产效率, 基本国外的网站下载非常缓慢,大部分时候都是不可下载状态,本文主要提高SourceTree的下载加速. 2.6.3 Mac版下载地址: http://p.tb.cn/rmsportal_9573_Sourcetree_2.6.3a.zip