原文链接: Inspecting a repository
git status
命令展示了工作目录和暂存区的状态,让我们查看已经暂存和尚未被暂存的改动,已经未被 Git 追踪的文件。该命令的输出并 不展示任何提交到项目历史的信息 。如果需要展示项目历史的相关信息应该使用 git log
命令。
git status
该命令展示了已暂存、未暂存和未跟踪的所有文件。
git status
命令是一个相当直截了当的命令,它直接展示了 git add
和 git 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 status
命令各司其职,后者用于检查工作目录和暂存区域,而前者仅对提交历史记录进行操作。
命令的输出可以通过多种方式进行自定义,通过使用一些简单过滤就可以让输出变为完全自定义的格式。下面列出了一些常见的 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 总和校验码。这样做有两个目的:
这个 ID 可以用在诸如 git log <since>..<until>
的命令中用于指代一次特定的提交。比方说 git log 3157e..5ab91
命令就会展示 ID 在 3157e
和 5ab91
之间的所有提交。除了使用总和校验码,分支名称(在 分支模型 这一章里有详述)和 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