Git学习笔记(一) 本地Git

翻译 2016年08月31日 10:00:27

要点

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

相关文章推荐

Git学习笔记

  • 2014年11月05日 15:35
  • 22KB
  • 下载

git学习笔记(专业)

  • 2017年03月27日 08:51
  • 6.43MB
  • 下载

前端学习笔记-Git的使用

Git和Github Git是目前世界上较为领先的分布式版本管理系统(本地) Github是一个线上的项目托管平台(在线) 简单理解这两者之间的关系: Git是一个版本管理工具,如果电脑上...

GIT学习笔记

  • 2015年09月07日 09:45
  • 869KB
  • 下载

GIT学习笔记

  • 2016年09月13日 11:11
  • 1.44MB
  • 下载

Git 学习笔记(简介、安装、添加提交文件、查看状态及更改信息)

Git 学习笔记一Git简介
  • peisir
  • peisir
  • 2017年08月08日 18:40
  • 85

git自我学习笔记

  • 2017年11月10日 11:18
  • 4.47MB
  • 下载

Git学习笔记

  • 2015年11月07日 16:04
  • 29.31MB
  • 下载

Git的学习笔记(二)——提交流程与暂存区

Git与其他版本控制系统相比更先进人性化的设计之一就在于暂存区及人性化的提交流程。...

git&github;学习笔记

  • 2012年06月18日 14:33
  • 40KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Git学习笔记(一) 本地Git
举报原因:
原因补充:

(最多只允许输入30个字)