Git使用教程一

Git是目前使用最广泛的一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。Git用于保存代码文件,保留历史纪录,可以回到过去,多端共享,团队协作。因此Git是每个程序员必须掌握的技能。

安装git后不同于java或者adb的设置,安装JDK或者Android SDK后,如果想要在命令窗口使用java或者adb命令,需要手动设置环境变量后才可以使用,但是安装Git后会自动配置环境变量。如果是在Window平台安装的Git,可以直接在命令窗口使用git命令,当然了也可以直接使用Git Bash窗口,在Window系统上比较推荐使用Git Bash,这是安装Git后自带的命令操作方式,更重要的是Git Bash可以高亮显示每次的操作信息。

命令行参数格式

在描述命令行参数的时候,虽然不同系统略有差异,但是基本遵循约定俗成的格式,一般格式如下:

命令 <必选参数1|必选参数2> [-option {必选参数1|必选参数2|必选参数3}] [可选参数...] {(默认参数)|参数|参数}

命令格式中常用的几个符号含义如下:

中括号[]

可选参数,在命令中根据需要加以取舍。可选参数可以选择一个或者多个,部分命令行操作模式只允许选择一个参数。

$ git help
usage: git [--version] [--help] [-C <path>] [-c <name>=<value>]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
            []

上面是输入git命令后提示的可选参数,这里可选参数在使用的时候不可以组合使用,只可以选择某一个参数使用。

$ ls --help
Usage: ls [OPTION]... [FILE]...

ls命令提示的也是可选参数,但是这里可以组合使用,如:

$ ls -a .git
./   COMMIT_EDITMSG  description  HEAD    index  logs/     refs/
../  config          FETCH_HEAD   hooks/  info/  objects/

这里有“/”标记的是目录名称,其中一个点表示当前目录,两个点代表父目录,不同操作系统对目录标识有所不同,其余表示文件名称。

尖括号<>

尖括号中的参数是必选参数,如下命令中file就是必选参数,否则就无法正常执行。

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] …
$ git rm -f 0001.txt
rm '0001.txt'

竖线 |

用于分隔多个互斥参数,含义为“或”,但是使用时只能选择一个。

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] 

这里在使用git命令时,可以使用git rm -f 0001.txt或者git rm -file 0001.txt,-f与-file只能二选一。

省略号...

省略号...表示的是“等等”,表示前述元素(参数、值或信息)可以在命令行中多次重复。

git rm [] [--] ...
$ git rm -f 0001.txt 0002.txt
rm '0001.txt'
rm '0002.txt'

获取项目的Git仓库

有两种方式获取项目的Git仓库,第一种是在项目的工作目录下,通过init命令初始化一个git仓库。第二种是从已有的仓库clone一个新的镜像仓库到本地。

工作目录初始化仓库

如果要对现有某个项目进行Git管理,只需要到项目所在的目录,执行:

$ git init

初始化成功后,在当前项目目录下生成一个.git的隐藏文件夹,所有Git所需要的数据和资源都放在这个目录下。刚初始化的Git项目,仅仅是按照既有的结构框架初始化好了里边所有的文件和目录,但还没有开始跟踪管理项目中的任何一个文件。

如果当前目录下的文件想要纳入Git版本库的管理,需要先用git add命令告诉Git先对这些文件进行跟踪,然后提交。

$ git add README
$ git commit -m 'initial project version'

从现有仓库clone

如果想对某个开源项目出一份力,可以先把项目的Git仓库复制一份过来,这就需要用到git clone命令。这里注意使用的是clone而不是checkout。这是个非常重要的差别,Git 收取的是项目历史的所有数据(每一个文件的每一个版本),服务器上有的数据克隆之后本地也都有了。实际上,即便服务器的磁盘发生故障,用任何一个克隆出来的客户端都可以重建服务器上的仓库,回到当初克隆时的状态。

假设在服务器上有一个gitest的仓库,可以使用下面命令clone一份到本地。

$ git clone https://gitee.com/xxx/gitest.git

运行命令后,会在当前目录下生成一个gitest的目录,其中包含一个.git的目录。用于保存下载下来的所有版本记录,然后从中取出最新版本的文件拷贝。如果进入这个新建的gitest 目录,你会看到项目中的所有文件已经在里边了,准备好后续的开发和使用。如果希望在克隆的时候,自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字:

$ git clone https://gitee.com/xxx/gitest.git mygit

唯一的差别就是clone下来的目录名称变成了mygit目录了。

git支持多种传输协议,在github上面目前推荐的是https,所以提供的也是一个https的克隆链接,而在码云上面提供了两种克隆链接,一种是https协议的链接,另外一种是SSH协议链接,如git@gitee.com:xxx/gitest.git。两种协议各有优缺点,后续再做介绍。

Git目录

