您的位置:首页 > 其它

Git学习笔记(一) 本地Git

2016-08-31 10:00 176 查看

要点

初次使用

新建一个本地仓库

向本地仓库提交(commit)文件

管理本地日志

比较版本之间的差异

初次使用

如果你是初次使用git,就要把自己的用户名和邮箱告诉git,git据此区分提交代码的作者。

$ git config --global user.name "Wen Ke"
$ git config --global user.email "306674698@qq.com"


查看用户名和邮箱

$ git config --global user.name
$ git config --global user.email


新建本地仓库

$ git init Foo


该命令在当前目录创建一个名为Foo的本地仓库。本地仓库是一个名为Foo的“空目录”,只包含一个名为
.git
的隐藏目录。项目变化的轨迹就存在这个隐藏目录里。请勿修改
.git
目录下的任何东西。

如果你安装了TortoiseGit等GUI工具,一般会提供右键菜单来新建空仓库,效果和上述命令一样。在之后的git博客中,就不再详细叙述GUI工具的用法,以免混淆。

提交文件

Git会为工作目录维护一个索引。没有你的指令,git不会更改索引。要想提交新文件,首先要把文件添加到本地索引中。



添加文件

$ git add foo.cpp
$ git status


这两个命令可以把foo.cpp添加到索引中,并查看目前为止索引的改动。如果要递归添加某个目录及其子文件/目录,则使用

$ git add -A foo


这会把foo目录下的所有内容添加到索引。

提交更改

$ git commit --message 'Foo.cpp added'


这个命令提交一个新版本,提交日志为“Foo.cpp added”。

管理日志

一个git仓库的日志有两种作用,一是提醒自己都干过什么,二是说明别人干过什么、为什么这么干。通过
git log
命令可以查看历史记录。

提交日志的质量对于个人和团队的开发效率有着至关重要的影响:试想,如果你一个月才commit一次代码,commit信息就写了一句“修复一些bug”,那么你的团队只有重读一遍代码才能理解你的工作(你自己也一样,你根本不可能记住一个月的代码);这是很严重的内耗,会让你进入裁员名单的。

如何书写有效的日志

小规模commit:每次commit的规模要尽量小,小到一个bug、一个功能点、一个性能调优,等等。这么做的好处就是,你能在日志里作出清晰的描述,形成可追溯的、逻辑性强的日志;而不是一堆不相关内容的杂糅,或一句不耐烦的敷衍。

抓住重点、简明扼要:最重要的是你本次工作的目标。如果篇幅允许,还可以简要地写出本次implementation采用的手段。

必要的时候“修改历史”:和大多数版本管理系统不同的是,git支持修改历史!一种很常见的情况就是:当你所实现的功能趋于稳定,不再出现bug的时候,你是否想把你为了改bug而做的commit合并起来呢?本章就不介绍合并commit的具体方法了,只是告诉读者git有这么个功能,不要忘了去用。

比较版本差异

你可以查看任何两次提交(commit)、任何两个分支(branch)或任何两个标记(tag)之间的差异(diff)。试想:当你刚pull下来的项目出现了以前没有过的bug的时候,首先要找到项目哪里被改动了。这时就需要用到diff工具。

本人推荐使用TortoiseGit的diff右键菜单,直观易懂。但考虑到类unix平台缺乏GUI工具,这里还是重点介绍git diff命令怎么用。

$ git diff master~1 master README.md


这个示例命令的作用是比较README.md文件在master分支的最新版本和上一版本之间的差异。参数
master~1
master
叫做引用(refs)。引用的概念稍后就讲。

重要:怎么读diff?

严格地说,git diff使用的是“合并格式差异”(The Unified Format Diff)的变体。推荐阮一峰的博客读懂diff,里面详尽地讲述了各种diff。

diff的输出很长,请诸位读者务必亲自试一下diff命令,才能明白我在说什么。我在这里一条一条地给大家剖析git diff的输出,供大家对照。

1) 虚拟diff命令

diff --git a/README.md b/README.md


虚拟diff命令是git diff内部的事情,不用管。

2) 索引改变

index 0000000..4cc149f


这些SHA-1码不是版本ID,而是git内部数据结构的ID。因此这条输出完全可以忽略。

3) 虚拟目录

--- a/README.md
+++ b/README.md


三个减号代表源版本(master~1),三个加号代表目标版本(master)。

4) 偏移量

git diff将每块差异显示成一个差异小结(diff summary)。一对文件可能有多个差异小结。每个差异小结的开头是一个形如

@@ -x,y +z,w @@


的标记。其中,x是源文件的起始行号,y是从x行开始的行数;z是目标文件的起始行号,w是从第z行开始的行数。整条命令的意思是,在源文件的第x行开始的y行和目标文件第z行开始的w行构成了一个差异小结

5) 正文

每行前面的加号代表只出现在目标文件里的行,减号代表只出现在源文件里的行,空格代表共同的行。

git diff
还可以比较好多东西,这里不一一介绍,请大家自行摸索。

发散思考:在unix下比较两个文本文件,用什么?

答:最基本的diff工具就是diff命令了。当然也可以用vimdiff(或vim -d),以diff模式打开vim,效果和GUI相仿。

如何引用一个版本

引用(refs)是用来指代一次commit的符号。常见的ref有

*
branch_name
,指的是名为branch_name的分支的最新版本。

*
HEAD
,指的是当前分支的最新版本。

*
branch_name~x
,指的是前x个版本(从最新版本起)。

* 用版本的SHA-1码作ref。SHA-1很长,一般取前7位。

还有很多refs种类,以后会慢慢遇到的。

后记

学习一套工具,最直接的办法就是查看官方文档。git的官方文档可以通过
git [command] --help
来获得。比如,你想知道
git commit
的用法,就可以

$ git commit --help


参考

Mike, M. (2015). Git In Practice. New York: Manning.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  git