Git管理的是修改,而非文件本身。增加、删除、甚至是创建新文件都是修改。
Git既可以管理修改,也可以撤销修改。
下面我们分别看看这两部分内容。
管理修改
这个时候,可能有人不明白,到底什么是管理修改呢?我们来举个小栗子看看哈。
对之前的love.txt
文件进行如下修改:
I love you so much as the mouse like rice.
Do you know?
Every day
Hey,Julie.
Today is Tuesday.
之后添加文件到版本库,并且查看此时的状态。
git add love.txt
git status
命令行回复如下:
On branch master
Changes to be committed:
(use “git reset HEAD …” to unstage)
modified: love.txt
再修改love.txt
如下:
I love you so much as the mouse like rice.
Do you know?
Every day
Hey,Julie.
I know today is Tuesday.
现在,提交文件到版本库:
git commit -m “Tuesday”
命令行回复如下:
[master 7238888] “Tuesday”
1 file changed, 2 insertions(+), 1 deletion(-)
现在,再次查看状态:
git status
命令行回复如下:
On branch master
Changes not staged for commit:
(use “git add …” to update what will be committed)
(use “git checkout — …” to discard changes in working directory)
modified: love.txt
no changes added to commit (use “git add” and/or “git commit -a”)
很明显,第二次的修改没有被提交。因为我们在第二次修改后没有使用add
命令,修改并没有进入缓存区,所以提交的时候没有第二次修改的内容。
现在,我们用git diff HEAD — love.txt
命令查看一下版本库中最新版本和工作区的区别:
git diff HEAD -- love.txt
命令行回复如下:
*diff —git a/love.txt b/love.txt*
*index e88da71..8347d74 100644*
*— a/love.txt*
*+++ b/love.txt*
@@ -2,4 +2,4 @@ I love you so much as the mouse like rice.
Do you know?
Every day
Hey,Julie.
-Today is Tuesday.
\ No newline at end of file
+I know today is Tuesday.
\ No newline at end of file
版本库中最新版本和工作区中存放的版本的区别一目了然,第二次修改没有被提交。
撤销修改
有修改,就有可能犯错。这一辈子谁还没有犯糊涂的时候呢?知错能改善莫大焉。咱来看看如何改这错误。
假如,你在love.txt
中无意添加了一句不太好的言语:
I love you so much as the mouse like rice.
Do you know?
Every day
Hey,Julie.
I know today is Tuesday.
I hate Lilei.
过了一会儿,你突然觉得这样不妥。怎么办?咱先git status
看看具体情况再说。
git status
此时,命令行回复如下信息:
On branch master
Changes not staged for commit:
(use “git add …” to update what will be committed)
(use “git checkout — …” to discard changes in working directory)
modified: love.txt
no changes added to commit (use “git add” and/or “git commit -a”)
其实,答案已经出现啦。Git告诉我们,使用git checkout -
可以丢弃工作区的修改内容。
我们来试试:
git checkout --love.txt
此时查看文件内容:
cat love.txt
命令行输出如下:
I love you so much as the mouse like rice.
Do you know?
Every day
Hey,Julie.
Today is Tuesday.
我们又回到了最初遇见的地方~
这个时候有人可能有这样的疑问:如果我不仅修改了内容,还提交到了缓存区,想撤销,怎么破?
所谓车到山前必有路,咱们试试看呗~
现在,我们添加了一行不妥的话,并且git add
到了缓存区。此时,使用cat
命令查看一下文本中的内容:
cat love.txt
命令行显示如下:
I love you so much as the mouse like rice.
Do you know?
Every day
Hey,Julie.
Today is Tuesday.
Lilei is a pig.
不幸中的万幸是,在commit
之前发现了错误,我们再发git status
,问问Git有什么灵丹妙药。
git status
Git告诉我们如下:
On branch master
Changes to be committed:
(use “git reset HEAD …” to unstage)
modified: love.txt
Git很清楚地告诉我们,用git reset HEAD
命令可以撤销掉添加到缓存区的修改。
git reset HEAD love.txt
此时,命令行输出:
Unstaged changes after reset:
M love.txt
此时,查看git status
,命令行输出如下:
On branch master
Changes not staged for commit:
(use “git add …” to update what will be committed)
(use “git checkout — …” to discard changes in working directory)
modified: love.txt
no changes added to commit (use “git add” and/or “git commit -a”)
发现了吗?如果你此时不知道需要什么指令的时候,不妨试一试git status
指令,Git会告诉你接下来有可能出现什么情况,并且告诉你应该怎么应对。
如果此时,你不仅添加到缓存区,并且提交到版本库,怎么破?请参照第四小节内容(穿越历史)。温故而知新,可以为师矣。
本小节内容总结:
- 修改如果不适用
git add
命令进行添加到缓存区(stage),就不会被提交到版本库中。git diff HEAD --
指令,可以查看当前版本库中的版本和工作区中的版本有何不同?- 若修改了工作区内容,还未添加到缓存区,想撤销,使用命令
git checkout --
- 若修改了工作区内容,并且已添加到缓存区,但是未提交,想撤销,可以使用命令
git reset HEAD
。- 如果已经将修改提交到了版本库中,想撤销,可以参照第四小节(穿越历史)内容。
- 友情提示:如果不知道该使用什么命令,可以使用
git status
,问问Git,它会告诉你接下来可能出现的情况以及对应的指令。
好啦。今天就到这里啦。下节再见哈~