一.创建版本库
1.创建空目录(这里目录名为learngit)
$ mkdir learngit
2.进入目录
$ cd learngit
3.显示当前目录
$ pwd
4.将当前目录变为Git可以管理的仓库
$ git init
.git
目录是Git来跟踪管理版本库的,要放到Git仓库的文件要放在该目录或者其子目录下
二.把文件添加到版本库
1.在分支中新建文件(这里文件为readme.txt)
$ touch readme.txt
2.vim编辑文件
$ vi readme.txt
按 “i” 进入编辑,按 “esc” “:wq”保存并推出
3.把文件添加到仓库
$ git add readme.txt
4.把文件提交到仓库
$ git commit -m "wrote a readme file"
commit
可以一次提交很多文件,所以你可以多次add
不同的文件
Git告诉我们当前没有需要提交的修改(nothing to commit
),而且,工作目录是干净(working tree clean)的。
三.修改文件、查看修改
1.查看仓库当前的状态(如:是否修改了文件、修改是否已提交、删除了什么文件、冲突的文件等)
$ git status
2.查看具体修改了什么内容
$ git diff readme.txt
四.版本回退
每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit
。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit
恢复,然后继续工作,而不是把几个月的工作成果全部丢失。
1.查看提交日志的历史记录
$ git log
简略版
$ git log --pretty=oneline
一大串类似1094adb...
的是commit id
(版本号)
在Git中,用HEAD
表示当前版本,最新的提交上一个版本是HEAD^
,
上上一个版本就是HEAD^^
2.回退到上一个版本
$ git reset --hard HEAD^
3.指定回到未来的某个版本
(1)只要上面的命令行窗口还没有被关掉,你就可以顺着往上找,找到那个未来版本的commit id,这里
是1094adb...
$ git reset --hard 1094a
(2)已经关闭了命令行,想恢复到新版本
- 查看命令日志的历史记录(为了找commit id)
$ git reflog
- 找到待恢复版本的commit id,用$ git reset --hard 1094a回到新版本
五.撤销修改
1.丢弃工作区的修改
$ git checkout -- readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态
git checkout -- file
命令中的--
很重要,没有--
,就变成了“切换到另一个分支”的命令
2.修改后已经git add
到暂存区,但是还没有提交
$ git reset HEAD readme.txt
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本。
接下来通过命令$ git checkout -- readme.txt
丢弃工作区的修改
3.已经提交到版本库(前提是没有推送到远程库)
想要撤销本次提交,参考四.版本回退
六.删除文件
1.从工作空间删除文件(和直接在文件管理器删除相同)
$ rm test.txt
2.从版本库删除文件
如果该文件已经提交到了版本库,从工作空间删除文件后,那么此时工作区和版本库就不一致了
$ git rm test.txt 然后 $ git commit -m "remove test.txt"
文件就从版本库中被删除了
3.从版本库恢复工作空间误删的文件
$ git checkout -- test.txt
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!
补充概念:
1.工作区和暂存区:
在这里learngit
文件夹就是一个工作区。工作区的隐藏目录.git
不算工作区,而是Git的版本库
- 第一步是用
git add
把文件添加进去,实际上就是把文件修改添加到暂存区; - 第二步是用
git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
2.Git管理的是修改,那么Git如何跟踪修改
每次修改,如果不用git add
到暂存区,那就不会加入到commit
中。
- 第一次修改 ->
git add
-> 第二次修改 ->git commit
。当你用git add
命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit
只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
- 第一次修改 ->
git add
-> 第二次修改 ->git add
->git commit
现在把第二次修改也提交了。
参考资料:廖雪峰老师博客