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] 是一个危险的命令。 对文件做的任何修改都会消失,你只是拷贝了另一个文件来覆盖它。
除非你确实清楚不想要 那个文件了,否则不要使用这个命令!!
 
     
        