前情提要:Git应用详解第一讲:Git分区,配置与日志html
在第一讲中咱们对Git
进行了简单的入门介绍,相信聪明的你已经了解Git
的基本使用了。java
这一讲咱们来进一步深刻学习Git
应用,着重介绍Git
的一些常见操做,包括:删除文件、比较文件、撤销修改、修改注释与查看帮助文档。linux
git rm <file>
该命令用于删除版本库中的文件;删除工做区和暂存区中的文件都会报错:git
**所谓版本库中的文件指的是:**已经经过
commit
指令提交的文件,而不是工做区中的文件(红色),或暂存区中的文件(绿色)。vim
git rm
完成了两步操做:bash
stage
)。以下图所示,至关于执行了git add test.txt
,随后可直接提交,完成test.txt
的删除;rm <file>
该命令用于删除工做区和版本库中的文件,不能删除暂存区文件;编辑器
**注意:**没有添加到
git
仓库中的本地文件,都属于工做区文件。学习
与git rm
不一样的是,该指令不会将删除操做归入暂存区。须要先将删除的test.txt
归入暂存区,再提交到版本库才能完成test.txt
文件的删除;ui
从图中可知rm
命令只能删除工做区中的test3.txt
,不能删除暂存区中的test3.txt
;:spa
git mv <file1> <file2>
使用git
命令git mv
:
git mv test.txt test3.txt
复制代码
将test.txt
重命名为test3.txt
;mv
命令可理解为剪切的同时进行改名;
changes to be committed
表示该修改已经归入暂存区,能够进行提交操做;
通常绿色的文件(操做)表示已经提交到暂存区了,不用再进行
git add
,能够直接进行提交(git commit
)。
从上文可知git mv
作了两件事:
test.txt
重命名为test3.txt
;test.txt -> test3.txt
归入暂存区;mv <file1> <file2>
使用系统命令mv
:
mv test2.txt test3.txt
复制代码
执行该语句后查看状态git status
:
发现工做区中多出两步操做:
删除文件test2.txt
;
新建文件text3.txt
;
再使用git add test2.txt test3.txt
将操做提交到暂存区,经过git status
查看状态:
此时git
当即就能识别出来这是一个文件重命名;
由此说明git mv
进行了三步操做:
test2.txt
;test3.txt
;即git mv
与 mv
的区别至关于git rm
与 rm
之间的区别。
<->
本地文件diff file_a file_b
这是系统提供的比较命令,用于比较本地文件或已经提交到版本库的文件。建立文件a
和文件b
,使用上述指令进行比较:
在 diff -u a b
的输出信息中:
加上参数
-u
能够更详细地显示比较信息。
**--- a
**表示a
为原文件;
**+++ b
**表示b
为目标文件;
-1,3
中 -
表示原文件即a
,1
表示原文件中的第一行,3
表示到第3
行。合起来的意思为:在原文件a
中的1~3
行;
同理:+1,3
表示:目标文件b
中的1~3
行;
数据前面有三种符号,分别表示不一样的信息:
AABB
这一行文件a
,b
都有;-
:表示原文件a
去掉该行就能变为目标文件b
;+
:表示原文件a
加上该行就能变为目标文件b
;因此整个输出信息的意思为:AABB
这一行两文件都有,只要原文件a
去掉:
a1
a2
复制代码
并加上:
b1
b2
复制代码
就能变为目标文件b
;
<-
暂存区如下为git
提供的比较命令,做用为:比较暂存区和工做区中的同一文件。而且:原始文件为暂存区中的文件,目标文件为工做区中的文件。示例以下:
git diff
首先,新建文件A.txt
和B.txt
,修改其内容并提交到暂存区:
而后,在工做区中再次修改文件A.txt
与B.txt
的内容:
此时使用**git diff
**进行比较:
在 git diff
的输出信息中:
--- a/A.txt
:表示原文件为暂存区中的A.txt
;
+++ b/A.txt
:表示目标文件为工做区中的A.txt
;
-1
: 其中-
表示原文件,1
表示从第1
行开始。因为暂存区中的A.txt
文件(原文件)只有1
行,因此将原来的(-1,1)
简写为-1
;
+1,2
:其中+
表示目标文件,1,2
表示工做区中的A.txt
文件(目标文件)从第1
行开始有2
行;
hello world
:表示原文件和目标文件中都存在的内容;
+hello java
表示暂存区中的A.txt
加上该行,就能变得与工做区中的A.txt
同样;
能够看到该指令是将同一文件的工做区版本与暂存区版本进行比较,各比各的,并不会将A.txt
与B.txt
进行比较。
<-
版本库如下指令做用为:比较版本库和工做区中的同一文件。而且:原始文件为版本库中的文件,目标文件为工做区中的文件。
git diff commit_id
用于比较指定commit id
提交上的A
文件和工做区中的A
文件;
git diff HEAD
用于比较最新提交上的A
文件和工做区中的A
文件:
上面的
A
文件仅为一个示例,如下同理。
以下图所示,先初始化test.txt
为:版本库中的修改
,而后进行一次提交;随后在工做区中为test.txt
添加工做区的修改
;而后执行上述比较指令,从显示出来的比较结果可知,工做区中的test.txt
文件比最新一次提交的test.txt
文件多了一行工做区中的修改
内容。
<-
版本库如下指令做用为:比较版本库和暂存区中的同一文件,其中原始文件为版本库中的文件,目标文件为暂存区中的文件:
git diff --cached commit_id
用于比较指定提交上的A
文件和暂存区中的A
文件;
git diff --cached
用于比较最新提交上的A
文件和暂存区中的A
文件。示例以下:
能够看到,暂存区中的A.txt
文件比最新提交中的A.txt
文件多了一行hello java
;暂存区中的B.txt
文件比最新提交中的B.txt
文件多了一行hello java2
。
关于目标文件与原始文件的断定,遵循的顺序为:工做区 <-
暂存区 <-
版本库(提交);
上述比较指令的比较以下表所示:
指令 | 做用 | 原始文件 | 目标文件 |
---|---|---|---|
diff <file1> <file2> |
比较两个本地文件 | 本地文件/版本库 | 本地文件/版本库 |
git diff |
比较暂存区和工做区中的同一文件 | 暂存区 | 工做区 |
git diff commit_id |
比较指定commit id 提交上的A 文件和工做区中的A 文件 |
版本库 | 工做区 |
git diff HEAD |
比较最新提交上的A 文件和工做区中的A 文件 |
版本库 | 工做区 |
git diff --cached commit_id |
比较指定提交上的A 文件和暂存区中的A 文件 |
版本库 | 暂存区 |
git diff --cached |
比较最新提交上的A 文件和暂存区中的A 文件 |
版本库 | 暂存区 |
表格中的
A
文件仅为示例。
主要是将已经归入暂存区的修改(绿色),先恢复到工做区(红色),再恢复到修改前。好比撤销git rm
这一删除操做:
unstage
)也就是将对文件的修改操做由绿色变为红色。
git reset head <file>
以下图所示,经过git rm
删除了版本库中的test3.txt
文件,并将该操做提交到了暂存区。随后经过以上命令,将这一删除操做恢复到了工做区;
git restore --stage <file>
这里的参数--stage
写成--staged
效果是同样的,做用与法一相同:
好比撤销工做区中对文件的修改、新增和删除操做:
git restore <file>
以下图所示,在工做区中删除了test3.txt
文件。而后,经过上述指令撤销了工做区中对test3.txt
的删除操做:
git checkout -- <file>
做用与法一相同:
git commit --amend -m
'修正信息'若是写错了提交消息:
能够经过:git commit --amend -m '注释'
来修改上一次的提交信息:(amend
是修复的意思)
git commit --amend
当须要为最近一次提交添加大量注释时,能够直接使用该指令进入vim
编辑器编辑:
这样的好处是:错误的提交和修正后的提交通过该命令修正后,只变为一次提交,而不是两次提交;
git commit --amend --author 'Name<email>'
用于修改最近一次提交的配置信息,包含做者和注释信息。执行命令时会进入vim
编辑器编辑注释信息:
修改前该分支上最近两次的提交信息为:
修改后的最近两次提交信息为:
能够看到成功地改变了最新一次提交的做者和提交注释。
**注意:**修改提交注释的同时,虽然提交的内容相同,可是提交先后的
commit_id
是不一样的,说明建立了一个新提交替换了原来须要修正的提交。以下图中的提交5
与提交3
所示:![]()
如图所示,在test
分支进行了四次提交。如今咱们想要修改第三次提交的提交信息:
git rebase -i commit_id
经过以上指令能够进入rebase
交互模式,并显示commit_id
以后的提交信息。好比:若命令中的commit_id
为第一次提交的commit_id
,那么就会显示第2~4
次的提交信息。这里咱们须要修改第三次提交的信息,只须要将它指定为第二次提交的commit_id
便可。执行如下命令,进入vim
编辑器:
git rebase -i 678e0
复制代码
在这个界面中,咱们能够经过将pick
参数修改成其余rebase
提供的参数,从而对第三次错误提交进行修改。有两个参数能够实现这一目的:
这里涉及到
vim
编辑器的使用方式:
shift + A
为插入命令,可进入vim
编辑器的编辑模式;- 编辑完成后,先按
ESC
回到vim
编辑器的命令行模式,再输入:wq
表示保存并退出编辑器;
reword
参数
该参数的意思是:直接修改设置了该参数的提交的提交注释。这里应该将第三次提交的pick
参数改成reword
:
经过:wq
保存并退出,随后再次进入vim
编辑器,此次是修改设置了reword
参数的提交的提交注释:
将它改成正确的提交信息:
经过:wq
保存并退出vim
编辑器,完成错误提交信息的修改,再次查看历史提交信息:
能够发现:错误的提交信息获得了纠正,而且此次提交及其以后的提交的commit_id
都发生了变化。说明git
新建立了对应数目的提交,并对原有提交进行了覆盖,可是内容没有发生变化;
事实上:
rebase
的含义为变换基准,git rebase -i commit_id
中的commit_id
所指的提交节点就是新的基准点。该基准点以后的提交都会被git
新建立的,内容同样的新提交所覆盖。rebase
指令以后会详细介绍。
edit
参数
该参数也能够达到上述效果,只不过稍微多了几个步骤。这个参数的意思是:停下rebase
进程,编辑添加了该参数的提交,编辑完以后,经过调用git rebase --continue
继续进行rebase
;具体以下:
将添加了错误提交信息的提交的pick
参数改成edit
参数:
经过:wq
保存并退出:
能够看到,edit
参数将rebase
操做停了下来。根据提示,能够经过:
git commit --amend
复制代码
进入vim
编辑器,修改当前提交的注释信息:
修改完后,经过:wq
保存并退出vim
编辑器。再调用:
git rebase --continue
复制代码
继续进行rebase
操做,由此完成错误提交信息的修改:
此时查看test
分支的提交历史,会发现错误的提交信息获得了更正,而且与上reword
参数同样,建立了新的提交,对原有提交进行了覆盖,一样内容也不发生变化:
git rebase -i HEAD~n
经过上述指令也能够进入rebase
交互模式,其中n
表示须要显示的最近n
次提交记录。好比经过如下指令,显示test
分支最近的三次提交记录:
git rebase -i HEAD~3
复制代码
进入rebase
的交互界面以后,后续的操做和结果都与第一种方法同样,这里就再也不赘述了。
git help config
该命令会打开git
安装目录下的git-config
帮助文档:
文档中详细地显示了相关操做指令的使用:
git config --help
效果与上述同样,都是弹出一样的帮助网页;
man git-config
man
为linux
中自带的帮助文档,也能够查看帮助;
git
直接在命令窗口显示经常使用的指令: