常用 Git 命令¶
一般来说,日常使用 Git 只要记住下图的几个命令,就可以了。但是要使用复杂的功能,恐怕要记住60~100个命令。
下面是整理的常用 Git 专用名词的译名。
Workspace: | 工作区 |
---|---|
Index / Stage: | 暂存区 |
Repository: | 仓库区(或本地仓库) |
Remote: | 远程仓库 |
一、配置¶
Git 自带一个 git config
的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:
- /etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置。如果使用带有 --system 选项的 git config 时,它会从此文件读写配置变量。
- ~/.gitconfig 或 ~/.config/git/config 文件: 只针对当前用户。可以传递 --global 选项让 Git 读写此文件。
- 当前使用仓库的 Git 目录中的 config 文件(就是 .git/config): 针对该仓库。
每一个级别覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig
中的配置变量。
# 设置提交代码时的基本信息
# 如果使用了 --global 选项,那么在以后的修改、提交中,Git 都会使用这些配置
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"
# 显示当前的 Git 配置
$ git config --list
# 显示 user.name 的配置
$ git config user.name
# 编辑 Git 配置文件
$ git config -e [--global]
# 设置默认的文本编辑器
$ git config --global core.editor vim
二、新建/克隆仓库¶
有两种获得 Git 项目仓库的方法。第一种是在现有项目或目录下导入文件到 Git 中; 第二种是从一个服务器克隆一个现有的 Git 仓库。
# 在当前目录新建一个 Git 代码库
# 会创建一个 .git 的子目录,这个子目录包含 Git 仓库所有的文件。
$ git init
# 新建一个目录,将其初始化为Git代码库
$ git init [project-name]
# 克隆一个项目
$ git clone [url]
# 克隆一个项目并重命名
$ git clone [url] [git-name]
三、添加/删除文件¶
# 添加当前目录的所有文件到暂存区
$ git add .
# 将文件修改添加到暂存区
$ git add [file1] [file2] ...
# 删除文件,并更新到暂存区
$ git rm [file1] [file2] ...
# 删除文件(忽略文件),但该文件会保留在工作区
$ git rm --cached [file]
# 重命名文件,并更新到暂存区
$ git mv [file-original] [file-renamed]
# 显示被跟踪的文件状态
$ git status
四、提交文件到本地仓库¶
# 提交暂存区的文件到仓库区,并输入简单说明
$ git commit -m [message]
# 提交暂存区的指定文件到仓库区,并输入简单说明
$ git commit [file1] [file2] ... -m [message]
# 提交工作区的所以文件到仓库区
$ git commit -a
# 使用新的commit,代替上一次提交
# 如果代码没有任何变化,只改写上一次commit的提交信息
$ git commit --amend -m [message]
# 显示commit历史
$ git log
五、撤销¶
注解
Git 有些撤消操作是不可逆的。在使用 Git 的撤销时,可能会因为操作失误而导致之前的工作丢失。
# 恢复暂存区的所有文件到工作区,可指定文件名
$ git checkout .
# 恢复某个commit的指定文件到暂存区和工作区
$ git checkout [commit] [file]
# 回退到上一次提交,可指定哈希值
$ git reset --hard [Hash]
# 重置暂存区,与上一次提交保持一致,但工作区内容不变,可指定哈希值或文件名
$ git reset [file]
# 新建一个commit,用来撤销指定commit
# 后者的所有变化都将被前者抵消,并且应用到当前分支
$ git revert [commit]
六、分支¶
# 列出所有本地分支
$ git branch
# 列出所有远程分支
$ git branch -r
# 列出所有本地分支和远程分支
$ git branch -a
# 新建分支,停留在当前分支
$ git branch [branch-name]
# 新建分支,并切换到该分支
$ git checkout -b [branch]
# 根据指定提交版本,新建分支
$ git branch [branch] [commit]
# 切换到指定分支,并更新工作区
$ git checkout [branch-name]
# 建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch]
# 合并指定分支到当前分支
$ git merge [branch]
# 选择一个commit,合并进当前分支
$ git cherry-pick [commit]
# 删除分支
$ git branch -d [branch-name]
# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
七、远程仓库¶
远程仓库是指托管在因特网或其他网络中的项目的版本库。你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写。与他人协作涉及管理远程仓库以及根据需要推送或拉取数据。
# 拉取远程仓库的变化,并与本地分支合并
$ git pull [remote] [branch]
# 拉取远程仓库的所有变动
$ git fetch [remote]
# 显示所有远程仓库
$ git remote -v
# 显示某个远程仓库的信息
$ git remote show [remote]
# 增加一个新的远程仓库,并命名
$ git remote add [shortname] [url]
# 推送本地指定分支到远程仓库
$ git push [remote] [branch]
# 强行推送当前分支到远程仓库,即使有冲突
$ git push [remote] --force
# 推送所有分支到远程仓库
$ git push [remote] --all
# 重命名远程仓库
$ git remote rename [original] [renamed]
# 删除远程仓库
$ git remote rm paul
# 生成一个可供发布的压缩包
$ git archive
八、查看信息¶
# 显示被跟踪的文件状态
$ git status
# 显示简洁的信息
# ?? 表示未跟踪的文件、A 表示新添加到暂存区的文件
# M 表示文件已被修改,在左边是已更新到暂存区,在右边是还没有更新到暂存区
$ git status -s
# 显示commit历史
$ git log
# 显示每次提交的内容差异,也可以指定文件名,还可以指定提交的次数
$ git log -p [file]
$ git log -p -2
# 显示commit历史,以及提交时变更过的文件
$ git log --stat
# 搜索提交历史,根据关键词
$ git log -S [keyword]
# 显示指定文件的详细修改信息
$ git blame [file]
# 显示暂存区和工作区的差异
$ git diff [file]
# 显示暂存区和仓库区的差异
$ git diff --cached [file]
# 显示工作区和仓库区的差异
$ git diff HEAD
# 显示最近的几次提交
$ git reflog
# 列出所有本地分支
$ git branch
# 列出所有远程分支
$ git branch -r
# 列出所有本地分支和远程分支
$ git branch -a
# 显示所有远程仓库
$ git remote -v
# 显示某个远程仓库的信息
$ git remote show [remote]
九、标签¶
Git 使用两种主要类型的标签:轻量标签(lightweight)与附注标签(annotated)。
一个轻量标签很像一个不会改变的分支,它只是一个特定提交的引用。
然而,附注标签是存储在 Git 数据库中的一个完整对象。它们是可以被校验的,其中包含打标签者的名字、电子邮件地址、日期时间,还有一个标签信息;并且可以使用 GNU Privacy Guard (GPG)签名与验证。 通常建议创建附注标签,这样你可以拥有以上所有信息。
# 创建一个附注标签,并设定标签信息
$ git tag -a v1.4 -m 'my version 1.4'
# 创建一个轻量标签
$ git tag v1.4-lw
# 删除本地tag
$ git tag -d [tag]
# 列出所有tag
$ git tag
# 查看标签信息
$ git show v1.4
# 删除远程tag
$ git push origin :refs/tags/[tagName]
# 新建一个分支,指向某个tag
$ git checkout -b [branch] [tag]
十、Git 别名¶
别名可以使 Git 输入命令更简单、容易。Git 并没有命令自动补全的功能,如果不想每次都输入完整的 Git 命令,可以通过 git config 文件来轻松地为每一个命令设置一个别名。
# 设置 git commit 的别名为 git ci
$ git config --global alias.ci commit
# 设置 git status 的别名为 git st
$ git config --global alias.st status
十一、忽略文件¶
通常软件都会自动生成一些文件,比如日志文件,或者编译过程中产生的临时文件等,这些文件一般无需纳入 Git 的管理。可以在项目的根目录下创建一个名为 .gitignore
的文件使 Git 忽略指定的文件,.gitignore
的格式规范如下:
- 所有空行或者以
#
开头的行都会被 Git 忽略。 - 可以使用标准的 glob 模式匹配。
- 匹配模式可以以
/
开头防止递归。 - 匹配模式可以以
/
结尾指定目录。 - 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号
!
取反。
$ cat .gitignore
# 忽略所有的 . 开头文件
.*
# 忽略所有以 .o 或 .a 结尾的文件
*.[oa]
# 忽略所有以波浪符(~)结尾的文件,许多文本编辑软件都用这样的文件名保存副本。
*~
# 跟踪 lib.a 文件, 即使已经忽略了所以的 .a 结尾的文件
!lib.a
# 只忽略当前目录下的 TODO 文件
/TODO
# 忽略 build 目录中的所有文件
build/
# 忽略 doc 目录下的以 .txt 结尾的文件(不递归处理)
doc/*.txt
# 忽略 doc 目录下的所有以 .pdf 结尾的文件(递归处理)
doc/**/*.pdf
十二、获得帮助¶
# 有三种方法可以找到 Git 命令的使用手册:
$ git help <verb>
$ git <verb> --help
$ man git-<verb>