学习和记笔记从第四章开始,前面有点冗长,暂时略过,有时间再看。
4.1 创建版本库及第一次提交
查看git版本:
git --version
首先设置Git的配置变量。这些设置会保存在用户主目录下的.gitconfig文件或etc/gitconfig文件中。
1、配置当前用户和邮件地址,这些信息将在版本库提交时用到。
git config --global user.name "ivanjz93"git config --global user.email "ivanjz93@163.com"
2、设置别名
这样可以简化子命令,例如git ci 相当于git commit。
如果有系统管理员权限,并希望注册的别名被所有用户使用:
sudo git config --system alias.st statussudo git config --system alias.ci commit
只在本用户的全局配置中添加Git别名:
git config --global alias.co checkoutgit config --global alias.br branch
3、在Git命令输出中开启颜色显示
git config --global color.ui true
4、版本库的初始化
建立一个DEMO版本库。
在当前目录下面git自动创建demo目录并完成初始化:
git init demo
或者手动创建目录并进入目录,调用初始化命令完成初始化:
mkdir democd demogit init
git init命令在工作区创建了隐藏目录.git。这个目录就是Git版本库(又叫仓库,repository)。
版本库所在目录被称为工作区。
在工作区创建一个文件:
echo "Hello." > welcome.txt
将新建的文件添加到版本库:
git add welcome.txt
执行提交操作:
git commit -m "initialized."
在提交过程中必须输入提交说明,如果未在命令行提供提交说明,Git会自动打开一个编辑器,要求在其中输入提交说明,输入完毕保存并退出后会执行提交操作。
提交后的输出:
- 第一行说明此次提交在名为master的分支上,且是该分支的第一次提交(root-commit),并显示提交ID和提交说明;
- 第二行说明此次提交修改了一个文件,包含一行的插入;
- 第三行说明此次提交创建了新文件welcome.txt。
4.2 工作区根目录下的.git目录
Git版本库位于工作区根目录下的.git目录,且仅此一处,在工作区的子目录下没有任何其他跟踪文件或目录。
作者在文中提到:“Git没有CVS和Subverion中存在的安全泄露问题”。我不理解,因为版本信息都放在.git目录中,一样可以泄露?或者是我没有理解CVS版本库、Subversion版本库的内容和Git版本库的内容有什么本质的区别。
Git提供了一条git grep命令来更好的搜索工作区的文件内容:
git grep "Hello"
当在Git工作区的某个子目录下执行操作的时候,会在工作区目录中一次向上递归查找.git目录,找到的.git目录就是工作区对象的版本库,.git所在的目录就是工作区的根目录,文件.git/index记录了工作区文件的状态(实际上是暂存区的状态)。
在非Git工作区执行git命令时会因为找不到.git目录而报错。
想要获取Git版本库的位置或工作区的根目录等信息,可以使用git rev-parse命令,假设当前目录在工作区的a/b/c目录:
- 显示版本库.git目录所在的位置:
-
git rev-parse --git-dir~/demo/.git
- 显示工作区根目录:
-
git rev-parse --show-toplevel~/demo
- 相对于工作区根目录的相对目录:
-
git rev-parse --show-prefixa/b/c/
- 从当前目录后退到工作区的根的深度:
-
git rev-parse --show-odup../../../
Git克隆可以降低因为版本库和工作区混在在一起而导致的版本库被破坏的风险。可以通过克隆操作在本机另外的磁盘/目录中建立Git克隆,并在工作区有新的提交时,手动或自动的执行向克隆版本库的推送(git push)操作。还可以实现在其他机器上建立克隆。对于使用Git做版本控制的团队,每个人都是一个备份,因此团队开发中的Git版本库更安全。
4.3 git config命令和Git配置文件
Git的配置文件有三个,分别是版本库级别的配置文件、全局配置文件和系统级配置文件。其中版本库级别的配置文件优先级最高,全局配置文件次之,系统级配置文件优先级最低。
- 版本库的配置文件是 工作区目录/.git/config,使用下面的命令可进入编辑:
-
git config -e
- 全局配置文件是~/.gitconfig,使用下面的命令编辑:
-
git config -e --global
- 系统级配置文件时/etc/gitconfig(windows系统里是/mingw32/etc/gitconfig),使用下面的命令编辑:
-
git config -e --system
Git配置文件采用的是INI文件格式,例如
[core] repositoryformatversion = 0 filemode = false bare = false logallrefupdates = true symlinks = false ignorecase = true
可使用git config命令修改和查看配置:
- 使用git config <section>.<key>可查看属性的值;
- 使用git config <section>.<key> <value>可修改属性的值;
例如
git config core.bare返回false
git config a.b something
会在.git/config文件中添加
[a] b = something
git config命令可以操作任何INI文件,例如向配置文件test.int中添加配置项:
GIT_CONFIG=test.init git config a.b.c.d "Hello World"
从test.ini中读取配置:
GIT_CONFIG=test.ini git config a.b.c.d
4.4 提交者的信息
删除全局配置信息:
git config --unset --global user.name git config --unset --global user.email
这样用户名和邮件信息被清空了。使用git config命令查看配置项,没有信息:
git config user.namegit config user.email
然后进行提交。命令中使用了--allow-empty参数,因为提交时如果没有对工作区进行修改,Git默认将不会进行提交,使用--allow-empty参数运行进行空白提交:
git commit --allow-empty -m "who does commit?"
输出结果如下:
[master 76491e8] who does commit? Committer: jiangzhiYour name and email address were configured automatically basedon your username and hostname. Please check that they are accurate.You can suppress this message by setting them explicitly: git config --global user.name "Your Name" git config --global user.email you@example.comAfter doing this, you may fix the identity used for this commit with: git commit --amend --reset-author
Git详细的告诉我们如何设置必须的配置变量。查看提交信息:
git log --pretty=fuller
在重新设置完用户名和email后可以使用下面的命令修改最近一次的提交:
git commit --amend --allow-empty --reset-author
参数--amend是对刚刚的提交进行修补,参数--reset-author的含义是将Author的ID同步修改,否则只会印象提交者(Commmit)的ID。此参数也会重置AuthorDate信息。
4.5、能够随意修改用户信息是否不安全
分布式版本控制系统中每个人都是自己版本库的主人,很难也没有必要进行身份认证。通常在团队协作时会设置一个共享版本库,向共享版本库传送新提交时会进行用户身份认证并检查授权。一旦用户通过身份认证,一般不会对提交中包含的提交者ID做进一步检查。
4.6 命令别名
命名命令别名时还可以指定参数,例如:
git config --global alias.ci "commit -s"
-s参数会在提交说明中自动添加上包含提交者姓名和邮件地址的签名标识,类似于Signed-off-by: UserName <email>。
4.7 备份本章的工作区
git clone demo demo-step-1