目录
创建git本地仓库
配置Git
管理流程
版本控制
提交操作
修改文件
版本回退
版本回退场景
回退速度
删除文件
仓库是进行版本控制的一个文件目录。我们想要对文件进行版本控制,就必须先创建一个仓库。
创建git本地仓库的对应命令:git init(命令要在文件目录下执行)
:~/gitcode$ pwd
/home/zhz/gitcode
:~/gitcode$ git init
Initialized empty Git repository in /home/zhz/gitcode/.git/
:~/gitcode$ ll -a
total 12
drwxrwxr-x 3 zhz zhz 4096 Jun 7 17:49 ./
drwxr-xr-x 13 zhz zhz 4096 Jun 7 17:47 ../
drwxrwxr-x 7 zhz zhz 4096 Jun 7 17:49 .git/
我们发现:目录下多了一个.git隐藏目录,.git是目录Git用来跟踪管理仓库的,尽量不要手动修改里面的文件,不然可能会破坏仓库
当安装Git后首先要做的事情就是配置你的用户名称和email地址,这是非常重要的
git config [--global] user.name "Your Name"
git config [--global] user.email "[email protected]"
其中,--global是可选项,如果使用了该选项,表示这台机器上所有Git仓库都会使用这个配置,如果你希望在不同仓库中使用不同的name或email,就不要带--global选项,
注意:执行命令时必须要在仓库里
查看配置的命令:
git config -l
删除配置的命令:
git config [--global] --unset user.name
git config [--global] --unset user.email
工作区:是在电脑上你要写代码或文件的目录。
暂存区:index,一般存放在.git目录下的index文件中,也可以叫做索引。
版本库:仓库,就是那个隐藏目录.git,它不算工作区,是Git的版本库,这个版本库里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能追踪,随时可以追踪历史,也可以复原
下面这张图展示了三者直接的关系:
当我们修改工作区并add后,会把工作区所有的修改内容添加到版本库的暂存区(stage)中,
但是这还不算把工作区内容真正意义上写入版本库
所以还要进行commit操作
commit会把暂存区的内容提交到master分支下
走了这两步之后才算是把工作区内容真正意义上添加到版本库中,也就是让Git管理工作区文件
版本控制是如何做到的呢?
当我们add操作的时候,会将工作区修改的内容 写入到git对象中,而git对象会被维护到对象库(objects)中。
所以暂存区和master中都只会存入git对象的索引
所以我们只要拿到HEAD指针,就能找到master,就能找到某一个文件具体修改的内容,就可以管控一个具体的文件了。
首先需要一个新文件:
[az@VM-8-7-centos gitcode]$ touch README
[az@VM-8-7-centos gitcode]$ vim README
[az@VM-8-7-centos gitcode]$ cat README
hello world
然后就是第一步add操作,把README文件添加到暂存区中。
(也可以 git add . 表示添加当前目录下的所有文件)
[az@VM-8-7-centos gitcode]$ git add README
然后第二部commit操作,把暂存区的文件添加到master中
(-m选项必须有,后面的内容是对这次添加内容的说明)
[az@VM-8-7-centos gitcode]$ git commit -m "add first file"
[master (root-commit) c0b9d78] add first file
1 file changed, 2 insertions(+)
create mode 100644 README
日志查询:
因为只进行了一次commit 操作,所以只能查到一条,但实际上git log 是可以查询到历史所有提交信息的
当然也可以用git log --pretty=oneline按行来显示信息
git跟踪并管理的是修改,不是文件
当我们修改完文件后,不记得有没有提交过
可以使用git status <文件名> 来查看你上次提交后是否对文件再次修改
:~/gitcode$ git status
On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)
modified: ReadMe
no changes added to commit (use "git add" and/or "git commit -a")
上面的结果告诉我们,ReadMe被修改过了,但还没有完成添加和提交
但是,到现在,我们只知道文件被修改了,但是不知道哪里被修改了
这时候就可以使用git diff <文件名>
用来显示暂存区和工作区文件的差异
:~/gitcode$ git diff ReadMe
diff --git a/ReadMe b/ReadMe
index 9c9e1f0..4a97140 100644
--- a/ReadMe
+++ b/ReadMe
@@ -1,2 +1,3 @@
hello bit
-hello bit
+hello git
+hello world
-表示改动前,+表示改动后
现在我们知道对ReadMe做了什么修改后,就可以放心地把它提交给本地仓库了
git reset [--soft | --mixed | --hard] [HEAD]
本质是回退版本库的内容
而工作区和暂存区的内容取决于reset 的选项
--mixed : (默认选项)该参数将暂存区的内容回退为指定提交版本内容,工作区文件保持不变。
--soft : 参数对于工作区和暂存区的内容都不变,只是将版本库回退到某个指定版本
--hard : 参数将暂存区和工作区的内容都回退到指定版本,切记工作区有未提交的代码时不要使用这个选项,因为工作区会回滚,你没有提交的代码就永远也找不回了(慎用)
head : 可以直接写成commit id ,表示回退到指定版本
HEAD 表示当前版本
HEAD^ 上一个版本
HEAD^^ 上上个版本
也可以使用数字替代
HEAD~1 上⼀个版本
HEAD~2 上上⼀个版本
以此类推
通过表格理解(老版本:git 新版本:git world)
版本回退也可以反悔的:
通过git reflog 命令可以查看所有历史命令(包括版本回退)
查到commit id 后再使用git reset --hard id 就可以了
但是如果年代久远,查不到commit id 就没办法了
场景1:还没有add操作
场景2:add后还没有commit操作
场景3:add、commit后,还没有push(提交到远程仓库)
注:checkout 后必须加--
Git的版本回退速度非常快,因为Git在内部有个指向当前分支(master)的HEAD指针
refs/heads/master文件里保存当前master分支的最新commit id
当我们版本回退的时候,Git只是给master文件中存储一个特定的version
正常删除文件的时候,先rm,然后同样需要add和commit操作来提交删除操作
但是git给我们提供了git rm命令
这个命令既会删除工作区的文件,也会在删除暂存区里的内容,
然后只需要再commit操作就行了。