Git基础知识(二)
文件状态
####git status和git status -s
git status
命令的输出十分详细,但其用语有些繁琐。
可以使用 git status -s
命令或 git status --short
命令,得到一种更为紧凑的格式输出。
输出如下:
1 | M README |
??
:新添加的未跟踪文件前面有 ?? 标记,
A
:新添加到暂存区中的文件前面有 A 标记,
M
:修改过的文件前面有 M 标记。
MM
:右边的 M 表示该文件被修改了但是还没放入暂存区,左边的 M 表示文件被修改了并放入了暂存区。
README 文件在工作区被修改了但是还没有将修改后的文件放入暂存区
lib/simplegit.rb 文件被修改了并将修改后的文件放入了暂存区。
Rakefile 在工作区被修改并提交到暂存区后又在工作区中被修改了,所以在暂存区和工作区都有该文件被修改了的记录。
忽略文件
对一些无需使用Git管理的文件,可以使用.gitignore
来进行管理
所有空行或者以 # 开头的行都会被 Git 忽略。
可以使用标准的 glob 模式匹配。( glob 模式是指 shell 所使用的简化了的正则表达式。 )
匹配模式可以以(/)开头防止递归。
匹配模式可以以(/)结尾指定目录。
要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
*
匹配零个或多个任意字符;[abc]
匹配任何一个列在方括号中的字符([abc]
就是要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);?
匹配一个任意字符;[字符-字符]
方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配 ( [0-9]
表示匹配所有 0 到 9 的数字);**
表示匹配任意中间目录,比如a/**/z
可以匹配 a/z, a/b/z 或 a/b/c/z等。
1 | # 以a为后缀的文件 |
GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表,可以在 https://github.com/github/gitignore 找到它.
我们新建一个.gitignore
文件,并且输入 *.txt
,把它commit到git仓库管理。
然后我们新建一个txt文件并用add添加它
查看已暂存和未暂存的修改
我们新建一个文件1.py
并把它提交至本地仓库,然后我们修改它,再使用git status
查看
git会提示你,1.py文件被修改了,但是我们并不能看到它修改了什么
这时候使用git diff
就可以看到具体的修改了
此命令比较的是工作目录中当前文件(b/1.py
)和暂存区域快照(a/1.py
)之间的差异。可以看到绿色部分+print("学习Git")
也就是修改之后还没有暂存起来的变化内容。当然很多编辑器中都集成了文件对比。
以Pycharm为例,文件一行中新增内容,当前行之前会多一个绿色的小块
已存在的内容修改,当前行之前会多一个蓝色的小块,点击可以看到修改前的内容
也可以使用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是使用的最开始的记录进行对比变更的。
根据之前的学习,如果要实现重命名文件需要执行以下操作:
1 | mv 1.py 2.py |
所以git mv
相当于执行了三句命令
git log
使用git log
可以看到提交的历史
它有几个拓展的命令
-<num>
:查看最近的提交
git log -2
查看最近两次的提交
git log –stat
可以查看每次提交的下面列出所有被修改过的文件、有多少文件被修改了以及被修改过 的文件的哪些行被移除或是添加了,在每次提交的最后还有一个总结。
git log –pretty=XXXXX
pretty
支持多种格式:oneline
,short
,full
,fuller
,format
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管理服务器进行协作的时候,一般都需要通过审核才能将代码合入,所以作者和提交者(合入者)很有可能不是一个人。
git log的常用选项
选项 | 说明 |
---|---|
-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] 是一个危险的命令。 对文件做的任何修改都会消失,你只是拷贝了另一个文件来覆盖它。
除非你确实清楚不想要 那个文件了,否则不要使用这个命令!!