Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26279002
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: LINUX

2010-07-17 10:04:59

教程原创:http://www.bitsun.com/documents/gittutorcn.htm
一、介绍
Git 是用于 Linux 内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同, 它采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来说自然很重要。 Git 最为出色的是它的合并跟踪(merge tracing)能力。
作为开源自由原教旨主义项目,Git 没有对版本库的浏览和修改做任何的权限限制。 它只适用于 Linux / Unix 平台,没有 Windows 版本,目前也没有这样的开发计划。

二、创建一个版本库
创建一个 Git 版本库是很容易的,只要用命令 git-init-db 就可以了。
$ mkdir gittutorcn
$ cd gittutorcn
$ git-init-db

git 将会作出以下的回应

defaulting to local storage area
这样,一个空的版本库就创建好了,并在当前目录中创建一个叫 .git 的子目录。你可以用 ls -a 查看一下
,并请注意其中的三项内容:
1、一个叫 HEAD 的文件。
2、一个叫 objects 的子目录,它包含了你的项目中的所有对象,我们不必直接地了解到这些对象内容,
我们应该关心是存放在这些对象中的项目的数据。
3、一个叫 refs 的子目录,它用来保存指向对象的索引。
现在已经创建好了一个 git 版本库,但是它是空的,还不能做任何事情,下一步就是怎么向版本库植入数据了。
PS:其实这个跟SVN很像。先创建出来一个空的版本仓库出来,然后往里面丢代码。


植入内容跟踪信息:git-add

$ echo "Hello world" > hello
$ echo "Silly example" > example
我们再用 git-add 命令将这两个文件加入到版本库文件索引当中:
$ git-add hello example
git-add 实际上是个脚本命令,它是对 git 内核命令 git-update-index 的调用。因此上面的命令和下面
的命令其实是等价的:
$ git-update-index --add hello example
PS:命令进行一次了封装处理!
如果你要将某个文件从 git 的目录跟踪系统中清除出去,同样可以用git-update-index 命令。例如:
$ git-update-index --force-remove foo.c
应该建立一个清晰的概念就是,git-addgit-update-index
只是刷新了 git 的跟踪信息,hello 和 example 这两个文件中的内容并没有提交到 git 的内容跟踪范畴之内。

提交内容到版本库:git-commit

我想这个应该就是类似于SVN里面的commit命令的吧!
$ git-status  查看版本库的状态
提交的命令:
$ git-commit -m "Initial commit of gittutor reposistory"

查看当前的工作:git-diff

git-diff 命令将比较当前的工作目录和版本库数据库中的差异。 现在我们编辑一些文件来体验一下 git 的跟踪功能。
PS:这个其实跟SVN里面的是检查版本是否有更新的功能是一样的。
如果本地版本有更新如何提交?
可以再次使用组合命令 git-update-indexgit-commit 将我们的工作提交到版本库中。

$ git-update-index hello
$ git-commit -m "new day for git"
更新索引与内容。

管理分支:git-branch

下面列举一些常见的分支策略,仅供大家参考:
  • 创建一个属于自己的个人工作分支,以避免对主分支 master 造成太多的干扰, 也方便与他人交流协作。

  • 当进行高风险的工作时,创建一个试验性的分支,扔掉一个烂摊子总比收拾一个烂摊子好得多。

  • 合并别人的工作的时候,最好是创建一个临时的分支,关于如何用临时分支合并别人的工作的技巧, 将会在后面讲述。


创建分支

下面的命令将创建我自己的工作分支,名叫 robin,并且将以后的工作转移到这个分支上开展。
[创建自己的个人工作分支以避免对主分支造成太多的干扰]
$ git-branch robin
$ git-checkout robin

删除分支

要删除版本库中的某个分支,使用 git-branch -D 命令就可以了,例如:
$ git-branch -D branch-name

查看分支

运行下面的命令可以得到你当前工作目录的分支列表:
$ git-branch
如果你忘记了你现在工作在哪个分支上,运行下面的命令可以告诉你:
$ cat .git/HEAD    查看一下跟踪索引就能知道当前在哪个分支上面操作了!

查看项目的发展变化和比较差异

git-show-branch

git-diff

git-whatchanged

我们现在为 robin, master 两个分支都增加一些内容。[一个是主分支master另外一个是自己创建的分支]
$ git-checkout robin
$ echo "Work, work, workd" >> hello
$ git-commit -m "Some workd" -i hello

$ git-checkout master
$ echo "Play, play, play" >> hello
$ echo "Lots of fun" >> example

git-show-branch 命令可以使我们看到版本库中每个分支的世系发展状态,并且可以看到每次提交的内容是否已进入每个分支。
$ git-commit -m "Some fun" -i hello example
$ git-show-branch 这个命令让我们看到版本库的发展记录。

