文章目录
- Git(二):基本操作
- 添加文件
- 修改文件
- 版本回退
- 撤销修改
- 情况一:工作区的代码还没有 add
- 情况⼆:已经 add 但没有 commit
- 情况三:已经 add 并且也 commit
- 删除文件
Git(二):基本操作
添加文件
首先我们先来学习一个命令git status
,其基本功能为:
- 显示工作目录状态:git status 会列出当前工作目录中哪些文件被修改(modified)、未跟踪(untracked)或存在冲突(conflict)
- 显示暂存区状态:显示哪些文件已暂存(staged)但未提交,以及哪些文件未暂存但已修改
- 分支信息:输出当前分支名称及与远程分支的同步状态(如 “Your branch is up to date with ‘origin/master’”)
例如,我们在工作区中创建一个文件但并没有add,使用git status
就会给出提示:file1并没有被追踪,同时暂存区中是干净的
我们add后不commit,再来看一下status:暂存区中有文件等待被commit
commit之后暂存区就干净了:
修改文件
首先,我们要明确一个概念:Git跟踪并管理的是修改,而非文件,这也是Git 比其他版本控制系统设计得优秀的主要原因之一
什么是修改?比如你新增了一行,这就是⼀个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚⾄创建一个新文件,也算一个修改
让我们将 ReadMe 文件进行一次修改,此时,仓库中的 ReadMe 和我们⼯作区的 ReadMe 是不同的, 使用git status
命令查看:
上⾯的结果告诉我们,ReadMe 被修改过了,但还没有完成添加与提交。目前,我们只知道文件被修改了,但不知道那里被修改了,这时就需要git diff
命令出马了:
git diff [file]
命令⽤来显⽰暂存区和⼯作区⽂件的差异,显⽰的格式正是Unix通⽤的diff格式。也可以使⽤ git diff HEAD -- [file]
命令来查看版本库和⼯作区⽂件的区别
接下来只需要正常add和commit即可
版本回退
之前我们也提到过,Git 能够管理⽂件的历史版本,这也是版本控制器重要的能⼒。如果有⼀天你发现之前的⼯作做的出现了很⼤的问题,需要在某个特定的历史版本重新开始,这个时候,就需要版本回退的功能
执⾏ git reset 命令⽤于回退版本,可以指定退回某⼀次提交的版本。要解释⼀下“回退”本质是要将版本库中的内容进⾏回退,⼯作区或暂存区是否回退由命令参数决定:
git reset 命令语法格式为: git reset [--soft | --mixed | --hard] [HEAD]
- –mixed 为默认选项,使⽤时可以不⽤带该参数。该参数将暂存区的内容退回为指定提交版本内容,⼯作区⽂件保持不变。
- –soft 参数对于⼯作区和暂存区的内容都不变,只是将版本库回退到某个指定版本
- –hard 参数将暂存区与⼯作区都退回到指定版本。切记⼯作区有未提交的代码时不要⽤这个命令,因为⼯作区会回滚,你没有提交的代码就再也找不回了,所以使⽤该参数前⼀定要慎重
在上面我们对ReadMe文件新增了一行“hello world!”,现在我们使用表格来展现:
选项 | 工作区 | 暂存区 | 版本库 |
---|---|---|---|
未操作 | hello git hello world | hello git hello world | hello git hello world |
–soft | hello git hello world | hello git hello world | hello git |
–mixed(默认) | hello git hello world | hello git | hello git |
–hard | hello git | hello git | hello git |
HEAD选项说明:
- 可直接写成 commit id,表示指定退回的版本
- HEAD 表示当前版本
- HEAD^ 上⼀个版本
- HEAD^^ 上上⼀个版本
也可以使⽤ 〜数字表示:
- HEAD~0 表示当前版本
- HEAD~1 上⼀个版本
- HEAD^2 上上⼀个版本
接下来我们演示一下:ReadMe文件经修改后现在有两行,commit后master指向最后一次修改
接下来使用reset命令,带上hard选项,HEAD直接写成ReadMe文件第一次修改的commit id
我们发现ReadMe文件回退到了第一个版本,而且file1也被删除了,因为file1是在之后创建的
那我们要是后悔了怎么办?只需要把commit id改成modify ReadMe的:
我们发现ReadMe文件“回退”到了第二个版本,file1也回来了,HEAD重新指向了modify ReadMe
但是如果我们隔了几天重新登陆服务器,找不到对应的历史commit id怎么办?此时就用到了git reflog
命令:
值得说的是,Git 的版本回退速度⾮常快,因为 Git 在内部有个指向当前分⽀(此处是master)的
HEAD 指针, refs/heads/master ⽂件⾥保存当前 master 分⽀的最新 commit id 。当我们
在回退版本的时候,Git 仅仅是给 refs/heads/master 中存储⼀个特定的version,可以简单理解
成如下⽰意图:
撤销修改
如果我们在我们的⼯作区写了很⻓时间代码,越写越写不下去,觉得⾃⼰写的实在是垃圾,想恢复到 上⼀个版本
情况一:工作区的代码还没有 add
我们在ReadMe文件中新增一行,不add到暂存区
第一种方法就是直接修改,但如果不记得新增代码是哪些呢?因此这种方式效率很低,而且容易出错,此时就需要用到git checkout -- [file]
命令,git checkout -- [file]
命令可以让工作区的文件回到最近⼀次add 或commit 时的状态。要注意 git checkout -- [file]
命令中的 – 很重要,切记不要省略,⼀旦省略,该命令就变为其他意思了,后面我们再说
情况⼆:已经 add 但没有 commit
add后还是保存到了暂存区呢?怎么撤销呢?
让我们来回忆⼀下学过的 git reset 回退命令,该命令如果使用–mixed 参数,可以将暂存区 的内容退回为指定的版本内容,但⼯作区⽂件保持不变。那我们就可以回退下暂存区的内容了!!!
此时就变成了第一种情况,再使用git checkout -- [file]
命令就可以了
情况三:已经 add 并且也 commit
直接使用git reset --hard HEAD^
命令回退到上⼀个版本!不过,这是有条件的,就是 你还没有把自己的本地版本库推送到远程(后面会讲)
我们使用表格对上面三种情况进行总结:
操作 | 工作区 | 暂存区 | 版本库 |
---|---|---|---|
git check – [filename] | xxx code | ||
git reset --mixed | xxx code | xxx code | |
git reset --hard HEAD^ | xxx code | xxx code | xxx code |
注:xxx code是新增内容,空白表示未新增
删除文件
第一种方法:
- 在工作区中执行
rm -f 文件名
命令 git add
git commit
第二种方法:
- 在工作区中执行
git rm 文件名
命令 git commit