【Git】Git基本操作-1:https://developer.aliyun.com/article/1430665
6. 修改文件
当我们对文件做了修改的话,需要重新使用 add 操作和 commit 操作,将修改的文件添加进版本库中。
什么是修改?⽐如你新增了⼀⾏,这就是⼀个修改,删除了⼀⾏,也是⼀个修改,更改了某些字符,也是⼀个修改,删了⼀些⼜加了⼀些,也是⼀个修改,甚⾄创建⼀个新⽂件,也算⼀个修改。
此时,仓库中的 ReadMe 和我们⼯作区的ReadMe是不同的,如何查看当前仓库的状态呢? git status 命令⽤于查看在你上次提交之后是否有对⽂件进⾏再次修改。
使用 git status
显示出来的数据表示 ReadMe 文件被修改,并且当前文件等待被 add。
使用 add 之后再查看仓库状态可以看到 ReadMe 文件被修改,并且这个文件等待被 commit。
当修改文件之后,我们又如何查看我们修改的内容吗?当然可以,虽然我们可以直接查看文件中的内容,然后对比差异,但是如果文件修改的内容较多且间隔时间较长,我们又该如何区别呢?
git diff [file]
命令⽤来显⽰暂存区和⼯作区⽂件的差异,显⽰的格式正是Unix通⽤的diff格式。也可以使⽤ git diff HEAD -- [file]
命令来查看版本库和⼯作区⽂件的区别。
diff --git a/ReadMe b/ReadMe:这行表示正在查看ReadMe文件在两个不同版本之间的差异。
index 6b15c4f…7945298 100644:这行提供了有关文件的元数据。index 6b15c4f…7945298表示原始版本的文件内容由SHA-1哈希值6b15c4f标识,而新版本的文件内容由7945298标识。100644是文件的权限模式,表示这是一个普通文件。
— a/ReadMe:这行表示原始版本的文件是ReadMe,位于a/目录下。
+++ b/ReadMe:这行表示新版本的文件是ReadMe,位于b/目录下。
@@ -1,3 +1,4 @@:这行表示差异的开始。-1,3表示原始文件的开始到第3行(不包括第3行),而+1,4表示新文件的开始到第4行(不包括第4行)。
hello git、hello git、hello world:这些行显示了原始文件的内容。
+hello world:这行表示在新文件中添加了“hello world”这一行。
7. 版本回退
前面说了 Git 能够管理文件的历史版本,这也是版本控制器的重要能力,就相当于我们前面的项目规划书,就类似前面的项目规划书,因为版本的管理,已经存在了三个版本的规划书,老板说让你在第二个版本的基础上进行修改,那么这时候你只需要拿出第二个版本的规划书的原稿就可以了。
如果只是回退工作区中的文件的话,可以直接用 git checkout [fikeName]来回退。
那么在 Git 中使用 git reset
命令用于版本的回退。git reset 命令语法格式为: git reset [--soft | --mixed | --hard] [HEAD]
。
- –mixed 为默认选项,使⽤时可以不⽤带该参数。该参数将暂存区的内容退回为指定提交版本内容,工作区⽂件保持不变。
- –soft 参数对于工作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
- –hard 参数将暂存区与工作区都退回到指定版本。切记工作区有未提交的代码时不要⽤这个命令,因为工作区会回滚,你没有提交的代码就再也找不回了,所以使⽤该参数前⼀定要慎重。
- HEAD 说明:
- 可直接写成 commit id,表⽰指定退回的版本
- HEAD 表⽰当前版本
- HEAD^ 上⼀个版本
- HEAD^^ 上上⼀个版本
- 以此类推…
- 可以使用 〜 数字表示:
- HEAD~0 表⽰当前版本
- HEAD~1 上⼀个版本
- HEAD^2 上上⼀个版本
- 以此类推…
我们先准备下数据:
假设我们现在需要将该文件恢复到第二次提交的情况,那么就需要更改工作区、暂存区和版本库中的数据,那么就需要用到 --hard 选项。
通过观察test1文件中的内容和 git log --pretty=oneline 显示的数据我们可以看到当前 test1 的版本已经回到了第二次的版本了。
如果我们现在又想回到第三个版本的话,该怎么办呢?前面说了 git reset
命令后面的参数可以是 commit id,所以我们就可以将后面的参数改为第三次提交的 commit id。
虽然我们可以使用 commit id 回退到指定的版本,但是如果我们因为工作时间太长,不能够直接从终端找到 commit id 或者 commit id 丢失了之后的话,别着急,我们可以使用 git reflog
补救一下,该命令⽤来记录本地的每⼀次命令。
这里并没有出现前面类似的 commit id ,而是出现了 1bb6079
这样的数字,那么这是什么呢?这其实是 commit id 中的一部分,通过 commit id 的这一部分是可以回到指定的版本的。
值得说的是,Git 的版本回退速度⾮常快,因为 Git 在内部有个指向当前分⽀(此处是master)的 HEAD 指针, refs/heads/master 文件⾥保存当前 master 分⽀的最新 commit id 。当我们在回退版本的时候,Git 仅仅是给 refs/heads/master 中存储⼀个特定的version,可以简单理解成如下⽰意图:
当需要回退的时候,只需要更改 .git/refs/heads/master
中存储的 version 版本就可以了。
使用 git reset 的前提是,在 commit 之后没有使用 push 操作将本地仓库的文件提交到远程仓库中,如果已经 push 将本地仓库的文件提交到远程仓库的话,再使用 git reset 的话,远程仓库的文件是没有修改的,而如果有远程仓库的话,我们最终看的还是远程仓库的文件,所以使用 git reset 的前提是没有将本地仓库的文件 push 到远程仓库之前。