现在假设这样一个场景:
深夜两点的加班狂欢仍在继续,咖啡杯旁的readme.txt
文件见证了我工作报告的进展。在键盘的敲击声中,我不小心加入了一行可能会让我后悔终生的文字:“My stupid boss still prefers SVN.”
就在我准备提交这份报告,将我的辛勤努力化为版本库中一串美丽的哈希值时,咖啡的香气和屏幕的冷光让我瞬间清醒。我瞪大了眼睛,看着屏幕上的那行文字,仿佛看到了老板愤怒的脸庞和即将消失的奖金。
幸好,Git这个救星总是在关键时刻出现。我迅速执行了git status
来查看当前的状态:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
Git告诉我,我的修改还没有被放入暂存区,而git checkout -- <file>
这个魔法命令可以帮我撤销这些修改。我深吸了一口气,轻轻敲下命令:
$ git checkout -- readme.txt
仿佛时间倒流,readme.txt
文件瞬间回到了它最纯洁的状态,那句冒犯之语消失得无影无踪。我再次查看文件内容,确认一切已经恢复如初:
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a Mutable index called stage.
Git tracks changes of files.
git checkout -- file
命令中的--
很重要,没有--
,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout
命令。
现在让这个场景更凶险些:
凌晨三点,我依然在键盘上飞舞,咖啡因与我并肩作战,对抗着即将到来的截止日期。不幸的是,我不仅在readme.txt
文件中加入了荒谬的内容,并且用git add
命令把它放入了暂存区。
我瞪大了眼睛,试图从这段文字中找出任何理智的迹象,但一切似乎都太晚了。然而,在我准备绝望地按下git commit
按钮之前,我突然意识到——还有机会!我可以用git status
来查看当前的状态:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
看到这条信息,我仿佛看到了希望的曙光。Git告诉我,我可以用git reset HEAD <file>
命令来撤销暂存区的修改。这就像是一个时间门,可以让我回到做出错误决定之前的状态。
我迅速执行了命令:
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本。
我再次运行git status
来确认状态:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
还记得如何丢弃工作区的修改吗?
$ git checkout -- readme.txt
$ git status
On branch master
nothing to commit, working tree clean
readme.txt
文件再次变得清洁无瑕,就像什么都没有发生过一样。我长长地松了一口气,感觉整个世界都重新回到了秩序之中。
继续让头脑发昏:
现在是凌晨四点,咖啡已经见底,为了赶上DeadLine我已逐渐神志不清,不但改错了东西,还从暂存区提交到了版本库,怎么办呢?还记得版本回退一节吗?可以回退到上一个版本。不过,这是有条件的,就是还没有把自己的本地版本库推送到远程。还记得Git是分布式版本控制系统吗?我们后面会讲到远程版本库,一旦把stupid boss提交推送到远程版本库,oh……no……
好