譬如我们要查看世系标号为 master^robin 的版本的差异情况,我们可以使用这样的命令:
$ git-diff master^ robin

我们现在再用 git-whatchanged 命令来看看 master 分支是怎么发展的。[我们的主分支是如何发展起来的!]
使用语法:
$ git-checkout master 对主分支锁定然后开始观察其发展情况的!
$ git-whatchanged
robin 分支中的日志为 "Some work" 的内容,并没有在 master 分支中出现。
说明:用分支来管理这个分支下面的内容更新!

合并两个分支:git-merge

既然我们为项目创建了不同的分支, 那么我们就要经常地将自己或者是别人在一个分支上的工作合并到其他的分支上去。 现在我们看看怎么将 robin 分支上的工作合并到 master 分支中。 现在转移我们当前的工作分支到 master,并且将 robin 分支上的工作合并进来。
$ git-checkout master    [先checkout第一个项目分支即主分支]
$ git-merge "Merge work in robin" HEAD robin [然后将我们的项目合并进来]
合并两个分支,还有一个更简便的方式,下面的命令和上面的命令是等价的。
$ git-checkout master
$ git-pull . robin [直接合并两个分支]
以上是典型的两路合并(2-way merge)算法,绝大多数情况下已经够用。但是还有更复杂的三路合并和
多内容树合并的情况。

逆转与恢复:git-reset

项目跟踪工具的一个重要任务之一,就是使我们能够随时逆转(Undo)和恢复(Redo)某一阶段的工作。
命令就是为这样的任务准备的。 它将当前的工作分支的 定位到以前提交的任何版本中,它有三个重置的算法选项。
PS:比如我现在需要准确定位到版本2.就能够马上定位到之前提交过任何一个版本中了!

命令形式:

git-reset [--mixed | --soft | --hard] []

命令的选项:

--mixed
仅是重置索引的位置,而不改变你的工作树中的任何东西(即,文件中的所有变化都会被保留, 也不标记他们为待提交状态),并且提示什么内容还没有被更新了。这个是默认的选项。
--soft
既不触动索引的位置,也不改变工作树中的任何内容,我们只是要求这些内容成为一份好的内容 (之后才成为真正的提交内容)。 这个选项使你可以将已经提交的东西重新逆转至“已更新但未提交(Updated but not Check in)”的状态。 就像已经执行过 git-update-index 命令,但是还没有执行 git-commit 命令一样。
--hard
将工作树中的内容和头索引都切换至指定的版本位置中,也就是说自 之后的所有的跟踪内容和工作树中的内容都会全部丢失。 因此,这个选项要慎用,除非你已经非常确定你的确不想再看到那些东西了。

一个重要技巧--逆转提交与恢复


提取版本库中的数据

这是个很有用的小技巧,如果你对你现在的工作目录下的东西已经不耐烦了, 随时可以取出你提交过的东西覆盖掉当前的文件,
$ git-checkout -f foo.c
PS:从版本库里面提取出来数据来覆盖掉当前的文件。

标定版本

在 git 中,有两种类型的标签,“轻标签”和“署名标签”。
技术上说,一个“轻标签”和一个分支没有任何区别,只不过我们将它放在了 .git/refs/tags/ 目录, 而不是 heads 目录。因此,打一个“轻标签”再简单不过了。
$ git-tag my-first-tag

合并外部工作

通常的情况下,合并其他的人的工作的情况会比合并自己的分支的情况要多, 这在 git 中是非常容易的事情,和你运行 git-merge 命令没有什么区别。 事实上,远程合并的无非就是“抓取(fetch)一个远程的版本库中的工作到一个临时的标签中”, 然后再使用 git-merge 命令。
$ git-fetch 
根据不同的远程版本库所使用的通讯协议的路径来替代上面的 remoted-repository 就可以了。
Rsync

rsync://remote.machine/patch/to/repo.git/

SSH

remote.machine:/path/to/repo.git
or
ssh://remote.machine/patch/to/repo.git/

这是可以上传和下载的双向传输协议,当然,你要有通过 ssh 协议登录远程机器的权限。 它可以找出两端的机器提交过的对象集之中相互缺少了那些对象,从而得到需要传输的最小对象集。 这是最高效地交换两个版本库之间的对象的方式(在 git 兼容的所有传输协议当中)。

下面是个取得 SSH 远程版本库的命令例子:






博主推荐一本GIT方面的好书:
29.85元 
阅读(849) | 评论(1) | 转发(0) |
0

上一篇:今日新闻20010-07-17

下一篇:linux工具之quilt

给主人留下些什么吧!~~

chinaunix网友2010-07-19 10:50:48

职业规划第一位!按职业规划发展好吧!