转载

Git大拿之路 : 检查仓库

Git大拿之路 : 检查仓库

原文链接: Inspecting a repository

git status

git status 命令展示了工作目录和暂存区的状态,让我们查看已经暂存和尚未被暂存的改动,已经未被 Git 追踪的文件。该命令的输出并 不展示任何提交到项目历史的信息 。如果需要展示项目历史的相关信息应该使用 git log 命令。

使用

git status 

该命令展示了已暂存、未暂存和未跟踪的所有文件。

详述

git status 命令是一个相当直截了当的命令,它直接展示了 git addgit commit 的运行情况。展示的状态信息还包含对已暂存和未暂存文件的相关说明。 git status 执行时的输出包含如下所示的三个类别:

# On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: hello.py # # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: main.py # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # hello.pyc 

忽略的文件

未跟踪的文件通常分为两种:未被添加到项目(即使用 git add )或未被提交到项目中(即使用 git commit )的文件,或者诸如 .pyc .obj .exe 等编译为二进制的文件。将前者显示到 git status 的输出中是十分有益的,但如果显示后者的话会给我们观察仓库的状态造成一些困扰。

因此 Git 允许我们完全忽略掉这些文件,实现的方式是将要忽略的文件路径写入名为 .gitignore 的特殊文件中。我们可以在单独一行中写上任何要忽略的文件, * 符号可以被当做通配符使用。例如,将 *.pyc 添加到项目根目录的 .gitignore 文件中可以防止编译后的 Python 模块出现在 git status 的展示中。

示例

在提交更改之前检查仓库状态是一个好习惯,这样我们就不会把不想提交的东西不小心提交上去。这个例子展示了在暂存和提交一个快照之后的仓库状态:

# Edit hello.py git status # hello.py is listed under "Changes not staged for commit" git add hello.py git status # hello.py is listed under "Changes to be committed" git commit git status # nothing to commit (working directory clean) 

第一个状态输出会展示文件没有被暂存, git add 之后的状态将会被反映在下一个 git status 命令中,最终的状态输出会告诉你并无可提交文件,工作目录会匹配到最近的提交。一些 Git 命令(例如 git merge )需要工作目录是 干净的(clean) 以免不小心覆盖更改。

git log

git log 命令展示了提交的快照。该命令允许你列出项目历史记录并进行过滤,以及寻找特定的提交。该命令与 git status 命令各司其职,后者用于检查工作目录和暂存区域,而前者仅对提交历史记录进行操作。

Git大拿之路 : 检查仓库

命令的输出可以通过多种方式进行自定义,通过使用一些简单过滤就可以让输出变为完全自定义的格式。下面列出了一些常见的 git log 的配置项:

使用

git log 

该命令表示使用默认的格式展示全部的提交历史。如果输出结果占据了超过一屏的容量,你可以使用 空格 滚屏或按 q 退出。

git log -n <commit> 

该命令表示通过 <commit> 来限制显示提交的数量,例如 git log -n 3 表示仅展示 3 条提交。

git log --oneline 

该命令表示将每条提交浓缩为一行。这有利于对项目历史记录进行高层次的概览。

git log --stat 

该命令除去普通 git log 命令展示的内容之外,还包含了更改的文件及其增删行数等信息。

git log -p 

该命令展示了代表每次提交生成的补丁。包含了每次提交的全部 diff 结果,这也是我们在项目历史中可以获取的最详细的视图表示。

git log --author="<pattern>" 

该命令表示查找特定作者的提交。 <pattern> 参数可以是普通的字符串也可以是正则表达式。

git log --grep="<pattern>" 

该命令表示查找包含匹配 <pattern> 的特殊提交信息的提交, <pattern> 参数可以是普通的字符串也可以是正则表达式。

git log <since>..<until> 

该命令表示展示 <since><until> 的提交。这两个参数均可以是提交的 ID、分支名、 HEAD 或者任何形式的 修订版本引用 。

git log <file> 

该命令仅显示包含特定文件的提交,这是一个便捷的查看特定文件提交历史的方式。

git log --graph --decorate 

上面的命令展示了一些有用的命令参数, --graph 参数会在提交信息左侧用文本绘制一个图形; --decorate 参数给展示的提交添加了分支名称或者 tag 号。

详述

git log 命令是 Git 浏览仓库历史的一个基本工具。他可以用来帮助我们找到项目的一个特定版本;当要合并一个实现新特性的分支时查看该分支的改动情况;还可以用来查看那个开发人员在磨洋工。

commit 3157ee3718e180a9476bf2e5cab8e3f1e78a73b7 Author: John Smith 

尽管上面的内容直截了当,但是第一行我们还是得解释一下。这行提交后产生的 40 个字符的字符串是提交内容的 SHA-1 总和校验码。这样做有两个目的:

  1. 保证了提交的完整性 —— 如果提交内容有损坏,提交就会生成不同的总和校验码。
  2. 给每次提交生成了唯一的 ID。

这个 ID 可以用在诸如 git log <since>..<until> 的命令中用于指代一次特定的提交。比方说 git log 3157e..5ab91 命令就会展示 ID 在 3157e5ab91 之间的所有提交。除了使用总和校验码,分支名称(在 分支模型 这一章里有详述)和 HEAD 关键字也是可以指代特定提交的通用方法。 HEAD 总是指代当前提交(是一个分支或者是一个特定的提交)。

~ 字符是用来表示一个提交的父提交。比如说 3157e~1 指代 3157e 提交的前一个提交,而 HEAD~3 则表示当前提交的曾祖提交。

所有的这些标示方法都是为了能让我们操作特定的提交。 git log 命令就是我进进行操作的起始命令,以便我们找到想操作的特定提交。

示例

在使用的章节我们提供了很多使用 git log 的例子,但要记住多个命令参数是可以在一个命令中联合使用的。

git log --author="John Smith" -p hello.py 

这将会展示 John Smith 对文件 hello.py 所做改动的全部 diff。

.. 双点语法是比较分支的利器,下一个例子展示了如何查看所有在 som-feature 上独有而 master 上没有的提交。

git log --oneline master..some-feature 
正文到此结束
Loading...