01、Git入门指引
1、Git简史
Linux内核开源项目有着为数众广的参与者。一开始整个项目组使用BitKeeper来管理和维护代码。2005年,BitKeeper不再能免费使用,这就迫使Linux开源社区开发一套属于自己的版本控制系统。
自诞生于2005年以来,Git日臻成熟完善,它的速度飞快,极其适合管理大型项目,它还有着令人难以置信的非线性分支管理系统,可以应付各种复杂的项目开发需求。
从这里我们可以看出,大佬们的思路就是。没有合适的东西,就做一个。
2、Git、GitHub与GitLab
Git:是一个版本控制软件
GitHub与GitLab都是用于管理版本的服务端软件
GitHub提供免费服务(代码需公开)及付费服务(代码为私有)
GitLab用于在企业内部管理Git版本库,功能上类似于GitHub
3、Git文件存储
3.1、增量的文件存储

如上图,常见于SVN的版本控制,是增量式的文件存储。例如:version 1 的时候有三个文件 A、B、C,version 2相比较于version 1 只有文件A C发生了变化,则只记录相关的增量变化内容。
3.2、全量的文件存储

如上图,version 1 与 version 2相比较文件A C发生了变化,则version 2 里面存储文件A1与文件C1,这里是一个全量的文件。由于文件B没有发生变化,所以在version 2 的B文件则通过指针的形式指向version 1 中的B文件。
所以这就是git与传统的svn的存储的区别。
3.3、Git的基础
- 直接记录快照、而非差异比较
- 近乎所有的操作都在本地执行
- 时刻保持数据的完整性
- 多数操作都是添加数据的操作
- 文件的三种状态
- 已修改(modified)
- 已暂存(staged)
- 已提交(committed)
4、Git的文件状态

Git文件
被版本库管理的文件
已修改
在工作目录修改的Git文件
已暂存
对已修改的文件执行Git暂存操作,将文件存入暂存区
已提交
将已暂存的文件执行Git提交操作,将文件存入版本
未追踪
未被版本库管理的文件

我们在工作区中进行文件的编辑,编辑之后文件状态是未追踪或者已修改。通过git add 的命令操作,将文件存于暂存区。在通过git commit命令则将文件提交到版本库。
5、软件安装
登录https://git-scm.com/网站下载相关的git安装包。这里以windows操作系统为例。不同的操作系统下载不同的版本安装即可。
安装完成之后,在任意位置鼠标右键之后就会多出一个Git Bash Here,这个是Git的命令行执行入口。

如果想使用GUI工具,则可以另外下载TortoiseGit工具,该工具类似于TortoiseSVN。安装这个工具的好处就是如果文件发生了变化,则会给标注出来(需要重启计算机)。

