目录
作者环境为云服务器下的Ubuntu环境
一、创建本地仓库
任意创建一个目录文件,进入该目录并使用 git init 命令初始化该目录文件,则该目录文件即为本地仓库
git init
初始化本地仓库后,仓库中多出一个名为 .git 的隐藏文件,该文件为Git用于跟踪管理本地仓库
二、配置本地仓库
配置本地仓库需要设置 用户名称 和 e-mail地址,使用 --global选项表示将当前机器中的所有本地仓库都使用该配置
git config [--global] user.name "zz"
git config [--global] user.email "xxxxxxxx"
查看当前配置
git config -l
删除配置,同样地使用 --global 选项表示删除所有仓库的配置
git config [--global] --unset user.name
git config [--global] --unset user.email
三、工作区、暂存区和版本库
工作区:本地仓库中与.git文件同目录下,除了.git目录外的所有地方都是工作区
暂存区:.git目录下的index文件,暂存区也叫做索引
版本库:又叫仓库,指的是整个.git文件
将工作区文件提交到暂存区
git add file1 file2 #将指定文件file1、file2提交到暂存区
git add . #将工作区的所有文件都提交到暂存区
将暂存区文件提交到版本库,-m后的内容为提交描述
git commit file1 file2 -m "xxxxx" #将文件file1、file2提交到版本库
git commit -m "xxxxx" #将暂存区的所有文件都提交到版本库
查看历史提交记录,使用--pretty=oneline选项可以精简提交记录
git log
git log --pretty=oneline
关于commit id版本号:是⼀个SHA1计算出来的一个非常大的数字,用十六进制表示
四、.git文件详解
提交文件后的.git文件会发生变化
1.index文件:暂存区
2.HEAD指针:指向分支master,master在 .git/refs/heads/master路径下
3.master文件:保存最新一次提交的版本号,该版本号是一个Commit对象
4.objects文件:是Git的对象库,存储了四种版本库对象:
Tree对象:树对象,存储的是该次文件提交时,文件所处目录中的其他文件(包括自己)
Commit对象:存储了提交对象的作者、提交描述、树对象、父提交(上一次提交的Commit对象)
Blob对象:存储的是文件的内容
Tag对象:表示一个标签或引用,通常用来标记一个特定的提交,或者给一个提交打上一个特定的标签
使用 git cat-file -p 对象 指令可以查看对象的内容
git cat-file -p xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
例如新提交文件test2.cc,查看HEAD指针,找到master文件;再查看master文件,得到新提交文件test2.cc的Commit对象;再查看文件test2.cc的Commit对象,得到Tree对象、父提交、提交作者以及提交描述等信息;再查看文件test2.cc的Tree对象,得到三个Blob对象;再查看文件test2.cc的Blob对象,得到test2.cc的文件内容
五、修改文件
Git跟踪管理的并不是文件本身,而是修改(新增文件、删除文件、修改文件)
修改工作区的文件后,其和暂存区、版本库中的文件就会存在不同
查看本地仓库状态(检测工作区文件和版本库中的文件是否有不同)
git status
查看工作区和暂存区文件的具体差异
git diff file
查看工作区和版本库文件的具体差异(省略文件名则默认查看所有所有文件的差异)
git diff HEAD -- [file]
六、版本回退
注意:版本回退都是以版本库为基准的!
1.版本回退
使用 git reset 命令进行版本回退,HEAD指的是版本号(如果省略版本号只有在使用--mixed选项时有效并且回退到上一个版本)
git reset [--soft | --mixed | --hard] [HEAD]
--soft表示只进行版本库的回退
--mixed表示进行版本库和暂存区的回退(默认不带选项则使用--mixed)
--hard表示进行版本库、暂存区和工作区的回退(谨慎使用,工作区的版本回退可能会导致数据丢失)
HEAD说明:HEAD表示当前版本、HEAD^表示上一个版本、HEAD^^表示上上一个版本……
HEAD~0表示当前版本、HEAD~1表示上一个版本、HEAD~2表示上上一个版本……
首先要使用 git log 命令查看历史提交记录,得到历史版本号再进行版本回退。版本回退之后对应的历史提交记录也会被清除。
2.如何撤销回退
使用git reflog命令查看历史的每一次提交记录,包括版本回退记录,找到对应的版本号进行回退
3.版本回退原理
因为Git中有一个HEAD指针,指向master分支中最新的commit id。当进行版本回退时,Git仅仅是将master分支存储上回退的版本号
七、撤销修改
撤销修改是指当工作区文件被编辑更改后,想要回退当上一个版本。共有三种情况:
例如最开始:工作区文件为AAA ;暂存区文件为AAA;版本库文件为AAA
1.没有add
工作区文件为AAABBB ;暂存区文件为AAA;版本库文件为AAA
使用git checkout命令,撤销工作区文件的修改,使其与暂存区中的文件相同
git checkout -- file
2.add,但没有commit
工作区文件为AAABBB ;暂存区文件为AAABBB;版本库文件为AAA
使用git reset命令将版本库和暂存区的文件回退到当前版本,再使用git checkout命令撤销工作区文件的修改
git reset --mixed HEAD file
git checkout -- file
3.commit了
工作区文件为AAABBB ;暂存区文件为AAABBB;版本库文件为AAABBB
使用git reset命令将三个区域的文件全部回退到上一个版本
git reset --hard HEAD^ file
八、删除文件
单纯地使用 rm file 仅仅是删除工作区的文件,并不是删除版本库中的文件
删除文件共有两种方式:
1.使用rm file删除工作区文件,再使用 git add 和 git commit 同步暂存区和版本库中的文件
rm file
git add file
git commit file -m "delete file"
2.使用git rm file删除工作区和暂存区的文件,再使用git commit 同步版本库中的文件
git rm file
git commit file -m "delete file"