二、Git
1. Git简介
1.1 Git介绍
- 方便多人协同开发
- 方便版本控制
1.2 Git管理特点
-
Git
是分布式服务器和客户端都有版本控制能力,都能进行代码的提交,合并 -
Git
会在根目录下创建一个.git
隐藏文件夹,作为本地代码仓库
1.3 Git操作流程图
1.4 仓库区、暂存区和工作区
- 仓库区:这个就是保存各种文件版本的数据库,可以向这个数据库中拉取各个文件版本或把更新后的文件推入数据库进行记录。这是 Git 用来保存项目的元数据和对象数据库的地方,是 Git 最重要的部分,从其他计算机克隆仓库时,拷贝的就是这里的数据。已经推入到这个数据库中的文件对应的状态是** 已提交 (commited) **。
- 暂存区:这个区域用来存储对当前已修改过并且作了版本标记的文件,在同一段时间内位于暂存区尚未提交的所有文件都属于同一个当前的版本,这些标记使得对应文件被包含在下次提交的快照中。这个区域是一个文件,保存了下次将提交的文件列表信息,一般位于 Git 仓库目录中。在这个区域的文件状态是** 已暂存 (staged) **。
- 工作区:这个区域就是开发人员写代码的地方,对于已经修改并保存的文件,都会存储在这个区域,等待转移到暂存区并提交。它是对项目的某个版本独立提取出来的内容。那些从 Git 仓库的压缩数据库中提取出来的文件,就是放在这个区域所在的磁盘上供你使用或修改。在这个区域的文件状态是 **已修改 (modified) **。
1.5 Git工作三部曲
- 在工作目录修改文件;
- 将修改的文件对应的文件快照上传到暂存区。
- 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
2. 本地仓库
2.1 安装git
2.2 创建本地仓库
- 什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
所以,创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:
# 确保目录不要出现任何中文,以免出现其它问题
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
第二步,通过git init
命令把这个目录变成Git可以管理的仓库:
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git
的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。如果你没有看到.git
目录,那是因为这个目录默认是隐藏的,用ls -ah
命令就可以看见。
- 新创建的本地仓库
.git
是个空仓库
2.3 配置个人信息
- 配置用户名和密码
$ git config --global user.name "chen jing zhong"
$ git config --global user.email "chenrbc@163.com"
如果使用了 --global 选项,则该命令只需要提交一次,无论你以后在系统中执行何种操作,Git 都会使用这种配置。如果你想针对某个特定的项目使用不同的用户名称和邮箱,可以在那个项目目录下运行没有 --global 选项的命令来配置。
- 检查配置信息
$ git config --list
- 检查具体某一项配置
$ git config user.name
- 获取帮助
$ git help config
$ git help push
- 查看已暂存的文件和当前工作目录中文件的差异
$ git diff
git diff
命令可以查看当前工作目录中已修改的文件和暂存区的文件的差异(注意只是和暂存区的差异,不是和上次提交以来的差异,因此如果你把所有已经修改的文件都添加到暂存区后,git diff 将不会返回任何东西)
- 查看已暂存的文件和上一次提交后的文件的变化
$ git diff --staged 或者
$ git diff --cached
- 查看过去
$ git log
# 简化查看过去
$ git log --pretty=oneline
- 回退版本
# 会消除回退版本后的内容
$ git reset --hard commit_id
找到要回退的版本的前面的 commit_id,然后使用 git reset --hard commit_id 命令来回退到想要的版本,只需要打出 commit_id 的前几个字母即可,Git 会自动查找对应的 id
- 从过去回到现在
# 万一不小心使用了reset后找不到回退前的最新版本怎么办呢?
$ git reflog
回退以后,会发现之前的最新版本 9fd77 已经不在 git log
的目录中了,此时假如我们又想回到之前的最新的版本怎么办?首先使用 git reflog
命令来查找提交 9fd77 时的记录,再用 git reset --hard 9fd77b1
来进入到回退前的最新版本
2.5 git操作
- 查看文件状态
git status
- 红色表示新建文件或者新修改的文件,都在工作区.
- 绿色表示文件在暂存区
- 新建的
login.py
文件在工作区,需要添加到暂存区并提交到仓库区
- 将工作区文件添加到暂存区
# 添加项目中所有文件
git add .
或者
# 添加指定文件
git add login.py
- 将暂存区文件提交到仓库区
git commit -m '版本描述'
或者
# 直接从工作区提交到仓库区
git commit -am '版本描述'
- 查看历史版本
git log
或者
git reflog
注意:
- git reflog 可以查看所有分支的所有操作记录(包括commit和reset的操作),包括已经被删除的commit记录
- git log 则不能察看已经删除了的commit记录
- 回退版本
# 方案一
HEAD表示当前最新版本
HEAD^表示当前最新版本的前一个版本
HEAD^^表示当前最新版本的前两个版本,以此类推...
HEAD~1表示当前最新版本的前一个版本
HEAD~10表示当前最新版本的前10个版本,以此类推...
git reset --hard HEAD^
# 方案二 通过每个版本的版本号回退到指定版本
git reset --hard 版本号
- 撤销修改
- 只能撤销工作区、暂存区的代码,不能撤销仓库区的代码
- 撤销仓库区的代码就相当于回退版本操作
- 撤销工作区代码
git checkout 文件名
- 撤销暂存区代码
# 第一步:将暂存区代码撤销到工作区
git reset HEAD 文件名
# 第二步:撤销工作区代码
git checkout 文件名