Git 常用命令整理
基本概念
- 工作区:简单理解就是在你的物理磁盘上能直接看见的文件
- 暂存区:暂存区就是一个对已经修改了的文件进行存放(标记)的区域(文件)一般存放在
.git目录下
下的index文件(.git/index)中,所以有时也被称作为索引。 - 版本库:也叫Git仓库,是Git用来保存项目的元数据和对象数据库的地方。这是Git中最重要的部分,在工作区的隐藏目录下。
准备工作
这里就不介绍如何安装Git了,如果你还没有安装或者不会安装,请看这里。
Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:
/ect/gitconifg
文件(Git的安装目录下):包含系统上每一个用户及他们仓库的通用配置。使用git config -e --system
命令读写配置变量~/.gitconfig 或 ~/.config/git/config
文件(当前用户目录下):只针对当前用户。 使用git config -e --global
命令读写配置变量。.git/config
文件(Git仓库下):当前Git仓库下的配置文件,只针对该仓库。使用git config -e
命令读写配置变量。
用户信息
当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。
这样做很重要,因为每一个 Git 的提交都会使用这些信息,并且它会写入到你的每一次提交中,不可更改:
$ git config --global user.name "your name"
$ git config --global user.email "[email protected]"
编辑器
这一步其实都没那么重要,但是如果你还不知道Vim
是什么,还是有必要知道这个命令的:
# 这里使用记事本作为默认编辑器
$ git config --global core.editor notepad
检查配置信息
查看你对Git所做的所有配置:
$ git config --list
查看你对Git所做的某一项配置:
$ git config <key>
$ git config user.name
max
获取帮助
若你使用 Git 时需要获取帮助,
# verb 指某个git命令
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
例如要想获得 config 命令的手册,执行:
$ git help conifg
获取Git仓库
获取Git仓库有两种方式: 第一种是在现有项目或目录下导入所有文件到 Git 中; 第二种是从一个服务器克隆一个现有的 Git 仓库。
在现有目录中初始化仓库
$ git init
克隆现有的仓库
$ git clone [url]
$ git clone git@github.com:Hooooliday/HelloWorld.git # 克隆我的Github上的项目
需要注意的有两点:
- 使用
git clone
命令时,远程Git仓库中的每一个文件每一个版本都会拉取下来。 - 该命令会在本地直接创建一个父文件夹。
如果需要自定义仓库名,使用命令:
$ git clone [url] rename
常见状态
请记住,你工作目录下的每一个文件都不外乎这两种状态:已跟踪或未跟踪。已跟踪的文件是指那些被纳入了版本控制的文件, 在上一次快照中有它们的记录。工作目录下的未跟踪文件,他们既不存在于上次快照中,也没放入暂存区。初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。
使用Git时,文件生命周期如下:
检查文件状态
要查看哪些文件处于什么状态,使用命令:
$ git status
On branch master
nothing to commit, working directory clean
上面的两条输出告诉我们:
- 所有已跟踪文件在上次提交后都未被更改过,而且当前目录下没有任何处于未跟踪状态的新文件。
- 还显示了当前所在分支,并告诉你这个分支同远程服务器上对应的分支没有偏离。
跟踪文件
上面那个标题并不能完整的概括该命令的功能,还有的功能:
- 把已跟踪的文件放到暂存区
- 开始跟踪新文件
- 合并时把有冲突的文件标记为已解决状态
$ git add <file>
git add 命令可以使用文件或目录的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件。
简化输出
git status 命令的输出十分详细,但其用语有些繁琐。 使用--short
或者是-s
参数,简化该命令的输出
$ git status -s
M README # README 文件在工作区被修改了但是还没有将修改后的文件放入暂存区
MM Rakefile # 在工作区被修改并提交到暂存区后又在工作区中被修改了,所以在暂存区和工作区都有该文件被修改了的记录。
A lib/git.rb # 新暂存的文件。
M lib/simplegit.rb # lib/simplegit.rb 文件被修改了并将修改后的文件放入了暂存区
?? LICENSE.txt # 未跟踪的文件
- 新添加的未跟踪文件前面有 ?? 标记
- 新添加到暂存区中的文件前面有 A 标记
- 修改过的文件前面有 M 标记。
你可能注意到在上面的输出中,M 有两个可以出现的地方。出现在右边的 M 表示该文件被修改了但是还没放入暂存区,出现在靠左边的 M 表示该文件被修改了并放入了暂存区。
查看差异
查看尚未暂存的文件的修改部分:
$ git diff
此命令比较的是工作目录中当前文件和暂存区域快照之间的差异, 也就是修改之后还没有暂存起来的变化内容。
查看已暂存的文件:
$ git diff --cached # 或者使用 --staged选项,效果是相同的。
需要注意的是:git diff 本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动。 所以有时候你一下子暂存了所有更新过的文件后,运行 git diff 后却什么也没有,就是这个原因。
提交更新
当确认暂存区已经准备妥当可以提交时,使用命令:
$ git commit -m "Remark"
其中-m
选项后面的remark表示对这次提交的描述。
请记住:每一次运行提交操作,都是对你项目作一次快照,以后可以回到这个状态,或者进行比较。
跳过使用暂存区域
尽管使用暂存区域的方式可以精心准备要提交的细节,但有时候这么做略显繁琐。 Git 提供了一个跳过使用暂存区域的方式, 只要在提交的时候,给 git commit
加上 -a
选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交.
$ git commit -a -m "Remark"
查看提交历史
在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史,使用命令:
$ git log
默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面。
其中包括每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明。
有时候我们需要简化输出,来寻找所需要的提交。下面介绍几个较为常用的:
显示差异
$ git log -p -n
-p
选项,用来显示每次提交的内容差异-n
选项,其中 n 表示数字,用来显示前 n 次提交
查看每次提交的简略的统计信息
# 这个命令通常在需要浏览搭档提交的Commit所带来的变化,极为有用。
$ git log --stat -n
指定格式输出
[option] => oneline | short | full | fuller
$ git log --pretty = [option]
查看某个文件的修改历史
$ git log --pretty = oneline filename
查看某次提交的具体内容
$ git show commitID
还有:format,可以定制要显示的记录格式。
# 这里的几个格式占位符,表示format常用选项。
# 其中 %an 表示作者(author)的名字,%cn提交者(committer)的名字.
# 区别在于:作者指的是实际作出修改的人,提交者指的是最后将此工作成果提交到仓库的人。
$ git log --pretty=format:"%h - %an, %ar : %s, - %cn"