Git学习笔记(一) 本地Git

来源:互联网 发布:战之海贼海贼数据 编辑:程序博客网 时间:2024/06/05 00:49

要点

  • 初次使用
  • 新建一个本地仓库
  • 向本地仓库提交(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本地仓库

添加文件

$ 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”,那么你的团队只有重读一遍代码才能理解你的工作(你自己也一样,你根本不可能记住一个月的代码);这是很严重的内耗,会让你进入裁员名单的。

如何书写有效的日志

  1. 小规模commit:每次commit的规模要尽量小,小到一个bug、一个功能点、一个性能调优,等等。这么做的好处就是,你能在日志里作出清晰的描述,形成可追溯的、逻辑性强的日志;而不是一堆不相关内容的杂糅,或一句不耐烦的敷衍。
  2. 抓住重点、简明扼要:最重要的是你本次工作的目标。如果篇幅允许,还可以简要地写出本次implementation采用的手段。
  3. 必要的时候“修改历史”:和大多数版本管理系统不同的是,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~1master叫做引用(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

参考

  1. Mike, M. (2015). Git In Practice. New York: Manning.
0 0
原创粉丝点击