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服务器—创建本地git仓库

局域网内搭建内部小型git仓库(本办法只适用于少人的小团队搭建属于自己内部的git服务器)...
  • qq_36515965
  • qq_36515965
  • 2017年08月22日 10:11
  • 198

git撤销本地修改与回退版本

1. 使用 git checkout 撤销本地修改即放弃对本地已修改但尚未提交的文件的修改,还原其到未修改前的状态。 注意: 已 add/ commit 的文件不适用个方法,应该用本文提到的第二种方...
  • Dandelion_drq
  • Dandelion_drq
  • 2016年04月27日 12:08
  • 8174

Git 本地版本控制

版本库也也是仓库,表现为一个目录或者是一个文件夹,这个文件夹里面的所有文件都可以被Git管理起来,文件修改删除也都能被Git记录下来,方便版本控制。git相关概念简介: 工作区:就是存放文件的文件夹。...
  • huangyuan_xuan
  • huangyuan_xuan
  • 2015年10月16日 00:39
  • 1637

Window系统下搭建GIT本地服务器

这是一篇在window下搭建git本地服务器的教程,带你一步步搭建出本地的git服务器。...
  • qwer971211
  • qwer971211
  • 2017年05月03日 22:17
  • 2107

Git 本地的撤销修改和删除操作

git本地的撤销修改和删除操作 第一:如果我知道要删掉那些内容的话,直接手动更改去掉那些需要的文件,然后add添加到暂存区,最后commit掉。 第二:我可以按以前的方法直接恢复到上一个版本。使用 ...
  • zch501157081
  • zch501157081
  • 2016年07月18日 10:31
  • 18509

git丢弃本地修改的所有文件(新增、删除、修改)

本地修改了许多文件,其中有些是新增的,因为开发需要这些都不要了,想要丢弃掉,可以使用如下命令:git checkout . #本地所有修改的。没有的提交的,都返回到原来的状态 git stash #把...
  • leedaning
  • leedaning
  • 2016年05月03日 15:15
  • 50354

Git-本地提交及远程提交

很倒霉,当初Github删库问题,博主中了头彩,建了两年左右的giuhub账号没鸟~,新建账号后,于是就想着写一个Git版本控制的入门使用——代码的本地提交以及远程提交至Github仓库,仅涉及一个主...
  • J_Anson
  • J_Anson
  • 2017年03月03日 01:43
  • 1031

git学习-本地版本库管理命令

以下总结的学习内容均来之廖雪峰的官方网站,感觉讲解的很清楚明了,推荐。 git status 查看当前版本库的状态: Changes not staged for commit:表示已...
  • qq_25602193
  • qq_25602193
  • 2016年10月24日 18:22
  • 585

git 用远程覆盖本地

本地有修改和提交,如何强制用远程的库更新更新。我尝试过用git pull -f,总是提示 You have not concluded your merge. (MERGE_HEAD exists)。...
  • lorkoy
  • lorkoy
  • 2015年12月25日 17:25
  • 10970

git 临时忽略本地文件

出处:http://qlqllu.iteye.com/blog/1966119文件在仓库中存在,但是不想每次修改后就提交(这样的文件一般是与本机开发环境相关的文件),可以这样操作:1. 打开.git/...
  • sheismylife
  • sheismylife
  • 2013年10月29日 15:56
  • 3973
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Git学习笔记(一) 本地Git
举报原因:
原因补充:

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