文章目录
- [一、创建 git 仓库](#一、创建 git 仓库)
- [二、 配置本地仓库](#二、 配置本地仓库)
- 三、认识工作区、版本库、暂存区
- 四、添加文件
- [五、查看 .git 目录](#五、查看 .git 目录)
- 六、添加文件2
- 七、修改文件
- 八、版本回退
- 九、撤销修改
- 九、删除文件
一、创建 git 仓库
创建一个文件夹
mkdir gitcode
进入 gitcode 文件夹
cd gitcode
查看 gitcode 下的目录
ls
创建 git 仓库,初始化 git
java
git init
查看隐藏目录
java
la
查看 git 下目录
java
tree .git/
如果出现 Command 'tree' not found,则需下载 tree,使用以下命令:
java
sudo apt-get install tree
注意:不要手动修改 git 仓库里面的文件
二、 配置本地仓库
配置名字
git config user.name "你的名字"
配置邮箱
git config user.email "你的邮箱"
查看配置
git config -l
如果你配置错误,也可以进行删除
// 删除 name
git config --unset name
// 删除 email
git config --unset email
添加 --global
,表示以下配置项会在当前机器下的所有 git 仓库生效。
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
注意:全局配置如果要删除那么删除语句也需要加上 --global
git config --global --unset user.name
git config --global --unset user.email
三、认识工作区、版本库、暂存区
创建空文件 ReadMe
touch ReadMe
但是此时 git 还不能管理 ReadMe 文件。上文有提到不能手动修改 git 仓库里面的文件,所以我们只能将文件放在 gitcode 目录下,也被称为 git 的工作区;而 .git 称为版本库(仓库),它不属于工作区。
add 将工作区的修改写入暂存区,commit 将暂存区的修改写入 master,这才算真正的将修改写入了版本库。其中版本库存在 objects 对象,修改的工作区内容会写入对象库的一个新 git 对象中。而暂存区和 master 存的其实都是索引,HEAD 指向 master。
四、添加文件
进入文本编辑模式
vim ReadMe
进入后默认是命令行模式,输入 i
进入输入模式,然后可以自己编辑内容,编辑完点击 esc
返回命令行模式,输入 :wq
保存并退出编辑模式。
查看文件内容
cat ReadMe
添加文件修改
// 添加指定文件的修改
git add ReadMe
// 添加 gitcode 目录下所有修改
git add .
提交文件修改
git commit -m "此次修改信息"
也可以一次性添加并提交,如下图:添加三个文件,add 文件 file1、file2、file3,最后commit 所有文件。
查看提交日志
java
git log
想要打印成一行也可以使用以下命令
java
git log --pretty=oneline
五、查看 .git 目录
上文提到 HEAD 指向 master,我们可以查看一下
通过查看确实是这样的,进入 master 再次查看
可以看出是一串字符串,我们可以发现,其实这串字符串就是我们最新一次 commit 的索引
可以从上面的 .git 目录树状图中 objects 里面看到此索引,进入该索引里面查看
git cat-file -p 067fb4fac12215b35affb5a0563046d27ecb7faa
注意:Linux 下复制快捷键为 Ctrl + Shift + C,粘贴快捷键为 Ctrl + Shift + V;
展示出来的信息里面显示了提交的作者和邮箱,parent 为上一次提交时的索引,以及提交时我们描述的信息,tree 我们不清楚,可以打印出来查看:
可以看出来是我们每一次提交的文件索引(对象),我们查看一下 ReadMe,
java
git cat-file -p a48e117f02f8321a76c44addad096c95be1df334
打印出来的信息是我们新增 ReadMe 文件里面的内容,所以我们对该文件的修改被 git 记录了下来,即我们每一次对这些文件的修改都会被 git 记录下来,这也就是为什么 git 能够管理每一次被修改的文件。
这边给上面的操作做一个总结,如下图:
六、添加文件2
如上图操作,创建 file4,add file4,创建 file5,最后 commit,为什么此时 commit 只有一个文件修改呢?这是因为 commit 是将暂存区的修改写入仓库中,而上述操作中,只有 file4 被放入暂存区,file5 在工作区中,没有在暂存区,所以要将 file5 写入仓库,需要先将其写入暂存区,再写入仓库。
注意:git 追踪管理的并不是文件,而是修改操作,比如你此次修改了哪些文件,如添加、删除文件,进入文件进行写入、删除代码,都是修改操作。
七、修改文件
修改文件 ReadMe,我往里面添加了一行 cat is not dog.
git status
可以查看在你最近一次提交之后是否有对文件进行再次修改,上图可以看出暂存区此时没有信息,工作区修改了文件 ReadMe
那么修改了文件我们应该怎样看到具体修改了哪些内容呢?git diff 文件
可以查看工作区和暂存区文件有哪些区别,git diff HEAD --文件
可以查看工作区和版本库文件的区别。
下图可以看出此时暂存区有修改
commit
,然后 git status
,可以看出此次 commit 之后,没有修改任何文件,即暂存区没有要提交的文件,工作区没有任何要 add 的文件。
八、版本回退
git 可以记录修改操作,那么我们也可以回退到我们修改的某个版本,但有工作区、暂存区、版本库,我们回退的到底是哪个呢?
git reset [--soft | --mixed | --hard] [HEAD]
上述命令可以回退,本质回退的是版本库里的内容,还可以回退到当前版本 。下面先讲回退的是版本库里的内容。
其中 --soft
回退的是版本库中的操作,--mixed
回退的是版本库和暂存区中的操作,--hard
回退的是版本库、暂存区、工作区中的操作。如果不使用任何选项,则默认是 --mixed
。
上图操作,我们回退到 add first file 版本,也就是添加了 ReadMe 文件时的版本
查看目录,只有 ReadMe 文件,其他文件都没有了;查看 ReadMe 文件内容,只剩 hello cat!,正确回退。
查看对应的 log
但是如果此时我后悔了回退,是否还可以回到回退之前呢,当然是可以的,下面回退的索引是之前打印的 log 里面最新的索引,我们只需要回退到此索引就可以了。
但是如果我们清空屏幕或者说是关闭了服务器,得不到以前的索引怎么办呢?我们还可以通过以下命令得到以往的索引。
git reflog
可以看到每一个修改的版本前面都有一个黄色的索引,虽然这个索引比前面我们使用的短,但是这个索引也是和上面的一样的用法。
可以看到版本及 ReadMe 文件正确回退到我们需要的版本。
九、撤销修改
1、撤销工作区的修改
在 ReadMe 里面新增了一行 hello world.
,现在我想要撤销这个操作,如何撤销
git checkout -- ReadMe
回到最近一次使用的 add 或 commit 操作,
2、撤销工作区、暂存区的修改
上面说到回退还可以回退到当前版本,当前版本为空,所以此处回退就是将工作区、暂存区回退到和当前版本库保持一致的状态。
在 ReadMe 文件里面添加一行,并且 add 到暂存区
此处回退可以使用 --mixed
、--hard
,此处示范 --mixed
,而默认的就是这个,所以可以不写
// 回退到当前版本
git reset HEAD [file]
// 回退到上个版本
git reset HEAD^ [file]
// 回退到上上个版本
git reset HEAD^^ [file]
上图可以看到暂存区没有了,修改的在工作区
下图撤销工作区的修改
如图,没有修改的操作了。
3、撤销工作区、暂存区、版本库里面的修改
如果工作区、暂存区、版本库里面都存在修改,如何撤销呢?
前提:commit 之后没有 push,push 就是将本地仓库内容提交到远程仓库
在 ReadMe 中添加一行代码,并且 add、commit
此时工作区、暂存区、版本库里面都有修改,可以使用 --hard
回退到上一个版本
java
git reset --hard HEAD^
九、删除文件
如何删除版本库中的文件
以下操作 rm 删除的是工作区的文件,暂存区、仓库里面的文件并没有删除
通过以上的学习,可以知道,将上述操作提交到仓库中就可以删除仓库里面的 file5 了
下图操作删除了暂存区里面的 file5
可以看出仓库里面的 file5 也被删除了
下面简化删除文件的步骤: