概述
不仅在开源世界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) |