Chinaunix首页 | 论坛 | 博客
  • 博客访问: 179266
  • 博文数量: 13
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 832
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-16 22:43
个人简介

最近关注Python,Linux,LLVM

文章分类

全部博文(13)

文章存档

2014年(13)

分类: 项目管理

2014-04-14 09:35:56


概述

不仅在开源世界git十分流行,即使像Xcode和Visual Studio这类闭源开发工具也集成了git,足以说明其价值。其实很多公司项目中,svn工作的很好,不一定需要git,不过作为开发者,将git作为自己代码库的SCM确实很方便,不用server和network,直接在本地文件系统中走起。

本文简单分享用git在本地做SCM,自给自足,没有协作,不涉及分布式workflow,内容完全基于Linux/UNIX手册”man gittutorial”,不过没有直接翻译,而是保留多数内容结构,用自己的理解来解释这些用法和概念。

任务0

不仅是git,学习任何未知工具的第一件事就是高效的找帮助。git文档十分详尽,而查git文档又十分简单,比如查找log的用法,只需:
     $ man git-log
或:
     $ git help log
git命令都可以用上述方式查看详尽用法,而其中很多交叉引用更是长知识的重要途径。

如果首次用git,设置下尊姓大名和邮箱,看起来更正式:
     $ git config --global user.name "你的名字"
     $ git config --global user.email "你的邮箱"
     
导入一个新项目

和其他SCM工具一样,项目是通过目录树来体现:
     $ cd project
     $ git init
会有类似提示如“Initialized empty Git repository in .git/”,说明已成功建立了一个空repository,project根目录下隐藏目录”.git”维护了所有repository需要的信息。

为当前目录下所有文件建立一个snapshot:
     $ git add .
该snapshot存储在index文件中。

index文件记录了临时修改信息,如果要持久化到repository,需要commit:
     $ git commit
这时会提示用户写入修改日志。

修改项目内容

修改了三个文件(file1,file2, file3),通过git add添加到index文件中:
     $ git add file1 file2 file3

用git diff查看上面三个文件究竟改了什么:
     $ git diff --cached
“--cached”表示index中改动和最近commit比较,没有任何选项时git diff表示不在index的改动与最近commit比较。

还有一个快捷方式看在index和不在index的改动与最近commit的差异:
     $ git status

可以重复上述步骤,当需要commit时:
     $ git commit
输入修改日志,一次commit完成。

因为git commit只看index文件,而且修改的文件不会自动加入index文件,需要git add才能生效,所以还有一个快捷步骤合并这两步:
     $ git commit -a
注意这个命令不理会新加入文件,新文件还是要git add。

查看版本日志

即使是自己用得本地代码,折腾次数多了,出错难免,要吃后悔药就得借助版本日志。
查看简明版本日志:
     $ git log

查看详尽版本日志:
     $ git log -p

查看汇总版本日志:
     $ git log --stat --summary

管理branches

当自己有些想法,在当前代码上改动比较大时,明智的决定就是创建一个branch,git擅长管理多branch,代价很低,放心使用。

新建一个branch:
     $ git branch experimental

查看所有的branch:
     $ git branch
以*开头的正是当前所处的branch,一般master是项目初始的默认branch

切换到指定branch:
     $ git checkout experimental
上述命令切换到experimental,如果此时做一些项目修改,然后”git commit -a“,再切换“git checkout master”,就会发现experimental的改动完全不影响master的内容,正是我们需要的。

合并branch:
     $ git merge experimental
如果branch有冲突,就需要手工编辑,git diff查看冲突详情,解决后"git commit -a”。

删除branch:
$ git branch -d experimental
该操作会确保experimental已经合并到当前branch中。

如果觉得branch很失败,可以彻底delete:
     $ git branch -D experimental

详解版本日志

版本日志由很多commit构成,而每个commit都可以唯一标识,比如
     $ git log
     commit 9c44bf8c238300ce773d4e1c60733021cfc1821d
     Author: ...
     Date:   ...

commit后跟的40个字符就是该次commit的唯一标识,可以利用该标识显示更详细的信息:
     $ git show c82a22c39cbc32576f64f5c6b3f24b99ea8149c7
在无歧义的前提下,只需要前几个字母就搞定:
     $ git show c82a22c39

显示当前branch最近commit:
     $ git show HEAD

显示指定branch最近commit:
     $ git show experimental

显示父HEAD:
     $ git show HEAD^

显示祖父HEAD:
     $ git show HEAD^^

显示高祖HEAD:
     $ git show HEAD~4

为了使用方便,可以创建tag:
     $ git tag v3.5 c82a22c39
顾名思义,tag就是一个引用,commit标识可以出现的地方,对应tag就可以用。

后悔药,重置版本历史:
     $ git reset --hard HEAD^
回到上一次提交状态。慎用这个命令,因为会丢弃一切指定commit之后发生的操作和修改,考虑另外一个git revert。

字符串查找:
     $ git grep "comm” v3.5

git可以非常灵活的指定commit参数,详见“man gitrevisions”

下一步
熟悉上面的的用法,足以管理自己的代码库,不过最好还是继续”man gittutorial-2”,建立起object数据库和index文件的概念,然后进阶就是看用户手册和实践了。

参考:
1. Linux/UNIX手册”man gittutorial”和”man gittutorial-2”
2. Wiki简介
3. 参考书
阅读(4554) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~