Git基础二
在上篇文章中我们,介绍了git status, git init ,git add ,git commit 这四个命令
通过这四个命令,我们成功的初始化了git的仓库,并提交了第一次更改。
下面我们看看这么查询我们的提交历史呢。
git log :输出历史
这个命令主要是输出commit的记录,也就是用户的提交历史。
frc@frc:~/GitHub/study/GitStudy$ git log
commit 7024df8d77c8b5c13673f809b88a3533e67afd42
Author: fengrongcheng <fengrongcheng2017@outlook.com>
Date: Tue Jun 13 12:23:41 2017 +0800
test for git rm
commit 009f82b5c68e89408b4e3435f4bad176ef3cc847
Author: fengrongcheng <fengrongcheng2017@outlook.com>
Date: Tue Jun 13 12:08:02 2017 +0800
test git rm
commit 26de8cfad13bb7e19dafc00a892ca8e786cfadc0
Author: fengrongcheng <fengrongcheng2017@outlook.com>
Date: Tue Jun 13 11:46:38 2017 +0800
test git commit -a -m
commit 3d0a19a7dfce6fb7c627d5965098a355247ee49c
Author: fengrongcheng <fengrongcheng2017@outlook.com>
Date: Tue Jun 13 11:35:11 2017 +0800
test git diff
这个命令会按时间顺序列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明。
commit_id
commit 5d7589415b65d51bd18cbd3817f1b4f5d837ff00
5d7589415b65d51bd18cbd3817f1b4f5d837ff00是一个SHA-1Hash值,它是对那个commit是Git仓库中内容和头信息(Header)的一个校验和(checksum),Linux kernel开创者和Git的开发者——Linus说,Git使用了SHA-1并非是为了安全性,而是为了数据的完整性;它可以保证,在很多年后,你重新checkout某个commit时,一定是它多年前的当时的状态,完全一摸一样,完全值得信任。在Git中,根据commit的SHA-1值(40个十六进制数字)进行了简单的划分目录,以前2位数字作为目录名,其下面是剩余38位数字组成的一个文件名.
git log -size
只查看最近的size条commit 信息
frc@frc:~/GitHub/study/GitStudy$ git log -2
commit 7024df8d77c8b5c13673f809b88a3533e67afd42
Author: fengrongcheng <fengrongcheng2017@outlook.com>
Date: Tue Jun 13 12:23:41 2017 +0800
test for git rm
commit 009f82b5c68e89408b4e3435f4bad176ef3cc847
Author: fengrongcheng <fengrongcheng2017@outlook.com>
Date: Tue Jun 13 12:08:02 2017 +0800
test git rm
git log -p
显示每次提交的内容差异
frc@frc:~/GitHub/study/GitStudy$ git log -p -2
commit 7024df8d77c8b5c13673f809b88a3533e67afd42
Author: fengrongcheng <fengrongcheng2017@outlook.com>
Date: Tue Jun 13 12:23:41 2017 +0800
test for git rm
diff --git a/testForGitRm.txt b/testForGitRm.txt
new file mode 100644
index 0000000..6ebc240
--- /dev/null
+++ b/testForGitRm.txt
@@ -0,0 +1,2 @@
+
+test for git rm
commit 009f82b5c68e89408b4e3435f4bad176ef3cc847
Author: fengrongcheng <fengrongcheng2017@outlook.com>
Date: Tue Jun 13 12:08:02 2017 +0800
test git rm
diff --git a/REDME.text b/REDME.text
index 55070be..322d181 100644
git log --stat
每次提交的简略的统计信息
frc@frc:~/GitHub/study/GitStudy$ git log --stat -2
commit 7024df8d77c8b5c13673f809b88a3533e67afd42
Author: fengrongcheng <fengrongcheng2017@outlook.com>
Date: Tue Jun 13 12:23:41 2017 +0800
test for git rm
testForGitRm.txt | 2 ++
1 file changed, 2 insertions(+)
commit 009f82b5c68e89408b4e3435f4bad176ef3cc847
Author: fengrongcheng <fengrongcheng2017@outlook.com>
Date: Tue Jun 13 12:08:02 2017 +0800
test git rm
REDME.text | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
git log --pretty
输出log的样式
之前的log输出形式太复杂了,其实我们只需要知道commit_id,commit_msg就行了,正常情况下作者邮箱只有在看别人代码时可能有用。我们使用git log --pretty 来定义个一行显示的:
frc@frc:~/GitHub/study/GitStudy$ git log --pretty=oneline
7024df8d77c8b5c13673f809b88a3533e67afd42 test for git rm
009f82b5c68e89408b4e3435f4bad176ef3cc847 test git rm
26de8cfad13bb7e19dafc00a892ca8e786cfadc0 test git commit -a -m
3d0a19a7dfce6fb7c627d5965098a355247ee49c test git diff
f697f00003fb4a848b51ead4e4286a84a7edadad first commit again
5d7589415b65d51bd18cbd3817f1b4f5d837ff00 first commitC
各种筛选功能
--since, --after 仅显示指定时间之后的提交。
--author仅显示指定作者相关的提交。
--committer仅显示指定提交者相关的提交。
--grep仅显示含指定关键字的提交交。
-S仅显示添加或移除了某个关键字的提交
撤销操作
git commit --amend
作为一个资深的程序猿肯定碰到一个问题,就是你在开发过程中,写到某处commit了假设叫A,然后接着开发过一会又要提交B,这时你发现这2个commit可以归一个,作为一个有洁癖的你该怎么办呢,这里就需要用到git commit --amend了,最终你只会有一个提交 - 第二次提交将代替第一次提交的结果。
git checkout -- file
我现在对REDME文件进行修改,突然觉得之前修改的是不对的,我要还原成没修改之前的样子该怎么办呢,其实 在使用git status时,log日志早就是提示我们了,那就是用使用 "git checkout -- file..." 丢弃工作区的改动,我们来试试。
没有加入暂缓区前 :
frc@frc:~/GitHub/study/GitStudy$ vi REDME.text
frc@frc:~/GitHub/study/GitStudy$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <file>..." 更新要提交的内容)
(使用 "git checkout -- <file>..." 丢弃工作区的改动)
修改: REDME.text
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
frc@frc:~/GitHub/study/GitStudy$ git checkout -- REDME.text
frc@frc:~/GitHub/study/GitStudy$ git status
位于分支 master
无文件要提交,干净的工作区
frc@frc:~/GitHub/study/GitStudy$
之前的情况是没有add的,那么如果已经加入暂缓区的该怎么办呢?
git reset HEAD file
其实取消加入暂缓区的方法,在使用git status的时候也已经告诉我们了
看下面的操作流程 vi REDME.txt其实是去修改文件了
frc@frc:~/GitHub/study/GitStudy$ vi REDME.text
frc@frc:~/GitHub/study/GitStudy$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <file>..." 更新要提交的内容)
(使用 "git checkout -- <file>..." 丢弃工作区的改动)
修改: REDME.text
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
frc@frc:~/GitHub/study/GitStudy$ git add REDME.text
frc@frc:~/GitHub/study/GitStudy$ git status
位于分支 master
要提交的变更:
(使用 "git reset HEAD <file>..." 撤出暂存区)
修改: REDME.text
frc@frc:~/GitHub/study/GitStudy$ git reset HEAD REDME.text
重置后撤出暂存区的变更:
M REDME.text
frc@frc:~/GitHub/study/GitStudy$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <file>..." 更新要提交的内容)
(使用 "git checkout -- <file>..." 丢弃工作区的改动)
修改: REDME.text
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
so,是不是感觉看log日志是很有帮助的。
git checkout
上面的一些列操作都是针对尚未commit 的改动,如果我已经commit,或者说我现在想把代码回退到某个commit之前该怎么办呢。那么现在一直出现的commit_id就派上用场了。由于commit_id是唯一标示,它其实就代表了你这次的提交(比commit _msg靠谱多了),所以我们可以以它为标记来检索代码。
不过git checkout比较多还是单来一篇吧