Git基础02

三种状态

仅修改但没有添加到暂存区

1
2
3
4
5
6
7
8
9
$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <file>..." 更新要提交的内容)
(使用 "git checkout -- <file>..." 丢弃工作区的改动)

修改: 01.txt

修改尚未加入提交(使用 "git add" 和/或 "git commit -a"

已提交到暂存区,但没有提交

1
2
3
4
5
6
$ git status
位于分支 master
要提交的变更:
(使用 "git reset HEAD <file>..." 撤出暂存区)

修改: 01.txt

已提交到当前分支,工作区干净

1
2
3
$ git status
位于分支 master
无文件要提交,干净的工作区

提交历史

1
2
3
4
5
6
7
$ git log # 显示所以提交历史
commit 9cf50d94d4134f36199c19a4798fe84c81832515
Author: learnit <higoge@gmail.com>
Date: Wed Dec 24 13:49:39 2014 +0800

03
........

commit后面的一串数字,是提交的编号(SHA1编码),也叫版本号。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ git log -p 01.txt # 显示某个文件的历次修改
commit 9cf50d94d4134f36199c19a4798fe84c81832515
Author: learnit <higoge@gmail.com>
Date: Wed Dec 24 13:49:39 2014 +0800

03

diff --git a/01.txt b/01.txt
index 181417e..7e556fd 100644
--- a/01.txt
+++ b/01.txt
@@ -1,2 +1,3 @@
line01
02
+03
......

1
2
3
4
$ git log --pretty=oneline # 在一行上显示log
9cf50d94d4134f36199c19a4798fe84c81832515 03
2e18697d9cf53454820091a5db86790102ddf8db 02
49805b0b3b55fe32219cd14d5a15583893836520 添加01.txt文档
1
2
3
4
5
$ git log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ad) \
%C(bold blue)[%an]%Creset' --abbrev-commit --topo-order --date=short # 变态的显示,不过更加清晰
* 9cf50d9 - (HEAD, master) 03 (2014-12-24) [learnit]
* 2e18697 - 02 (2014-12-24) [learnit]
* 49805b0 - 添加01.txt文档 (2014-12-24) [learnit]

比较

1
2
3
4
5
6
7
8
9
10
$ git diff # 暂存区与工作区的比较
diff --git a/01.txt b/01.txt
index fc52d75..b726728 100644
--- a/01.txt
+++ b/01.txt
@@ -3,3 +3,4 @@ line01
03
04
05
+06
1
2
3
4
5
6
7
8
9
10
11
$ git diff HEAD # 工作区+暂存区与当前版本的比较
diff --git a/01.txt b/01.txt
index 3b6f86c..b726728 100644
--- a/01.txt
+++ b/01.txt
@@ -2,3 +2,5 @@ line01
02
03
04
+05
+06
1
2
3
4
5
6
7
8
9
10
11
12
$ git diff 2e18 # 不需要把编号全部写出
diff --git a/01.txt b/01.txt
index 181417e..b726728 100644
--- a/01.txt
+++ b/01.txt
@@ -1,2 +1,6 @@
line01
02
+03
+04
+05
+06

HEAD表示当前版本。
HEAD~表示当前版本的前一个版本,或HEAD^
HEAD~~表示将当前版本的前两个版本, 或HEAD^^
HEAD~100表示当前版本的前100个版本。

撤销(后悔药)

1
$ git checkout -- 01.txt  # 放弃工作区的修改 !!!慎用!!!
1
2
3
$ git reset HEAD 01.txt # 移出暂存区的修改,放回工作区
重置后撤出暂存区的变更:
M 01.txt
1
2
3
$ git reset HEAD~  # 恢复到某个版本,所有的修改(包括暂存区中的修改)放回工作区
重置后撤出暂存区的变更:
M 01.txt
1
2
$ git reset --hard HEAD~ # 恢复到某个版本,放弃所有的修改
HEAD 现在位于 dfcfea8 05

--hard参数表示放弃所有的更改,还原后工作区干净。
不加--hard参数,即--soft,表示将到达版本之后的所有修改,包括暂存区的修改全部放置到工作区。
通过git status命令就可以看出--hard参数的作用。

1
2
3
4
5
6
7
8
9
10
$ git reflog # 记录了每次执行的命令
dfcfea8 HEAD@{13}: reset: moving to HEAD~
b28a718 HEAD@{14}: commit: 06
dfcfea8 HEAD@{15}: reset: moving to HEAD~
7cf36f0 HEAD@{16}: commit: 02.txt
dfcfea8 HEAD@{17}: commit: 05
dacd44e HEAD@{18}: commit: 04
9cf50d9 HEAD@{19}: commit: 03
2e18697 HEAD@{20}: commit: 02
49805b0 HEAD@{21}: commit (initial): 添加01.txt文档

当后悔撤销时,尤其是加了参数--hard时,可以通过此命令找回丢失的信息。

如果本文对你有所帮助,请小额赞助
~~ EOF ~~