Git学习笔记2
2 Git的常用操作
2.1 基本操作
1)新建文件在本地版本库中新建一个hello.html文件,文件内容为Hello Git World
2)查看状态用于查看当前版本库的Git状态
最后提示,没有任何文件被添加到提交,没有被跟踪的文件出现(使用git add进行跟踪)。该命令的作用是告诉Git系统,将指定文件的当前快照写入到版本库暂存区。即,将文件交给Git进行版本管理。
3)添加一个文件
警告:在hello.html文件中,LF将被替换为CRLF。在工作目录中,文件将使用原始的行结束符。LF为Linux下的换行符,而CRLF为Windows下的换行符。由于文件创建于Linux下,保存在Windows中,所以文件的行结束符使用的是Windows下的CRLF。此时再次查看Git状态,提示,尚未提交。
此时再次查看Git状态,提示,尚未提交。
4)添加多个文件
git add 后添加多个文件,文件之间使用空格分隔git add 后使用通配符*指定多个文件
5)提交操作
命令:git commint提交操作就通过命令将Git暂存区中的文件快照永久性地写入到本地仓库中。
在提交时必须要通过选项-m给出一个操作提示信息
再来查看一个Git状态,提交是将暂存区的快照文件提交到本地仓库中.
2.2 忽略文件
一般情况下工作区中的文件都是要交给Git管理的,但有些文件并不想交给Git管理。但是又由于该文件处理工作区,所有在执行git status命令的时候会给出xx文件Untracked(未被跟踪)。
想通过一些设置让Git忽略这些文件,再运行git status命令时不对其进行检测。只要在工作区创建一个文件,名称为.gitignore,把要被忽略的文件名写入到其中,然后将.gitignore文件add添加并提交commit到本地版本库即可
将忽略文件中的文件名删除之后,那么查看状态的时候该文件又被提示:未被跟踪
添加要忽略的文件名到.gitignore文件中,那Git就不会再检测该文件
2.3 查看区别
2.3.1 比较工作区和暂存区
查看工作区与暂存区内容的区别,使用无选项的git diff命令。
首先向hello.html文件中添加一行新的内容:one line,然后再查看区别:git diff hello.html
其中+one line表示工作区中的内容比暂存区中的内容多出一行one line此时将hello.html文件添加到add到暂存区,再次来查看区别:没有任何输出,这就说明此时工作区中hello.html文件的内容与暂存区中hello.html文件的内容没有区别。
2.3.2 比较暂存区与本地库
查看暂存区与本地库中内容的区别,使用带–cached选项的git diff命令。
其+one line表示暂存区中hello.html的内容比本地库中hello.html的内容多出一行one line。提交hello.html文件,再次查看暂存区中hello.html与本地库中hello.html中的内容的区别:发现没有任何内容的输出,说明暂存区与本地库内容一致。
git diff --cached
2.4 撤销修改
对于已修改过的文件内容需要进行撤销,根据修改内容已经出现的位置可以分为三种情况:
1.仅仅是工作区中内容进行了修改,还未添加add到暂存区
2.已经add添加到暂存区,但是还未commit提交到本地版本库
3.已经提交commit到本地版本库不同的情况具有不同的撤销方式
2.4.1 仅在工作区修改
Git命令:
git checkout --
如果仅在工作区中进行了修改,可以在文件中将内容直接复原即可。但是有时候修改内容较多,已经记不清修改过哪些地方,此时可以使用命令进行撤销。
首先修改工作区中的文件内容,在hello.html文件中添加一行新内容:two line
2.4.2 已在暂存区修改
Git 命令:
git reset HEAD
如果对文件修改过的内容已经被add添加到暂存区,则有必要通过命令方式进行撤销。首先要在工作区中修改hello.html文件内容,新增一行内容:twoline,并将hello.html文件添加add到暂存区。
再次查看状态,提示:可以使用git add命令将修改过的内容添加到暂存区,也可以使用git checkout –命令将工作区中的文件修改撤销
2.4.3 回退到之前的版本
若修改过的文件,不仅add到了暂存区,还commit到了本地版本库,还能撤销吗?已经是无法撤销修改了,但是可以回退到修改前的版本。
2.4.3.1 查看历史版本
如果要回退到之前的版本,首先查看版本库的历史版本。通过git log命令可以查看详细的历史版本信息。
git log
每一个记录单元均由五行构成:
第1行:commit 的id,由于Git是分布式版本控制系统,整个系统中存在有多个版本库,为了保证各个版本库中commit的id不重复,所有Git中的commit的id不是顺序递增的,而是与版本库主机的IP,版本库,提交者,提交时间相关的内容计算出来的一个值。
第2行:提交者的信息
第3行:提交的时间
第4行:分隔行,即空行。将前面所述基本信息与后面的修改日志内容进行分隔。第5行:提交日志信息。
2.4.3.2 查看简单形式的日志
也可通过为git log命令添加选项—pretty=oneline,以单行形式简单展示历史记录信息
git log --pretty=oneline
2.4.3.3 缩写commit id
前面方式下的commit-id显示的是全长度的id,可以以简写的commit-id方式来显示
只需要添加–abbrev-commit选项即可。abbrev:缩写,简写。
git log --pretty=oneline --abbrev-commit
2.3.3.4 翻页与退出
当git log日志命令显示的内容太多,无法在一页内显示完毕所有内容时,其最后一行会出现一个冒号,让输入命令。常用的命令有:
命令 | 含义 |
---|---|
回车 | 显示下一行 |
空格 | 显示下一页 |
q | 退出 |
2.3.3.5 HEAD指针
Git会默认创建一个master分支,即主分支。这是Git对版本进行管理的唯一的一条时间线。在这条master时间线上有很多版本的时间节点,而HEAD指针则指向的是当前刚刚提交的版本时间节点。它可以通过 ^ 的数量来表示当前版本之前的版本,例如,HEAD^ 表示当前版本的前一个版本,HEAD^^ 表示前两个版本,但是之前的版本较多的时候,^的数量将不好数,此时可以使用~加数字表示当前版本之前的第几个版本。
2.3.3.6 查看可引用历史版本
使用git log命令只可以查看到HEAD指针及其之前的版本信息,如果版本发生回退,则可能会出现HEAD指针之后仍存在版本的情况,而这些版本信息通过git log命令是看不到的。所以我们就得使用git reflog可查看到所有历史版本信息。由于查看所有历史版本信息的目的大多是为了进行版本回退或恢复使用commit-id,所有该命令被命名为reflog,即引用log。
查看所有历史版本,第一列为commit-id,但发现该commit-id并不完整,比git log查看的commit-id要短很多。这是commit-id的短格式,仅仅是长格式中的前七位。只要可以区分开commit-id,Git允许使用短格式。
2.3.3.7 版本回退
git reset命令可以实现版本回退,其有三个选项,可以完成三种不同效果的回退,回退三种不同的Git状态
(一) git reset --soft
git reset --soft
回退到指定版本。但仅仅修改分支中的HEAD指针的位置,不会改变工作区与暂存区中的文件的版本。实现上是改变了暂存区commit之前的状态。
A .回退前首先在版本库中的hello.html文件中添加一行内容,并提交该内容。目的就是要再回退到该版本。
对比工作区与暂存区、暂存区与本地版本库的差异,此时发现内容完全相同,无差异。
B 发生回退
C 回退后
再次对比工作区与暂存区、暂存区与本地库中版本的差异,发现工作区与暂存区内容没有差异,但是暂存区与本地库中的版本出现了差异:暂存区中的内容没有回退,但是本地库中的版本却回退到了之前的版本。这说明通过此操作回退只是将本地库中的内容进行回退。即当前的Git状态为暂存区中的版本尚未提交时的状态
查看历史版本信息,可以发现已经看不到添加“append two line”这个版本了
不过,“append two line”这个版本仍然存在的,通过git reflog可以查看到
D 恢复到回退前版本
若要恢复到回退之前的版本,可以直接将暂存区中的数据commit提交即可。
(二) git reset –mixed
git reset –mixed
回退到指定版本。它不仅修改了分支中HEAD指针的位置,还将暂存区中数据也回退到了指定版本。但是工作区中的版本仍是回退前的版本。–mixed是git reset 命令的默认选项。
A.首先添加一行新的数据内容到hello.html,内容为three line。现在要回退该版本。
对工作区与暂存区、暂存区与本地库中版本的差异,发现内容完全相同,没有差异
B 发生回退
回退到前一个版本
C.回退后
对比工作区与暂存区,发现工作区与暂存区内容出现差异:工作区中的内容没有回退,但是暂存区中的版本回退到了之前的版本。
即当前的Git 状态为工作区中的文件文件修改过后尚未进行add时的操作
不过,“append three line”这个版本仍然是存在的,通过git reflog查看到。
D.恢复回退前版本
虽然可以通过先add再提交commit的方式就可以恢复回退前的版本,但若回退的版本是很多版本之前的版本,最好不要使用该方式,而是使用版本跳转命令的方式。
首先要通过git reflog 命令查看到要恢复的提交标识commit-id,
(三) git reset --hard
git reset --hard
回退到指定版本。该命令不仅修改了分支中HEAD指针的位置,还将工作区、暂存区和本地库中数据也回退到了指定的版本。
A.回退前通过查看历史版本可以看出,向hello.html文件中添加了一个新行,内容为“four line”。现在要回退该版本
对比工作区与暂存区、暂存区与本地库中版本的差异:发现内容完全相同,无差异。
B.发生回退
回退到前一个版本
提示:当前版本是在 7f0dc53 这个版本上
C.回退后
1、再次对比工作区与暂存区、暂存区与本地库中版本的差异:没有内容的差异,完全一样。
2、再查看工作区中hello.html文件的内容:发现之前的“four line”内容消失了,工作区中hello.html文件内容回退到之前的版本。
3、不过,“four line”这个版本仍然是存在的,我们可以通过git reflog查看到。
D.恢复回退前版本
1、首先要通过git reflog 命令查看到要恢复的版本commit-id
2、恢复
3、恢复后再查看历史版本git log查看工作区hello.html文件内容:已经完全恢复