目录
写作的目的
在实际的工作中,可能会有相关命令查询的需求,但阅读相关文档太花时间,且不明确,本文将对 Git 相关的常用命令进行汇总整理,简要说明用途,便于查找。
针对人群
本文主要以查询手册为出发点,对 Git 常用命令进行整理,本文默认你已经了解 Git 版本控制,并会使用。如果你对以上所述还不了解,或是还为接触过 Git 版本控制可以去查看相关资料进一步学习,这篇文章不适合你。
Git 命令
git --version
查看 Git 版本
git --help
查看帮助
-a/--all
显示全部 Git 命令
<Git 命令>
显示相关命令的手册页
Git 配置
git config
您可以使用此命令查询/设置/替换/取消设置选项。名称实际上是由点分隔的部分和键,值将被转义。
--system
系统配置
--global
当前账户配置
-f, --file <file>
指定配置文件
--local
(默认值) 当前仓库配置
--replace-all
全部替换,默认只会替换一行,次命令将会替换所有匹配的项
--add
新增一项,这将添加一项,而不会改变任何已有的项
--get
获取给定键的值(可选地通过与值匹配的正则表达式进行过滤)。如果未找到密钥,则返回错误代码1;如果找到多个密钥值,则返回最后一个值。
--get-all
返回所有值
--get-regexp
将名称解释为正则表达式并写出键名。正则表达式匹配当前区分大小写,并且针对键的规范化版本完成,其中段和变量名称是小写的,但子段名称不是。
--remove-section
从配置文件中删除给定的部分
--rename-section
将给定部分重命名为新名称
--unset
从配置文件中删除与键匹配的行
--unset-all
从配置文件中删除与键匹配的所有行
-l/--list
列出配置文件中设置的所有变量及其值
--type <type>
git config将确保任何输入或输出在给定的类型约束下有效,并将以<type>
规范形式规范化传出值。
有效<type>
的包括:
bool
:将值规范化为“true”或“false”。int
:将值规范化为简单的十进制数。可选的k,m或g后缀 将使该值在输入时乘以1024,1048576或1073741824。bool-or-int
:根据bool或int规范化,如上所述。path
:通过添加领先。规范化~,它的值$HOME和 ~user主目录为指定的用户。设置值时,此说明符无效(但您可以git config section.variable ~/从命令行使用shell来执行扩展。)expiry-date
:通过从固定或相对日期字符串转换为时间戳来进行规范化。设置值时,此说明符无效。color
:获取值时,通过转换为ANSI颜色转义序列进行规范化。设置值时,将执行完整性检查以确保给定值可以作为ANSI颜色进行规范化,但它按原样编写。
--no-type
取消设置先前设置的类型说明符(如果之前已设置)。此选项请求git config不规范化检索到的变量。
-z/--null
对于输出值和/或键的所有选项,始终使用空字符(而不是换行符)结束值。使用换行符作为键和值之间的分隔符。这允许安全地解析输出而不会例如通过包含换行符的值混淆。
-e/--edit
打开编辑器以修改指定的配置文件
出错时,此命令将失败并显示非零状态。一些退出代码是:
- 部分或键无效(ret = 1),
- 没有提供部分或名称(ret = 2),
- 配置文件无效(ret = 3),
- 配置文件无法写入(ret = 4),
- 你试图取消一个不存在的选项(ret = 5),
- 您尝试取消设置/设置多行匹配的选项(ret = 5),或
- 您尝试使用无效的正则表达式(ret = 6)。
成功时,该命令返回退出代码0。
Git 配置常用命令
git config --global user.name "<name>"
设置要附加到提交事务的名称
git config --global user.email "<email address>"
设置要附加到提交事务的电子邮件
git config --global color.ui auto
启用命令行输出的有用颜色
git config core.ignorecase false
射者 git 区分文件名大小写
创建仓库
git init
创建新本地仓库
git init <project-name>
创建具有指定名称的新本地仓库
git clone <url>
克隆仓库
git clone --recurse-submodules <url>
以递归方式克隆现有仓库及其所有子模块
本地文件操作
git status
列出要提交的所有新文件或已修改文件
git diff
显示工作区和暂存区的文件差异
git diff [first-branch]...[second-branch]
显示两个分支之间的内容差异
git diff —staged
/ git diff —cached
比较 HEAD 和暂存区之间的文件差异
git add <file>
将文件中的所有当前更改添加到下一个提交
git add .
将所有当前更改添加到下一个提交
git add -u
将所有当前更改且已被 git 管理的文件添加到下一个提交
git add -p <file>
以交互方式将更改添加到下一个提交
git mv <file> <new file name>
重命名文件并将其添加到下一个提交
git rm <file>
删除文件并将其添加到下一个提交
git rm --cached <file>
从版本控制中删除该文件,但在本地保留该文件
git ls-files --other --ignored --exclude-standard
列出此项目中所有被忽略的文件
提交更改
git commit -m "<descriptive message>"
在版本历史记录中永久记录文件快照
git commit -a
提交跟踪文件中的所有本地更改,相当于运行 git add 把所有当前目录下的文件加入暂存区域再运行。git commit
git commit --amend
修改最近一次提交
git rebase -i <commit hash>
变基操作(不要修改已提交到公共仓库的提交,可能会导致仓库版本历史混乱)
提交历史
gitk
图形化界面展示版本信息
git log
显示当前分支所有提交历史
git log -p <file>
显示特定文件随时间的变化
git log --author=<committer name>
显示特定提交者随时间的变化
git log --pretty
指定使用完全不同于默认格式的方式展示提交历史
oneline
将每个提交放在一行显示format
可以定制要显示的记录格式
format
常用的格式占位符写法及其代表的意义
选项 | 说明 |
---|---|
%H | 提交对象(commit )的完整哈希字串 |
%h | 提交对象的简短哈希字串 |
%T | 树对象(tree )的完整哈希字串 |
%t | 树对象的简短哈希字串 |
%P | 父对象(parent )的完整哈希字串 |
%p | 父对象的简短哈希字串 |
%an | 作者(author )的名字 |
%ae | 作者的电子邮件地址 |
%ad | 作者修订日期(可以用-date= 定制格式) |
%ar | 作者修订日期,按多久以前的方式显示 |
%cn | 提交者(committer )的名字 |
%ce | 提交者的电子邮件地址 |
%cd | 提交日期 |
%cr | 提交日期,按多久以前的方式显示 |
%s | 提交说明 |
--pretty
常用的选项及其释义
选项 | 说明 |
---|---|
-p |
按补丁格式显示每个更新之间的差异 |
--word-diff |
按 word diff 格式显示差异 |
--stat |
显示每次更新的文件修改统计信息 |
--shortstat |
只显示--stat 中最后的行数修改添加移除统计 |
--name-only |
在提交信息后显示已修改的文件清单 |
--name-status |
显示新增、修改、删除的文件清单 |
--abbrev-commit |
仅显示SHA-1 的前几个字符,而非所有的40 个字符 |
--relative-date |
使用较短的相对时间显示 |
--graph |
显示ASCII 图形表示的分支合并历史 |
--pretty |
使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式) |
--oneline |
--pretty=oneline --abbrev-commit 的简化用法 |
限制输出长度
选项 | 说明 |
---|---|
-(n) |
仅显示最近的 n 条提交 |
--since, --after |
仅显示指定时间之后的提交 |
--until , --before |
仅显示指定时间之前的提交 |
--author |
仅显示指定作者相关的提交 |
--committer |
仅显示指定提交者相关 |
git log --grep=<string>
搜索(grep)提交给定字符串的消息
git blame <file>
谁在何时更改了文件中的那些内容
git show [commit]
输出指定提交的元数据和内容更改
几种不错的提交历史显示格式:
git log --all
查看所有分支的历史git log --all --graph
查看图形化的 log 地址git log --oneline
查看单行的简洁历史。git log --oneline -n4
查看最近的四条简洁历史。git log --oneline --all -n4 --graph
查看所有分支最近 4 条单行的图形化历史。git help --web log
跳转到git log 的帮助文档网页git log --pretty=format:"%h - %an, %ar : %s"
git log --pretty=format:"%h %s" --graph
## 分支
git branch
列出当前存储库中的所有本地分支
git branch <branch-name>
创建一个新分支
git checkout <branch-name>
切换到指定的分支并更新工作目录
git checkout <branch-name>
切换HEAD分支
git branch --track <new-branch> <remote-branch>
基于远程分支创建新的跟踪分支
git merge <branch>
将指定分支的历史记录合并到当前分支中
git merge --abort
取消合并
git branch -d <branch-name>
删除一个分支
git push origin --delete <branch>
删除远程分支
git branch -m <old name> <new name>
在本地重命名分支
git push <remote> :<old name>
git push <remote> <new name>
重命名远程分支
git push -f
强制提交(绝对不要使用,危害极大)
标签
git tag <tag-name>
标记当前提交
git push --tags
发布标签
代码冲突
git rebase <branch>
将当前的HEAD重新定位到分支上
git rebase --abort
中止一个变基
git rebase --continue
继续变基
git mergetool
使用配置的合并工具解决冲突
git add <resolved-file>
git rm <resolved-file>
使用编辑器手动解决冲突并将文件标记为已解决
暂存
git stash
隐藏存储更改
git stash apply
应用隐藏的更改
git stash pop
删除并应用隐藏的更改
git stash list
列出所有隐藏的变更集
git stash drop
丢弃最近隐藏的变更集
远端仓库
git remote -v
列出所有当前配置的远端仓库
git remote show <remote>
显示远端仓库信息
git remote add <remote> <url>
添加新的远端仓库
git remote rename <old-name> <new-name>
重命名一个远端仓库
git fetch <remote>
从远程下载所有更改,但不要合并到HEAD中
git fetch -p <remote>
从远程下载所有更改,但不要合并到HEAD并从源中清除已删除的分支
git pull <remote> <branch>
下载更改并直接合并到HEAD
git push <remote> <branch>
在远程上发布本地更改
git remote add --track <remote-branch> <remote> <url>
跟踪远程存储库
撤销
git reset HEAD
暂存区恢复成 HEAD
git reset --hard
/ git reset --hard HEAD
放弃工作目录中的所有本地更改
git reset [commit]
在[commit]之后撤消所有提交,在本地保留更改
git reset --hard [commit]
丢弃所有历史记录并更改回指定的提交
git checkout <file>
放弃特定文件的工作区更改并恢复暂存区文件到工作区
git checkout HEAD <file>
放弃特定文件中的本地更改
git checkout <commit> <file>
从先前的提交中还原特定文件
git revert <commit>
通过提供具有相反更改的新提交来还原提交
git checkout
用于对工作区的修改
git reset
用于对暂存区的修改
将HEAD指针重置为先前的提交
git reset --hard <commit>
恢复到指定的 commit(会丢弃 指定commit 之后的所有修改)git reset <commit>
将所有更改保留为未分级更改git reset --keep <commit>
保留未提交的本地更改
子模块
进行更改,提交和签出子模块文件
只需转到子模块目录并像往常一样使用git
git submodule
/ git submodule status
列出所有当前配置的子模块
git remote show <remote>
显示子模块信息
新增子模块
请注意您选择的子模块名称:如果使用正斜杠(/),git会认为您要删除子模块并希望添加子模块目录中的所有文件。请不要在子模块名称后面使用正斜杠。
- 执行
git submodule add -b <branch> --name <name> <repository-path-or-url>
- 将
.gitmodule
文件和子模块文件夹添加到上层项目索引中 - 提交上层项目上的两个文件
删除子模块
- 从
.gitmodules
文件中删除相关行 - 从
.git/config
中删除相关部分 - 执行
git rm --cached <submodule-path> (no trailing slash)
- 提交上层项目
- 删除现在未跟踪的子模块文件
克隆一个带有子模块的项目
git clone --recurse-submodules ssh://user@domain.tld/repo.git
或
- 向往常一样克隆项目
- 执行
git submodule init
初始化子模块 - 运行
git submodule update
让子模块在分离的HEAD上
git diff --submodule
查看子模块的所有变更
git submodule update --remote
将子模块更新为其各自分支上的最新更改
git submodule update --remote <submodule-name>
将特定子模块更新为其分支上的最新更改
git push --recurse-submodules=check
仅当同时推送所有子模块时,才将更改推送到上层项目
git push --recurse-submodules=on-demand
将更改推送到子模块,然后推送上层项目更改
git submodule foreach '<arbitrary-command-to-run>'
在每个子模块上运行任意命令
Git 底层
git cat-file
显示版本库对象的内容、类型及大小信息(blob, tree, commit, tag)
git cat-file -t <hash>
显示版本库对象的类型
git cat-file -s <hash>
显示版本库对象的大小
git cat-file -p <hash>
显示版本库对象的内容
Git 仓库的 .git
目录
HEAD
:指向当前的工作路径config
:存放本地仓库(local)相关的配置信息。refs/heads
: 存放分支refs/tags
: 存放tag,又叫里程牌 (当这次commit是具有里程碑意义的 比如项目1.0的时候 就可以打tag)objects
:存放对象 .git/objects/ 文件夹中的子文件夹都是以哈希值的前两位字符命名 每个object由40位字符组成,前两位字符用来当文件夹,后38位做文件。
Git 工作流
1. 删除远程分支的一次错误提交
删除已经提交的内容的操作较为危险,任何时候都不推荐使用
(1)git reset commitId,(注:不要带–hard)到上个版本
(2)git stash,暂存修改
(3)git push –force, 强制push,远程的最新的一次commit被删除
(4)git stash pop,释放暂存的修改,开始修改代码
(5)git add . -> git commit -m “massage” -> git push
或(这种操作有同时导致本地修改丢失的风险)
(1)git reset –hard HEAD~1
(2)git push –force 将本次变更强行推送至服务器。这样在服务器上的最后一次错误提交也彻底消失了。
2. 添加项目的部分文件(目录)到指定的分支
前提条件:要添加的文件已存在并且不能被 gitignore 屏蔽
(1) 删除相应远程分支(如果存在):git push origin --delete <branch>
(2) 将文件推送到指定的远程分支:git subtree push --prefix=<file> origin <branch>
<file>
:文件名/目录名
<branch>
:分支名,未建立,会在提交时自动建立,一般为 gh-pages
(推荐)
3. 提交时提示本地分支晚于远程分支
git remote add origin <远程仓库地址>
git fetch origin
获取远程更新
git merge origin/master
把更新的内容合并到本地分支
之后就可以正常提交了
4. 删除错误提交到远端仓库的文件
git rm --cached <file-name>
git commit -m "delete file"
git push
Git 常见错误
Github
Gitter for GitHub - 可能是目前颜值最高的GitHub小程序客户端
Github API
参考链接
GIT CHEAT SHEET
图解 Git
Git Git 官方中文文档
延伸:
GotGit 《Git权威指南》 | Github
Repo | 英文资料
版本控制的前世和今生
.gitignore