6、Git的简单操作
右键选择【Git Bash Here】打开Git的命令行窗口,这个命令行里面可以输入linux下的命令,他会自动的给你转换成对应的Windows下的命令执行。因为他和linux下的命令窗口比较像,所以我们可以通过修改PS1变量达到修改命令提示符样式。具体需要修改的文件就是:C:\Program Files\Git\etc\profile.d\git-prompt.sh
6.1、仓库初始化:git init
我们在桌面上创建一个tmp文件夹,并进入到tmp文件夹中。我们执行git init命令。命令提示符提示
[denggh@19:29:21 tmp]$ git init Initialized empty Git repository in C:/Users/denggh/Desktop/tmp/.git/ // 在目录C:/Users/denggh/Desktop/tmp/.git/下初始化了一个空的git仓库 // 这里的命令提示符相比较上面的那条命令多出了 (master) 这个东西,这里表示当前是master的主分支 [denggh@19:29:24 tmp] (master)$ ll -a total 8 drwxr-xr-x 1 denggh 197121 0 5月 3 19:29 ./ drwxr-xr-x 1 denggh 197121 0 5月 3 19:29 ../ drwxr-xr-x 1 denggh 197121 0 5月 3 19:29 .git/
所以到这里我们知道,如果我们想初始化创建一个仓库,则可以通过命令git init来完成,git init命令会创建一个.git的文件夹,文件夹里面存放着仓库的相关信息。默认情况下这个文件夹是次隐藏的。在Linux下以点开头命名的文件夹都是隐藏的。
6.2、仓库中文件状态:git status
我们这个时候创建一个文件hi.txt,并且随便写点内容。执行 git status命令之后提示如下:
[denggh@19:38:14 tmp] (master)$ git status On branch master No commits yet Untracked files: (use "git add <file>..." to include in what will be committed) hi.txt nothing added to commit but untracked files present (use "git add" to track) // 上面的意思是说:在master分支上,还没有进行过文件提交。但是我们发现了一个没有被git追踪的文件 hi.txt 。你可以使用命令 git add 把这个文件添加到待提交列表。
6.3、文件添加到暂存区:git add
我们执行git add 命令,在执行git status查看下状态
[denggh@19:49:38 tmp] (master)$ git add . warning: LF will be replaced by CRLF in hi.txt. The file will have its original line endings in your working directory // git add . 后面的点表示所有的文件。就是把所有的文件都存到暂存区 // 这里他给出了警告,原因是在linux操作系统中,文件的换行符是LF,在windows的操作系统中文件的换行符是CRLF。 // 他说,我们把文件的换行符从CRLF替换成了LF,但是你的工作目录中的文件的换行符没有改变。 [denggh@19:49:41 tmp] (master)$ git status On branch master No commits yet Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: hi.txt // 在分支 master 上,还没有进行过commit提交,变更的等待提交的文件列表中有个新建的文件 hi.txt 可以通过使用 // git rm --cached 命令将文件的状态从暂存区转移到工作区。
6.4、文件提交到仓库:git commit
我们执行 git commit命令,在执行git status查看相关的状态说明,如果提示你Please tell me who you are.相关内容,请参考后续章节进行用户名邮箱设置。
[denggh@19:49:49 tmp] (master)$ git commit -m '第一次提交文件,添加hi.txt' [master (root-commit) 84289bf] 第一次提交文件,添加hi.txt 1 file changed, 1 insertion(+) create mode 100644 hi.txt // git commit 表示将文件的状态从暂存区提交到git仓库中。-m 表示提交的变更信息,就是改了什么 // 第2行:master 表示分支,84289bf 是一个commit id,根据SHA1生成的。他只取了前几位。后面的就是提交信息 // 第3行:1 file changed, 1 insertion(+) 就是说有一个文件发生变化,增加了一行 // 第4行:就是说在仓库中创建了一个文件 hi.txt [denggh@19:59:13 tmp] (master)$ git status On branch master nothing to commit, working tree clean // 提交完之后再执行git status 命令,他先是:在分支 master 上,没有什么好提交的,工作区很干净。
6.5、提交记录查看:git log
我们如果想查看提交的历史记录,则可以使用git log命令
[denggh@20:02:17 tmp] (master)$ git log commit 84289bfc853ac948d49d55c5022245c866098b76 Author: denggh <1073747506@qq.com> Date: Sun May 3 19:59:13 2020 +0800 第一次提交文件,添加hi.txt // 第2行:提交的commit id,这是根据SHA1生成的,注意看前7位,他和上节中的那个id一样。因为SHA1的前7位重复的概率比较小,所以一定情况下,我们可以省略只取7位表示具体的版本。 // 第3行:这次提交的作者,以及联系作者的邮箱地址 // 第4行:什么时候提交的
6.6、用户名以及邮箱的设置:git config
如果你没有设置用户名邮箱,则他会提示如下内容
[denggh@20:11:03 tmp] (master)$ git commit -m '第一次提交文件,添加hi.txt' *** Please tell me who you are. Run git config --global user.email "you@example.com" git config --global user.name "Your Name" to set your account's default identity. Omit --global to set the identity only in this repository. fatal: unable to auto-detect email address (got 'denggh@PC-DENGGONGHAI.(none)') // 这里的意思就是说,你要告诉我你是谁,目的是让别人能够知道文件是谁提交的,如何联系到这个提交的人。 // 可以通过 git config 命令设置用户名及邮箱。
在git中,我们可以使用git config 命令设置git的配置文件,git配置级别有3种:
- 仓库级别:local 优先级最高,针对某个仓库(存储到仓库的.git目录下的config文件中)
- 用户级别:global 优先级次之,针对登录电脑的某个用户(存储到用户目录下的 .gitconfig文件中)
- 系统级别:system 优先级最低,针对电脑上的所有用户(配置是写到git安装目录下的 etc/gitconfig文件中的)
[denggh@20:21:16 Desktop]$ git config --system user.email "denggh@example.com" [denggh@20:21:19 Desktop]$ git config --system user.name "denggh" [denggh@20:21:53 Desktop]$ cat "C:/Program Files/Git/etc/gitconfig" [diff "astextplain"] textconv = astextplain [filter "lfs"] clean = git-lfs clean -- %f smudge = git-lfs smudge -- %f process = git-lfs filter-process required = true [http] sslBackend = openssl sslCAInfo = C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt [core] autocrlf = true fscache = true symlinks = false editor = \"C:\\\\Program Files\\\\Notepad++\\\\notepad++.exe\" -multiInst -notabbar -nosession -noPlugin [credential] helper = manager [user] email = denggh@example.com name = denggh // 当我们执行 git config 设置system级别的属性配置时,这个配置是写到git安装目录下的 etc/gitconfig文件中的 [denggh@20:22:21 Desktop]$ git config --global user.name "denggh" [denggh@20:22:36 Desktop]$ git config --global user.email "denggh@example.com" [denggh@20:23:19 Desktop]$ cat "C:\Users\denggh\.gitconfig" [user] name = denggh email = denggh@example.com // 执行 git config 设置 global 设置用户级别的,存储到用户目录下的 .gitconfig文件中 [denggh@20:23:43 tmp] (master)$ git config --local user.email "denggh@example.com" [denggh@20:23:45 tmp] (master)$ git config --local user.name "denggh" [denggh@20:23:55 tmp] (master)$ cat .git/config [core] repositoryformatversion = 0 filemode = false bare = false logallrefupdates = true symlinks = false ignorecase = true [user] email = denggh@example.com name = denggh // 执行 git config 设置 local 设置仓库级别的配置,存储到仓库的.git目录下的config文件中
对于配置的变更,需要通过命令行去操作。不建议通过手动修改配置文件的方式,虽然在一定程度上修改配置文件也可以达到相同的效果。
7、总结

我们通过使用 git init之后,就创建了一个git仓库,该目录下除了 .git 文件之外的就是工作区,也就是我们