本文概述
一、Git仓库和创建Git仓库
在上一篇文章中,我们介绍了Git开发的一些基本概念,Git就是备份文件,这一个个的备份又称为版本/快照/拷贝/副本,那么Git仓库是什么呢?就是一个数据库,这个数据库保存着文件的所有版本信息——也就是版本/快照仓库。
当你使用git init或git clone命令创建仓库的时候,Git会在当前文件夹下生成一个.git的文件夹,这个文件夹保存了版本的相关信息,或者你可以把它当成是这个项目的Git仓库。
以上图片是一个onion的项目,在该文件夹下使用git init命令可以初始化一个git项目,这样你就可以开始你的Git开发了。
另一个方式是使用git clone <url>命令从远程仓库克隆一个git项目,通常远程仓库可以是github或gitee上的项目。
Github上的仓库也是git仓库,如果一个项目有多个人开发,那么每个人都有一个仓库,所以,其实Git仓库就是一个包含.git文件夹的项目,不同的项目可以有不同的仓库。而仓库里存储的就像我们保存一条记录到MySQL数据库一样——只不过Git仓库储存的每条记录是一个版本/快照。
使用Git进行日常开发就主要包括:如何操作单一的文件版本/快照(如创建、删除、修改、查看)、如何操作所有的文件所有版本的快照、以及本地仓库和远程仓库的交互。
Git项目的工作流有三种:
- 工作区(workspace):也就是我们写代码的地方,创建或更改一个文件。其中新建的文件还处于未跟踪的状态(untracked),对于一个未更改的文件,其状态为未更改状态(unmodified),已更改状态为modified。
- 暂存区(staging area):这个区域缓存已更改的文件的快照/副本,我们可以使用git add命令将工作区中modified的文件添加到暂存区。
- 本地仓库(local repository):使用git commit命令可以将暂存区缓存的快照最终提交到本地仓库。
我们使用git进行开发,其实就是对这三个区域的数据(快照/副本/版本)进行CRUD操作。
二、文件快照CRUD操作
如上图,Git的版本仓库的逻辑形式就是类似这样,最左边为初始版本,最右边为最新版本。如果你学过数据结构,那么会更容易理解,Git版本仓库就是一个有向树或有向图(directed graph),每个版本/快照就是一个节点,旧版本是新版本的父节点,一个版本节点可以有多个子版本节点:
- 每个版本节点有一个SHA-1的散列值唯一对应;
- 提交一个版本或快照就是创建一个新的节点;
- Git中一般是不建议删除版本节点的,这是保护数据安全的必要性;
- 版本节点的边为分支(branch),从一个版本开始可以有多个分支;
- 在Git中有相关命令可以修改版本节点的位置和切换分支(更改生长方向);
- Git中有一个HEAD指针,该指针指向当前的版本,默认指向最新版本。HEAD指针的意思是:表明当前处于分支X的Y版本上。
1、本地工作区文件的操作
使用git的第一个命令是git status或git status -s,这两个命令用来查看当前Git项目的文件所处的状态。
对于我们程序员,其基本操作就是创建或删除一个文件,然后修改该文件。其中:
- 新建的文件Git是追踪不了的,你需要使用git add <fileName>命令才能令这个文件被Git追踪;如果你之前已经将该文件添加进Git,那么它会被正常追踪。
- 对于新建的文件,如果你删除了它,是没有什么影响的;但是如果该文件之前已经被追踪了,删除了它,你需要把这个删除操作当做更改操作,你需要正常提交这个更改到git仓库中进行记录,可以使用git rm/add添加这个更改。
- 我们可以在Git中使用 git mv from_file to_file更改文件名,如果你手动更改文件名会额外需要其它好几个命令,建议你还是使用这个命令更改文件名。
- Git restore <file>可以放弃追踪该文件的更改。
- Git status命令可以查看当前文件的状态,其中这个命令会有一些提示,例如告诉你如何将新快照添加到暂存区,或者放弃当前的更改。
- Git diff可以查看文件更改了哪些内容。
- Git使用一个.gitignore文件记录不追踪的文件,一些常用的可以参考这个github项目: HYPERLINK "https://github.com/github/gitignore" https://github.com/github/gitignore。
- Git checkout可以恢复暂存区文件到工作区。
2、暂存区中的操作
暂存区中的快照是被git暂时缓存,还没被真正提交到仓库中,对暂存区中的数据操作命令通常需要使用选项--cached/--staged。
- 使用git add <file>将一个文件新的快照添加到暂存区中;
- 使用git restore –staged <file>放弃该文件暂存区快照。
- Git diff –-cached可以查看暂存区中的快照和仓库中的快照的差异。
3、仓库中的操作
(1)使用git commit -m “message”可以提交暂存区中的快照到仓库中;
(2)git -amend可以将暂存区中的快照提交到仓库中,但不增加新的版本节点。
(3)git log --oneline –graph可以查看仓库的版本的详细历史。
4、版本/快照节点
(1)使用git log或git reflog查看版本的历史记录或版本的提交ID。
(2)git reset –hard <commit_id>用于将当前整个项目强制恢复到某个版本(也就是控制HEAD指针位置移动)。
(3)git reset –hard <commit_id> <file>用于将单个文件强制恢复为某个版本。
(4)移动HEAD的时候,若当前已经做了一些工作,可以使用git stash缓存当前工作空间,后面再使用git stash pop恢复工作空间。
三、Git给提交打标签
(1)Git tag命令用户查看当前仓库中的所有标签。
(2)git show <tag_name>可以详细查看某个标签。
(3)git tag < tag_name >用于创建一个轻量标签,默认打在当前HEAD指针指向的版本节点上。
(4)git tag -a v1.4 -m "my version 1.4"用于创建一个附注标签,它比轻量标签带有更相信的信息。
(5)git tag -a v1.2 9fceb02,给某个版本节点打标签。
打标签一般是标注某个重要的版本,而这个标签名一般就是我们常见的版本号。
四、远程仓库
常用的免费远程仓库有Github和国内的Gitee,或者你也可以自己搭建一个共享的Git仓库。使用远程仓库的第一步一般是要创建一个SSH Key,生成的命令如下:
$ ssh-keygen -t rsa -C "youremail@example.com"
然后一路回车即可,后面的步骤就是到你的Github或Gitee的账户里配置SSH Key即可。
本地仓库和远程仓库常见的内容如下:
- git remote -v命令可以查看本地配置的远程仓库,git remote show <name>查看远程仓库。
- git remote add <name> <url>,添加一个远程仓库,url是这个远程仓库的地址,name是该远程仓库的名字(常见的是origin),以后都可以使用这个name表示这个远程仓库。
- git fetch <remote> ,将远程仓库的文件获取到本地,但不做其它操作。
- git pull <remote>,将远程仓库的文件获取到本地,并进行合并。
- git push <remote> <local>,将本地的分支推送到远程。
- git push <remote> --tags,将本地的所有标签推送到远程,git中的标签是需要额外推送的。
五、总结
以上就是使用Git进行日常开发的一些基本概念,以及一些常用的命令。Git中的命令还有很多以及非常详细的说明,这里就不一一介绍了,主要是刚开始介绍的Git仓库的概念,把版本仓库看成一个版本图或树,那么用起来就很清晰了,其它就是命令的使用的问题了,也不用一一记着,不记得就去查文挡,或百度谷歌,用多了就记得了。
Good Luck!