Git教程2

六、Git的工作区域和文件状态

1、工作区域:

(1) 工作区(Working Directory):电脑上可以看到的目录,即实际操作的目录。车间
(2) 暂存区(Staging Area/Index):保存即将提交到Git仓库的修改内容。运输工具 Cache
(3) 本地仓库(Local Repository):存储代码和版本信息的主要位置。仓库
(4) 工作区 git add -> 暂存区 git commit -> 本地仓库。

2、文件状态:

(1) 未跟踪:untrack,新创建但是未被git管理的文件。
(2) 未修改:unmodified,被git管理但是内容未发生变化的文件。
(3) 已修改:modified,已经修改但是未添加到暂存区的文件。
(4) 已暂存:staged,已修改并已经添加到暂存区的文件。


七、添加和提交文件

1、命令:

(1) echo "xxx" > file1.txt 将内容添加到file1.txt文件中。
(2) cat file1.txt 查看文件内容。
(3) git status 查看仓库中的文件状态。
(4) git add file1.txt 将文件添加到暂存区。
(5) git commit -m "内容" 将暂存区的文件提交到仓库中。
(6) git commit只会提交暂存区中的文件,不会提交到工作区中的文件。且要使用 -m 参数,指定提交的信息。
(7) git add *.txt 将以txt结尾的文件全部加入到暂存区。
(8) git add . 将全部文件添加到暂存区,. 表示当前目录。
(9) vim编辑:
① i键进入编辑模式。
② esc 回到命令模式,输入:wq保存退出,提交完成。
(10) git log 查看提交记录;git log --oneline 查看简洁的提交记录。


八、Git reset回退版本

1、git reset:

(1) 可以回退到之前的某一个提交的状态。
(2) git reset的三种模式:对应于三种参数
git reset --soft 回退到某一个版本,并且保留工作区和暂存区的所有修改内容。
git reset --hard 回退到某一个版本,并且丢弃工作区和暂存区的所有修改内容。
git reset --mixed 介于soft和hard之间,回退到某一个版本,并且保留工作区的修改内容而丢弃暂存区中的修改内容。mixed是reset命令的默认参数。

2、演示:

(1) cp -rf repo repo-soft
① cp:copy,用于复制文件或目录。
② -r:recursive,递归地复制指定目录及其子目录下的所有文件和目录。
③ -f:force,如果目标位置有同名文件或目录存在,cp命令无条件覆盖它们,而不会提示用户确认。
④ repo:原目录。
⑤ repo-soft:目标目录。
(2) repo-soft、repo-hard、repo-mixed三个目录用于测试三种不同的模式。
(3) git reset --soft
① 由于file3是第三次提交,而使用soft参数回退到了第二次提交,所以file3是new file。
(4) git reset --hard
① HEAD^:表示回退到上一个版本。
② ls:工作区不存在file3;ls-files:暂存区也不存在file3。
③ 使用--hard参数时,工作区和暂存区内容都会被清空。
(5) git reset --mixed mixed可以省略。
git reset HEAD^ 默认是mixed参数。
cat file3.txt 查看文件内容。
③ 工作区有file3,但是暂存区没有file3。

3、谨慎使用hard参数,会清楚工作区和暂存区的全部内容。如果误操作,使用`git reflog` 命令查看过去一段时间的HEAD的移动。

4、git refloggit log 的对比:

(1) git log 显示的是提交历史,git reflog 显示的是所有引用(包括HEAD和分支)的移动历史。
(2) 当要查看所有分支的提交历史,使用git log ;当由于回退等操作导致暂存区内容丢失时,使用git reflog 查找过去一段时间的HEAD移动。


九、Git diff查看差异

1、git diff:

(1) 查看工作区、暂存区、本地仓库之间的差异。
(2) 查看文件在不同版本之间的差异。
(3) 查看文件在不同分支之间的差异。
(4) git diff无参数时,默认比较工作区(Working Directory)和暂存区(Staging Area)之间的差异。(很奇怪,做实验时这里明明是比较的是已经提交(仓库)和在工作区的文件。)
① 每次add和commit一个文件,最后修改file3文件:333 -> 3333。
git diff 之后的结果:
第一行:变化的文件。
第二行:Git将文件内容使用Hash生成一个40位的哈希值,这里只显示前7位。100644为文件的权限。
第三行:红色为删除内容,绿色为添加的内容。
③ 通过 git add . 将工作区中的内容添加到暂存区后,使用 git diff 发现没有变化。说明此时工作区和暂存区之间没有差异。
(5) git diff HEAD 比较工作区和版本库之间的差异。
① 此时工作区和暂存区内容一致(执行了git add .),但是由于还没有执行提交操作,所以工作区和版本库之间仍有差异。
(6) git diff --cached 比较暂存区和版本库之间的差异。
① 由于没有commit,暂存区和版本库之间有差异。
② 当commit后,暂存区和版本库、工作区和版本库之间都没有差异。

2、git diff比较不同提交ID的信息:

(1) git diff ID1 ID2
(2) 可以用HEAD指向分支的最新的提交节点。
(3) 比较HEAD和HEAD上一次的提交的信息:git diff HEAD~ HEADgit diff HEAD^ HEAD
(4) 比较HEAD和HEAD之前第三个版本的信息:git diff HEAD~3 HEAD
(5) 只比较file3的内容:git diff HEAD~3 HEAD file3.txt