二、Git中常用命令——时光穿梭机
2.1 创建版本库
-
创建一个空目录(这个目录也可以不使用命令创建)
$ mkdir git1(目录名)
在F盘的Code/Git目录下创建一个git1的空目录:
小贴士:
在创建版本库之前一般都要设置自己的用户名和邮箱(这个不是强制要求):
git config --global user.name “用户名”
git config --global user.email "邮箱" -
切换到此目录
$ cd git1(目录名) lenovo@LAPTOP-LRE84PDF MINGW64 /f/Code/Git/git1
-
把这个目录变成Git可以管理的仓库
$ git init Initialized empty Git repository in F:/Code/Git/git1/.git/
如果没有看见这个.git隐藏目录,可以根据命令查看:$ ls -ah ./ ../ .git/
-
编写文件并将其添加到版本库
▲ 编写一个readme.txt文件(这个文件一定放到git1目录下),内容如下:
Git is a version control system. Git is free software.
▲ 把此文件放到Git仓库:
① 把文件添加到仓库
这个命令可以反复多次使用,用来添加多个文件。$ git add readme.txt
这个命令执行过后没有任何显示,此所谓“没有消息就是最好的消息”。
② 把文件提交到仓库
提交之后文件就被保存到Git仓库了。$ git commit -m "write a readme file" [master (root-commit) 1bfc448] write a readme file 1 file changed, 2 insertions(+) create mode 100644 readme.txt
注意:
- -m 这个命令无论是对于你自己的查找还是对于别人的阅读都非常重要,当然,嫌麻烦的小伙伴可以不写试试哦!
- 把文件放到git仓库之所以分为两个步骤,是因为commit一次可以提交很多个文件,我们可以多次add很多个不同的文件,然后一次提交。
比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m “add three files.”
2.2 版本回退
-
修改文件内容并将其添加到版本库
▲ 修改文件内容(修改两次)第一次修改
Git is a distributed version control system. Git is free software.
第二次修改
Git is a distributed version control system. Git is free software distributed under the GPL.
▲ 将修改后的文件添加到版本库
①把文件添加到仓库
两次添加命令相同$ git add readme.txt
②把文件提交到仓库
第一次提交
$ git commit -m "add distribute--twice version" [master 9b143b4] add distribute--twice version 1 file changed, 1 insertion(+), 1 deletion(-)
第二次提交
$ git commit -m "append GPL--third version" [master 3881c73] append GPL--third version 1 file changed, 1 insertion(+), 1 deletion(-)
-
查看修改的历史记录
$ git log
-
版本回退
$ git reset --hard HEAD^ HEAD is now at 9b143b4 add distribute--twice version
回退之前所在的版本是“append GPL–third version”,用HEAD表示当前版本,上一个版本就是HEAD ^,上上个版本就是HEAD ^ ^,也就是退回几个版本就有几个 ^,当然,当有100个 ^时比较容易数不过来,所以一般写成HEAD~100。
查看回退之后readme.txt的内容是不是第二个版本:
$ cat readme.txt Git is a distributed version control system. Git is free software.
这时我们来查看当前版本库的状态:
$ git log
当前的版本是第二个版本,我们发现第三个版本(最新的那个版本)已经看不见了,如果你还是想要回去,可以使用版本前进。 -
版本前进
只有上面的命令窗口还没有被关掉,我们就可以顺着往上找到那个版本的commit id号:
根据版本号前进:$ git reset --hard 3881c738 HEAD is now at 3881c73 append GPL--third version
嘿嘿,本仙女又回来啦!
当前版本
版本回退
版本前进
2.3 工作区和暂存区
-
工作区(Working Directory)
工作区就是我们在电脑里能看到的目录,比如我的文件夹git1就是一个工作区。
-
暂存区(stage)
我们都知道工作区中有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是暂存区,还有Git为我们自动创建的第一个分支master以及指向master的一个指针HEAD。
现在,我们再次对readme.txt文件进行修改,并复制出一份相同的文件readme2.txt:
Git is a distributed version control system. Git is free software distributed under the GPL. Git has a mutable index called stage.
这时我们先来查看一下工作状态:
$ git status
下面我们将这两个文件都添加进来:$ git add readme.txt $ git add readme2.txt
这个时候暂存区就开始发挥作用了,两个新添加的文件都被收录进了暂存区,等待被提交:
一旦将暂存区的文件提交后,如果又没有对工作区做任何修改,那么这个时候的暂存区就是“干净”的:$ git status On branch master nothing to commit, working tree clean
2.4 管理修改
修改——顾名思义,就是增加删除更改一些字符和文件,而Git跟踪并管理的就是修改,而不是文件本身。
现在,我们再次将readme.txt文件进行修改:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes.
然后进行add操作:
$ git add readme.txt
然后,再次修改readme.txt文件:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
直接对readme.txt文件进行提交:
$ git commit -m "git tracks changes--fifth version"
[master 33f951f] git tracks changes--fifth version
1 file changed, 2 insertions(+), 1 deletion(-)
这时会发现,第二次修改的内容并没有被提交,我们不禁会回忆刚刚的一波操作:第一次修改后:add,第二次修改后:commit,很明显第二次的修改并没有add进暂存区,所以缓存区自然就不会管第二次的修改啦,人家也只是负责将自己区域的内容提交就好了。
如果你还是想要将第二次的修改提交,可以继续先add后commit,或者两次修改都add之后再一起commit。
所以说:Git跟踪并管理的就是修改,而不是文件本身!
2.5 撤销修改
-
撤销在工作区的修改
现在再次修改readme.txt文件:
Git is a distributed version control system. Git is free software distributed under the GPL. Git has a mutable index called stage. Git tracks changes of files. Because of my stupid resulting in this mass!
在提交前猛地发现,这时我添加的最后一句内容是不合适的,就很想删掉他:
$ git checkout -- readme.txt
这时,撤销修改后就回到了和版本库一模一样的状态了。
如果已经经文件添加到了暂存区又做了修改,那么撤销后就回到了添加到暂存区后的状态了。 -
撤销在暂存区的修改
现在再次次改readme.txt的内容并add到暂存区:
Git is a distributed version control system. Git is free software distributed under the GPL. Git has a mutable index called stage. Git tracks changes. Because of my stupid resulting in this big mass!
$ git add readme.txt
现在却发现内容不合适想要撤销,这时只是把暂存区的修改回退到了工作区:
$ git reset HEAD readme.txt Unstaged changes after reset: M readme.txt
现在将工作区的修改撤销即可:$ git checkout -- readme.txt
-
撤销在版本库的修改
当我们已经将文件提交到了版本库却发现内容不合适时,要想撤销本次的提交,只需要版本回退到上一个版本就可以了,前提是你还没有将自己的本地版本库推送到远程仓库中。
版本回退你往上扒拉扒拉就看到啦!
2.6 删除文件
在Git中,删除也是一个修改操作,下面上代码:
-
在git1这个目录中新建一个文件delete.txt(内容随便扒拉一点就ok):
I want to delete this file!
-
将此文件添加到版本库:
$ git add delete.txt $ git commit -m "add delete.txt" [master d70b65c] add delete.txt 1 file changed, 1 insertion(+) create mode 100644 delete.txt
-
在git目录下删除文件delete.txt(也可以不用命令直接删除):
rm delete.txt
这个时候,Git肯定知道你已经删除了文件,工作区和版本库就不一致了,查看哪些文件被删除了:
-
从版本库里删除该文件:
$ git rm delete.txt rm 'delete.txt' $ git commit -m "remove delete.txt" [master 2217b6e] remove delete.txt 1 file changed, 1 deletion(-) delete mode 100644 delete.txt
这个时候这个文件就从版本库里彻底删除了! -
当这个文件是被错删了的,我们就要想办法将其恢复:
$ git checkout -- delete.txt
checkout其实就是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
你只能恢复到最新版本的文件,但是会丢失最近一次提交后修改的内容。
注意:如果你误删的文件没有添加到版本库就被删除了,那它是无法恢复的!