HEAD         # 这个git项目当前处在哪个分支里
config       # 项目的配置信息,git config命令会改动它
description  # 项目的描述信息
index        # 索引文件
packed-refs  # 标识项目里的每个分支提交与引用的映射表
hooks/       # 系统默认钩子脚本目录
logs/        # 各个refs的历史信息
objects/     # Git本地仓库的所有对象 (commits, trees, blobs, tags)
refs/        # 标识项目里的每个分支指向了哪个提交(commit)。
info/        # Git仓库的一些信息。

Git三大区间

Git的本地数据管理,大致分为三大区间:工作区域、暂存区域和Git仓库。

  • 工作区域(Working Directory)平时存放项目代码的地方,可以直接编辑的磁盘文件。
  • 暂存区(Stage或Index)数据暂时存放的区域,可在工作区和版本库之间进行数据的友好交流,保存即将提交的文件列表信息。使用add命令可以将工作区文件放入暂存区域,只有add之后的文件才算纳入了Git的版本控制系统。使用命令$ git
    ls-files --stage查看暂存区的文件信息。
  • Git仓库(Repository)安全存放数据的位置,这里边有提交的所有版本的数据。使用commit命令提交成功后文件便存放至了Git仓库,push的时候,就是把这个区的数据push到远程仓库了。

Git的工作流程一般是:

  1. 在工作目录中添加、修改、删除文件;
  2. 将需要进行版本管理的文件放入暂存区域;
  3. 将暂存区域的文件提交到Git仓库。

因此,Git管理的文件有三种状态:已修改(modified)、已暂存(staged)和已提交(committed),依次对应上边的每一个流程。

获取帮助

一般命令行操作都会提供一个帮助命令,如java -help、adb help,所以git也不例外,可以直接使用git help查看相关git的命令操作。

$ git help
usage: git [--version] [--help] [-C <path>] [-c <name>=<value>]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
            []
...

除了$ git help之外,还有其它三种方式。

$ git help <verb>
$ git <verb> --help
$ man git-<verb>

最后一种$ man git-<verb>需要依赖其它第三方库。

如下是查询Git操作add命令的帮助信息:

$ git add --help

当git命令执行后,会弹出一个本地网页帮助文档,文档位于Git安装目录的Git/mingw64/share/doc/git-doc/git-add.html,部分截图如下:

Git配置文件设置

Git相关的配置文件有三个,Linux系统下配置文件如下:

  1. /etc/gitconfig:包含了适用于系统所有用户和所有项目的值,文件配置级别是system。
  2. ~/.gitconfig:只适用于当前登录用户的配置,文件配置级别是global。
  3. 位于git项目目录中的.git/config:适用于特定git项目的配置,文件配置级别是local。

在Window系统中,配置文件位于:

  1. system级别配置文件gitconfig位于Git安装目录的Git/mingw64/etc文件夹下。
  2. global级别的配置文件.gitconfig文件位于当前登录用户文件夹下。
  3. local级别配置文件config同Linux一样,位于项目目录的.git/config。

对于同一个配置项,它们的优先级system > global > local,local优先级最高。

如下命令是查看系统配置项内容:

$ git config --system --list

同样的方式也可以查看当前用户(global)和当前仓库(local)的配置信息。

为了后续演示不同开发人员之间协同操作,这里配置一下local中用户相关信息。

$ git config --local user.name 'Mike'
$ git config --local user.email "mike@git.com"

查看一下.git文件夹下的config文件,内容如下:

[core]
	repositoryformatversion = 0
	filemode = false
	bare = false
	logallrefupdates = true
	symlinks = false
	ignorecase = true
[gui]
	wmstate = normal
	geometry = 1061x563+312+198 233 255
[user]
	name = Mike
	email = mike@git.com

还有一些比较常见的配置项,如修改Git默认的文本编辑器。

$ git config --global core.editor emacs

当使用commit时,Git一般要求需要对本次提交给出必要的说明信息,这些说明信息也可以使用一个模板文件配置,假如创建的模板文件位于$HOME/.gitmessage.txt,模板文件内容如下:

Bug:XXX
Description:XXXX

设置commit.template,当运行git commit时, Git会在编辑器中显示以上的内容,设置commit.template命令如下:

$ git config --global commit.template $HOME/.gitmessage.txt
注:$HOME其实就是上文介绍配置项是global级别配置文件所在的目录。

小结

本文对Git的实践操作介绍不是很多,重点介绍的一部分也仅仅是相关配置操作,有关Git更多的操作命令会在后续文章中结合具体示例再做详细介绍。在本文主要介绍了命令行参数中几个常用符号的表示意义,如尖括号<>中参数是必选的,中括号[]中参数是可选的,竖线|表示互斥参数,只能选择其中一个等等。随后又介绍了两种创建Git仓库的方式,以及.git隐藏文件中各文件或者文件夹的大致存储信息。最后又介绍了Git的三大工作区间以及Git的执行流程。

参考资料

Git使用教程

Git Community Book 中文版

评论

您确定要删除吗?删除之后不可恢复