目录
git中查看文件状态和差异
通常我们会使用git status来查看当前文件状态,它的输出如下面所示:
其中,第一个aa.ppp是已经加入到暂存区,等待提交的。 第二个aa.ppp是已经修改,但是尚未进行暂存。 test.pdf是一个新文件,还未进行跟踪。
但是有时我们除了知道文件状态外,还想知道文件发生哪些变化。
- 对于工作区中已经修改,但尚未加入暂存区的文件,git diff 将会对比工作区的文件和暂存区的文件(可以这样理解,初始的暂存区或者刚刚commit过的暂存区,与版本库是一致的)
- 对于已经加入暂存区的文件,git diff --staged 将会比较暂存区和版本库
跳过暂存区域
有时我们可能会觉得加入暂存区是个比较繁琐的事情,能不能跳过呢。 跳不过,但是git可以帮我们将文件加入到暂存区,那就是使用 git commit -a ,这样所有被追踪并且已经修改的文件,都会自动添加到暂存区然后被提交到版本库。
对于未追踪的文件,你还是得手动 git add 来将其加入到暂存区
移除文件
1. 已经添加到暂存区的新文件,但是还未提交(版本库中没有该文件)
无法用 git rm 文件名,我们这里有2个选择,
第一:git rm 文件名 --cached 仅删除暂存区的内容,保留工作区的文件
第二:git rm 文件名 -f 删除暂存区和工作区文件,就是这个文件被彻底删除。
2. 刚刚从版本库中checkout的文件,还未进行修改
使用 git rm 文件名 , 删除操作将被加入到暂存区,然后提交就可以将文件从版本库中删除了。
3. 从版本库中checkout的文件,修改并添加到暂存区
第一:git rm 文件名 --cached 仅删除暂存区的内容,保留工作区的文件
第二:git rm 文件名 -f 删除暂存区和工作区文件,并将删除操作加入暂存区,然后提交就可以将文件从版本库中删除了。
文件改名
可以使用 git mv name_from name_to, 这个修改会进入暂存区,commit后就可以了
这个命令其实是3个命令的合集:
git mv name_from name_to
git rm name_from
git add name_to
查看提交历史
使用git log能够查看提交历史,提交历史包含所有的提及历史记录,默认安照时间排序,最近提交的靠前。 同时,这个命令有很多的参数可用。
影响log输出的参数:
选项 | 说明 |
-p | 按不定格式显示每个更新间的差异 |
--stat | 显示每次更新的文件修改统计信息 |
--name-only | 仅在提交信息后显示已修改的文件清单 |
--name-status | 显示新增、删除、修改的文件清单 |
--abbrev-commit | 仅显示SHA-1的前几个字符,而非所有的40个字符 |
--relative-date | 使用较短的相对时间显示,例如 2 weeks ago |
--graph | 显示ASCII图形表示的分支合并历史 |
--pretty | 使用其他格式显示历史提交信息,可用的选项包括 oneline、short、full、fuller和format(format后跟指定格式) |
--pretty=format 的常用选项
选项 | 说明 |
%H | 提交对象(commit)的完整哈希字符串 |
%h | 提交对象的简短哈希字符串 |
%T | 树对象(tree)的完整哈希字符串 |
%t | 树对象的简短哈希字符串 |
%P | 父对象(parent)的完整哈希字符串 |
%p | 父对象的简短哈希字符串 |
%an | 作者(author)的名字 |
%ae | 作者的邮件地址 |
%ad | 作者修订日期(可以使用 --date=选项定制格式) |
%ar | 作者修订日期(按多久以前的方式显示) |
%cn | 提交者(committer)的名字 |
%ce | 提交者的邮箱地址 |
%cd | 提交日期 |
%cr | 提交日期,按多久以前的方式显示 |
%s | 提交说明 |
例子:git log --pretty=format:"%h %s" --graph
限制输出的长度(就是个过滤器)
选项 | 说明 |
---|---|
-n | n为一个数,代表显示最近提交的n条提交 |
--since, --after | 仅显示指定时间之后的提交 |
--until, --before | 仅显示指定时间之前的提交 |
--author | 仅显示指定作者的相关提交 |
--committer | 仅显示指定提交者的相关提交 |
--grep | 仅显示(提交说明中)包含指定关键字的提交 |
-S | 仅显示(代码中)添加或移除了某个关键字的提交 |
-- | 放在最后,用--分隔,后面跟一个path,仅显示这个path下文件的历史修改记录 |
例子:
git log --pretty="%h - %s" --author=gitster --since="2008-10-01" --before="2008-11-01"
git log -Sfunction_name
git log -- /opt/fes/
撤销操作
一、撤销commit
git commit --amend, 这个命令从根本上来说并没有进行撤销,它只是让某次提交操作不可见了,让history看起更好看些,有2个用法:
1. 上次commit后,没有进行任何操作,这时git commit --amend可以用来修改上次的提交说明,例如 git commit --amend -m "刚才提交说明写的有问题,现在重新写下提交说明"
2. 上次提交后,我们进行add操作,将某些文件加入了暂存区, 这时git commit --amend可以用来更新快照,同时上次提交信息会被隐藏起来,也可以写新的提交说明。 例子:git commit --amend -m "新的提交说明" 【需要注意的是,最后这次提交中包含了2次提交的变化】
二、从暂存区撤销
如果不小心将某个文件添加到了暂存区,没有关系我们可以用下面的命令,将其从暂存区撤销,所作的修改不会丢失。
git reset HEAD filename
三、撤销对工作区文件的修改
我们对某个文件修改后,未添加到暂存区之前,后悔了,希望将文件恢复到上次提交时的状态,注意所作修改会丢失哦
git checkout -- filename