有关Git的那些事儿(六)—修改

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会告诉你接下来有可能出现什么情况,并且告诉你应该怎么应对。

如果此时,你不仅添加到缓存区,并且提交到版本库,怎么破?请参照第四小节内容(穿越历史)。温故而知新,可以为师矣。

本小节内容总结:

  1. 修改如果不适用git add命令进行添加到缓存区(stage),就不会被提交到版本库中。
  2. git diff HEAD -- 指令,可以查看当前版本库中的版本和工作区中的版本有何不同?
  3. 若修改了工作区内容,还未添加到缓存区,想撤销,使用命令git checkout --
  4. 若修改了工作区内容,并且已添加到缓存区,但是未提交,想撤销,可以使用命令git reset HEAD
  5. 如果已经将修改提交到了版本库中,想撤销,可以参照第四小节(穿越历史)内容。
  6. 友情提示:如果不知道该使用什么命令,可以使用git status,问问Git,它会告诉你接下来可能出现的情况以及对应的指令。

好啦。今天就到这里啦。下节再见哈~

你可能感兴趣的:(有关Git的那些事儿(六)—修改)