一、版本管理介绍
通过之前的学习,我们基本学会了Git是怎么管理代码仓库的。之后在日常使用中我们对代码的修改添加删除,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit
。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit
恢复,然后继续工作,而不是把几个月的工作成果全部丢失。
二、文件修改测试
下面我将newfile.txt文件修改了3次,每次修改完成要“git add” 然后 “git commit” 来提交每次的修改,进行记录
三、版本历史查看
1. git log 命令查看:
** 显示了我们每次commit提交记录,并且每次有commit id,有提交的时间及描述
** 你看到的一大串类似1094adb...
的是commit id
(版本号),和SVN不一样,Git的commit id
不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id
和我的肯定不一样,以你自己的为准。为什么commit id
需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了
** Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本
2. git log --pretty=oneline 命令查看简洁版:
四、版本回退
1. 回退命令
回退命令:git reset
上一个版本:HEAD^
上上一个版本:HEAD^^
往上100个版本:写100个 ^ 数不过来,所以写成HEAD~100
$ git reset --hard HEAD^ HEAD is now at c6ddc13 two add $ cat newfile.txt test one two $ git log commit c6ddc13fb9e1d764d95d3cd5e92d02d0108c187c (HEAD -> master) Author: Asteven-zn <964038167@qq.com> Date: Thu Apr 15 16:20:37 2021 +0800 two add commit 72c6c812cc683ebff94b7d207071c19878692be3 Author: Asteven-zn <964038167@qq.com> Date: Thu Apr 15 16:19:01 2021 +0800 one add commit 31e61e7bb130005eec23e8e04232f5289e19cea4 (origin/master) Author: Asteven-zn <964038167@qq.com> Date: Thu Apr 15 15:07:02 2021 +0800 repotest push file
2. 找回某个版本
通过上面的回退命令,我们已经回到了以前的版本,也可以回到回退前的版本或者某个版本,这个时候就要用到commit id了
2.1 git reflog命令:记录每一次每一个操作,找回要切换的对应版本commit id
2.2 通过上面命令,通过commit时的描述“three add”,找到了第三步commit id “0355e6b”
2.3 于是就可以指定回到未来的某个版本
四、git管理修改
1. Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。
2. 你会问,什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。
3. 每次修改,需要用 git add 到暂存区,让后在commit提交到版本库,如果修改没有用git add 把文件存到暂存区,那即使执行了 git commit 命令,那修改也不会提交到版本库
修改后的文件和版本库中的文件做对比,可以用如下命令:
$ git diff HEAD -- filename
五、撤销修改
假设我们对工作区的文件进行了修改,但是修改后发现事错误的,可以用 git checkout 撤销修改。
** git checkout -- file
命令中的--
很重要,没有--
,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout
命令。
撤销分了以下情况:
1. 自修改后还没有被放到暂存区,现在撤销修改就回到和版本库一模一样的状态
git checkout -- filename
2. 已经添加到暂存区后,又作了修改,现在撤销修改就回到添加到暂存区后的状态。
git checkout -- filename
3. 已经添加到暂存区,在commit之前,可以把暂存区的修改撤销掉(unstage),重新放回工作区,再撤销工作区的修改
git reset HEAD filename
## 要用git status
查看一下,现在暂存区是干净的,工作区有修改,所以要执行撤销工作区的修改
git checkout -- filename
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本。
4. 假设不但改错了东西,还从暂存区提交到了版本库
** 可以回退到上一个版本。不过,这是有条件的,就是你还没有把自己的本地版本库推送到远程。
$ git reset --head HEAD^
** 一旦你把stupid boss
提交推送到远程版本库,你就真的惨了……
六、删除文件
在Git中,删除也是一个修改操作
1. 在工作区通过本地文件管理器删除文件
$ rm test.txt
## 这只是删除了工作区的文件,此时工作区和版本库不一致了
2. git status 命令查看哪些文件被删除了
$ git status On branch master Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) deleted: test.txt no changes added to commit (use "git add" and/or "git commit -a")
3. 版本库删除文件
$ git rm test.txt rm 'test.txt' $ git commit -m "remove test.txt" [master d46f35e] remove test.txt 1 file changed, 1 deletion(-) delete mode 100644 test.txt
4. 恢复删除的文件
另一种情况是删错了,因为删除也是修改,并且没有git add到版本库,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt
其实 git checkout 是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
** 从来没有被添加到版本库就被删除的文件,是无法恢复的!