0%

查看系统当前时区

1
2
$ date -R
Tue, 20 Mar 2018 02:01:35 -0400

网上有一堆人说通过执行tzselect命令可以修改时区。我们先执行此命令尝试一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
$ tzselect

Please identify a location so that time zone rules can be set correctly.
Please select a continent, ocean, "coord", or "TZ".
1) Africa
2) Americas
3) Antarctica
4) Asia
5) Atlantic Ocean
6) Australia
7) Europe
8) Indian Ocean
9) Pacific Ocean
10) coord - I want to use geographical coordinates.
11) TZ - I want to specify the time zone using the Posix TZ format.
#? 4

Please select a country whose clocks agree with yours.
1) Afghanistan 18) Israel 35) Palestine
2) Armenia 19) Japan 36) Philippines
3) Azerbaijan 20) Jordan 37) Qatar
4) Bahrain 21) Kazakhstan 38) Russia
5) Bangladesh 22) Korea (North) 39) Saudi Arabia
6) Bhutan 23) Korea (South) 40) Singapore
7) Brunei 24) Kuwait 41) Sri Lanka
8) Cambodia 25) Kyrgyzstan 42) Syria
9) China 26) Laos 43) Taiwan
10) Cyprus 27) Lebanon 44) Tajikistan
11) East Timor 28) Macau 45) Thailand
12) Georgia 29) Malaysia 46) Turkmenistan
13) Hong Kong 30) Mongolia 47) United Arab Emirates
14) India 31) Myanmar (Burma) 48) Uzbekistan
15) Indonesia 32) Nepal 49) Vietnam
16) Iran 33) Oman 50) Yemen
17) Iraq 34) Pakistan
#? 9

Please select one of the following time zone regions.
1) Beijing Time
2) Xinjiang Time
#? 1

The following information has been given:

China
Beijing Time

Therefore TZ='Asia/Shanghai' will be used.
Local time is now: Tue Mar 20 14:05:28 CST 2018.
Universal Time is now: Tue Mar 20 06:05:28 UTC 2018.
Is the above information OK?
1) Yes
2) No
#? 1

You can make this change permanent for yourself by appending the line
TZ='Asia/Shanghai'; export TZ
to the file '.profile' in your home directory; then log out and log in again.

Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Asia/Shanghai

程序结束,我们执行date -R发现,时区并没有变化。

那就奇怪了,tzselect命令是用于干嘛的呢?那我执行man tzselect再看看。

1
2
3
4
5
6
7
8
9
10
11
12
13
DESCRIPTION
This manual page explains how you can use the tzselect utility to view the installed timezone. It comes handy when you want to know
what time it is in other countries, or if you just wonder what timezones exist.

tzselect is called without any parameters from the shell. It shows a list of about one dozen geographic areas one can roughly recog‐
nize as continents. After choosing a geographic area by number, a list of countries and cities in this area will be shown.

You can press the Enter key to reprint the list. To choose a timezone, just press the number left to it. If your input is invalid,
the list will be reprinted.

You may press Ctrl-C to interrupt the script at any time.

Note that tzselect will not actually change the timezone for you. Use 'dpkg-reconfigure tzdata' to achieve this.

注释中写得很清楚,tzselect命令只用于你查看系统存在哪些国家和时区,并且,此命令并不会真实的修改系统所在时区。我们需要执行dpkg-reconfigure tzdata来修改时区。

1
2
$ sudo dpkg-reconfigure tzdata
[sudo] password for root: ********
1
2
3
Current default time zone: 'Asia/Shanghai'
Local time is now: Tue Mar 20 14:16:40 CST 2018.
Universal Time is now: Tue Mar 20 06:16:40 UTC 2018.

执行结束,系统的时区才会真实的改变了。

1
2
$ date -R
Tue, 20 Mar 2018 14:17:25 +0800

总结一下,文件在三种状态下面的撤销修改

  1. 当在工作区修改了文件内容,想直接丢弃掉工作区的修改,用命令git checkout -- <file path>

  2. 当在工作区修改了文件内容,并已经执行了命令git add <file path>,也即是,文件已经被添加到了暂存区,想丢弃修改,分两步,第一步执行命令git reset HEAD <file path>,文件回到工作区,第二步,git checkout -- <file path>

  3. 当已经提交了不合适的修改到版本库时,也即是执行了git commit -m "some comment"时,想要撤销本次提交,那就需要执行git reset --hard commit_id。此前提是没有推送到远程库。

Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。

先来看名词解释。

工作区(Working Directory)

就是你在电脑里能看到的目录,比如我的/Users/simon/learngit文件夹就是一个工作区。

版本库(Repository)

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

分支和HEAD的概念我们以后再讲。

前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

俗话说,实践出真知。现在,我们再练习一遍,先对readme.txt做个修改,比如加上一行内容:

1
2
3
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.

然后,在工作区新增一个LICENSE文本文件(内容随便写)。

先用git status查看一下状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ 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

Untracked files:
(use "git add <file>..." to include in what will be committed)

LICENSE

no changes added to commit (use "git add" and/or "git commit -a")

Git非常清楚地告诉我们,readme.txt被修改了,而LICENSE还从来没有被添加过,所以它的状态是Untracked。

现在,使用两次命令git add,把readme.txt和LICENSE都添加后,用git status再查看一下:

1
2
3
4
5
6
7
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

new file: LICENSE
modified: readme.txt

所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

1
2
3
4
$ git commit -m "understand how stage works"
[master ae9ae11] understand how stage works
2 files changed, 1 insertion(+)
create mode 100644 LICENSE

一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的:

1
2
3
$ git status
On branch master
nothing to commit, working tree clean

现在版本库变成了这样,暂存区就没有任何内容了。