git status
命令的输出十分详细,但其用语有些繁琐。
可以使用 git status -s
命令或 git status --short
命令,得到一种更为紧凑的格式输出。
输出如下:
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
??
:新添加的未跟踪文件前面有 ?? 标记,
A
:新添加到暂存区中的文件前面有 A 标记,
M
:修改过的文件前面有 M 标记。
MM
:右边的 M 表示该文件被修改了但是还没放入暂存区,左边的 M 表示文件被修改了并放入了暂存区。
对一些无需使用Git管理的文件,可以使用.gitignore
来进行管理
*
匹配零个或多个任意字符;
[abc]
匹配任何一个列在方括号中的字符([abc]
就是要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);
?
匹配一个任意字符;
[字符-字符]
方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配 ( [0-9]
表示匹配所有 0 到 9 的数字);
**
表示匹配任意中间目录,比如a/**/z
可以匹配 a/z, a/b/z 或 a/b/c/z等。
# 以a为后缀的文件
*.a
# 排除lib.a(因为上面忽略了全部.a后缀的的内容)
!lib.a
# 忽略当前路径下的TODO文件(注意是当前路径,不会递归查找)
/TODO
# 忽略build文件夹下的全部文件(注意是全项目路径,会递归查找)
build/
# 获取doc文件夹下的全部以txt为后缀的文件
doc/*.txt
# 忽略doc文件夹里面的全部pdf文件(不管doc文件夹下有几个文件夹,文件夹里面的pdf都会被忽略)
doc/**/*.pdf
GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表,可以在 https://github.com/github/gitignore 找到它.
我们新建一个.gitignore
文件,并且输入 *.txt
,把它commit到git仓库管理。
然后我们新建一个txt文件并用add添加它
忽略txt
我们新建一个文件1.py
并把它提交至本地仓库,然后我们修改它,再使用git status
查看
修改文件
git会提示你,1.py文件被修改了,但是我们并不能看到它修改了什么
这时候使用git diff
就可以看到具体的修改了
查看修改
此命令比较的是工作目录中当前文件(b/1.py
)和暂存区域快照(a/1.py
)之间的差异。可以看到绿色部分+print("学习Git")
也就是修改之后还没有暂存起来的变化内容。当然很多编辑器中都集成了文件对比。
以Pycharm为例,文件一行中新增内容,当前行之前会多一个绿色的小块
文件差异
已存在的内容修改,当前行之前会多一个蓝色的小块,点击可以看到修改前的内容
修改存在的内容
也可以使用Compare with the Same Repository Version
来查看变更
Compare with the Same Repository Version的位置
Compare with the Same Repository Version
暂存区是一个很好的设计,但是每次对修改的提交都需要再加一遍暂存区就有点繁琐了。
可以使用git commit -a -m '描述信息'
来跳过文件修改时候的添加暂存区
跳过暂存区
在Linux中一般移动和重命名都是使用的mv操作,Git是Linux的创建者Linus写的,所以它也是用mv来完成这个操作。
我们新建一个文件夹后把1.py移动到这个文件夹之下git mv 1.py test/1.py
使用git status可以看出它告诉我们,我们重命名了一个文件
改变文件位置
我们再把1.py从test中拿回来,再改名为2.py使用git status可以看出它告诉我们,我们重命名了一个文件并且它是从1.py重命名过去的,也就是git是使用的最开始的记录进行对比变更的。
重命名
根据之前的学习,如果要实现重命名文件需要执行以下操作:
mv 1.py 2.py
git rm 1.py
git add 2.py
所以git mv
相当于执行了三句命令
使用git log
可以看到提交的历史
查看历史
它有几个拓展的命令
-<num>
:查看最近的提交
git log -2
查看最近两次的提交
查看最近两次的提交
可以查看每次提交的下面列出所有被修改过的文件、有多少文件被修改了以及被修改过 的文件的哪些行被移除或是添加了,在每次提交的最后还有一个总结。
image-20190331104406273
pretty
支持多种格式:oneline
,short
,full
,fuller
,format
oneline
short
full
fuller
format可以让内容按照格式输出
例如:git log --pretty=format:"%h - %an, %ar : %s"
格式化输出
选项 | 说明 |
---|---|
%H | 提交对象的完整哈希字串 |
%h | 提交对象的简单哈希字串 |
%T | 树对象的完整哈希字串 |
%t | 树对象的简单哈希字串 |
%P | 父对象的完整哈希字串 |
%p | 父对象的**简单哈希字串 |
%an | 作者名字 |
%ae | 作者邮箱 |
%ad | 作者修订日期 |
%ar | 修订日期,多久以前 |
%cn | 提交者姓名 |
%ce | 提交者邮箱 |
%cd | 提交日期 |
%cr | 提交日期,多久以前 |
%s | 提交说明 |
在使用GitHub/Gitlab等Git管理服务器进行协作的时候,一般都需要通过审核才能将代码合入,所以作者和提交者(合入者)很有可能不是一个人。
选项 | 说明 |
---|---|
-p | 按补丁格式显示每个更新之间的差异 |
—stat | 显示每次更新的文件修改信息 |
—shortstat | 显示—stat中最后的行数修改添加移除的统计 |
—name-only | 仅在提交信息后显示已修改的文件清单 |
--name-status | 显示新增/修改/删除的文件清单 |
—abbrev-commit | 仅显示SHA-1的前几个字符 |
—relative-date | 使用比较短的相对时间显示(比如"2 weeks ago") |
—graph | 显示ASCII图形表示的分支合并历史 |
—pretty | 使用其他格式显示 |
--graph
比较重要,在后续工作使用中,会有很多分支的拉出和合并,需要对分支历史有一个直观的展示,不过现在没有例子,在之后分支部分再讲好了。
选项 | 说明 |
---|---|
-(n) | 仅显示最近的 n 条提交 |
--since, --after | 仅显示指定时间之后的提交。 |
--until, --before | 仅显示指定时间之前的提交。 |
--author | 仅显示指定作者相关的提交。 |
--committer | 仅显示指定提交者相关的提交。 |
--grep | 仅显示含指定关键字的提交 |
-S | 仅显示添加或移除了某个关键字的提交 |
注意⚠️:有些撤消操作是不可逆的!可以会因为操作失误而导致之前的工作丢失。
使用git commit --amend
尝试重新提交
--amend
弹出提交信息,修改提交信息后保存提交后修改
弹出的修改信息
再次查看
最终只会有一个提交,第二次提交将代替第一次提交的结果。
从提交后查看状态的提示信息可以看出,我们可以使用 git reset HEAD <文件>...
以取消暂存
取消暂存
我们把上一个例子中的1_1.py文件提交之后再进行修改,先不要加入暂存区,现在我们不要这个修改了,根据它的提示,我们使用 git checkout -- <文件>...
丢弃工作区的改动
修改
恢复
⚠️git checkout -- [file] 是一个危险的命令。 对文件做的任何修改都会消失,你只是拷贝了另一个文件来覆盖它。 除非你确实清楚不想要 那个文件了,否则不要使用这个命令!!