Git 命令简单使用¶
常见的 Git 命令¶
开始一个工作区(参见:git help tutorial)
clone 克隆仓库到一个新目录
init 创建一个空的 Git 仓库或重新初始化一个已存在的仓库
在当前变更上工作(参见:git help everyday)
add 添加文件内容至索引
mv 移动或重命名一个文件、目录或符号链接
restore 恢复工作区文件
rm 从工作区和索引中删除文件
sparse-checkout 初始化及修改稀疏检出
检查历史和状态(参见:git help revisions)
bisect 通过二分查找定位引入 bug 的提交
diff 显示提交之间、提交和工作区之间等的差异
grep 输出和模式匹配的行
log 显示提交日志
show 显示各种类型的对象
status 显示工作区状态
扩展、标记和调校您的历史记录
branch 列出、创建或删除分支
commit 记录变更到仓库
merge 合并两个或更多开发历史
rebase 在另一个分支上重新应用提交
reset 重置当前 HEAD 到指定状态
switch 切换分支
tag 创建、列出、删除或校验一个 GPG 签名的标签对象
协同(参见:git help workflows)
fetch 从另外一个仓库下载对象和引用
pull 获取并整合另外的仓库或一个本地分支
push 更新远程引用和相关的对象
版本回退¶
# 查看提交记录
$ git log --pretty=oneline
$ git log --graph --pretty=oneline --abbrev-commit
# 上一个版本是HEAD^,上上一个版本是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
$ git reset --hard HEAD^
# 根据 commit id 到指定版本
$ git reset --hard e475afc93
# 查看历史命令
$ git reflog
修改文件¶
# 查看工作区和版本库里面最新版本的区别
$ git diff HEAD -- file-name
# 丢弃工作区的修改,就是让文件回到最近一次git commit或git add时的状态
$ git checkout -- file-name
# 把暂存区的修改撤销掉(unstage),重新放回工作区
$ git reset HEAD file-name
删除文件¶
$ git rm file-name
# 恢复误删除问题
$ git checkout -- file-name
关联远程库¶
# 关联远程 github 库
$ git remote add origin git@github.com/TenderLeeks/Documentation.git
# 把本地库内容推送到远程
$ git push -u origin master
# 查看远程库信息
$ git remote -v
# 删除远程库 origin:名称
$ git remote rm origin
第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
克隆远程库¶
$ git clone git@github.com/TenderLeeks/Documentation.git
分支管理¶
# 查看分支
$ git branch
# 创建分支
$ git branch <name>
# 切换分支
$ git checkout <name>
# 或者
$ git switch <name>
# 创建+切换分支
$ git checkout -b <name>
# 或者
$ git switch -c <name>
# 合并某分支到当前分支
$ git merge <name>
# 删除分支
$ git branch -d <name>
# 使用 --no-ff 参数合并分支,--no-ff 参数表示禁用Fast forward
$ git merge --no-ff -m "merge with no-ff" dev
# 本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去
# 查看分支历史
$ git log --graph --pretty=oneline --abbrev-commit
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
# 把当前工作现场“储藏”起来,等以后恢复现场后继续工作
$ git stash
# 查看储存的stash
$ git stash list
# 恢复stash
$ git stash apply
# 删除stash
$ git stash drop
# 恢复并删除
$ git stash pop
# 恢复指定的stash
$ git stash apply stash@{0}
# 从本地推送分支,如果推送失败,先用git pull抓取远程的新提交
$ git push origin branch-name
# 在本地创建和远程分支对应的分,本地和远程分支的名称最好一致
$ git checkout -b branch-name origin/branch-name
# 建立本地分支和远程分支的关联
$ git branch --set-upstream branch-name origin/branch-name
$ git rebase
# rebase 操作可以把本地未push的分叉提交历史整理成直线
# rebase 的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比
标签管理¶
# 查看标签
$ git tag
# 历史提交的 commit id 创建标签
$ git tag v0.9 f52c633
# 注意,标签不是按时间顺序列出,而是按字母排序的。
# 查看标签信息
$ git show v0.9
# 创建带有说明的标签,用-a指定标签名,-m指定说明文字
$ git tag -a v0.1 -m "version 0.1 released" 1094adb
# 删除标签
$ git tag -d v0.1
# 推送标签到远程
$ git push origin v1.0
# 一次性推送全部尚未推送到远程的本地标签
$ git push origin --tags
# 删除远程标签
$ git tag -d v0.9
$ git push origin :refs/tags/v0.9
使用GitHub参与开源项目开发¶
首先需要在开源的仓库中Fork 到自己账号下,修改完后,使用pull request提交修改到开源仓库;
自定义Git¶
# Git显示颜色
$ git config --global color.ui true
忽略特殊文件¶
在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
忽略文件的原则是:
忽略操作系统自动生成的文件,比如缩略图等;
忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的
.class文件;忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
发现.gitignore写得有问题,需要找出来到底哪个规则写错了,可以用git check-ignore命令检查:
$ git check-ignore -v file-name
编写规则:
# 排除所有.开头的隐藏文件:
.*
# 排除所有.class文件:
*.class
# 不排除.gitignore和App.class:
!.gitignore
!App.class
配置别名¶
# 以 git st 表示 git status
$ git config --global alias.st status
# 用 co 表示 checkout,ci 表示 commit,br 表示 branch
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
# 配置一个git last,让其显示最后一次提交信息
$ git config --global alias.last 'log -1'
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
--global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。配置Git的时候,加上
--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。每个仓库的Git配置文件都放在
.git/config文件中。当前用户的Git配置文件放在用户主目录下的一个隐藏文件
.gitconfig中。
命令扩展¶
$ git help -a
执行 'git help <command>' 来查看特定子命令
主要的上层命令
add 添加文件内容至索引
am 应用邮箱格式的系列补丁
archive 基于一个指定的树创建文件存档
bisect 通过二分查找定位引入 bug 的提交
branch 列出、创建或删除分支
bundle 通过归档移动对象和引用
checkout 切换分支或恢复工作区文件
cherry-pick 应用一些现存提交引入的修改
citool git-commit 的图形替代界面
clean 从工作区中删除未跟踪文件
clone 克隆仓库到一个新目录
commit 记录变更到仓库
describe 基于一个现存的引用为一个对象起一个可读的名称
diff 显示提交之间、提交和工作区之间等的差异
fetch 从另外一个仓库下载对象和引用
format-patch 准备电子邮件提交的补丁
gc 清除不必要的文件和优化本地仓库
gitk Git 仓库浏览器
grep 输出和模式匹配的行
gui 一个便携的 Git 图形客户端
init 创建一个空的 Git 仓库或重新初始化一个已存在的仓库
log 显示提交日志
maintenance 运行任务以优化仓库数据
merge 合并两个或更多开发历史
mv 移动或重命名一个文件、目录或符号链接
notes 添加或检查对象注释
pull 获取并整合另外的仓库或一个本地分支
push 更新远程引用和相关的对象
range-diff 比较两个提交范围(如一个分支的两个版本)
rebase 在另一个分支上重新应用提交
reset 重置当前 HEAD 到指定状态
restore 恢复工作区文件
revert 回退一些现存提交
rm 从工作区和索引中删除文件
shortlog 'git log' 输出摘要
show 显示各种类型的对象
sparse-checkout 初始化及修改稀疏检出
stash 贮藏脏工作区中的修改
status 显示工作区状态
submodule 初始化、更新或检查子模组
switch 切换分支
tag 创建、列出、删除或校验一个 GPG 签名的标签对象
worktree 管理多个工作区
辅助命令/操作者
config 获取和设置仓库或者全局选项
fast-export Git 数据导出器
fast-import Git 快速数据导入器后端
filter-branch 重写分支
mergetool 运行合并冲突解决工具以解决合并冲突
pack-refs 打包头和标签以实现高效的仓库访问
prune 删除对象库中所有不可达对象
reflog 管理 reflog 信息
remote 管理已跟踪仓库
repack 打包仓库中未打包对象
replace 创建、列出、删除对象替换引用
辅助命令/询问者
annotate 使用提交信息注释文件行
blame 显示文件每一行最后修改的版本和修改者
bugreport 收集信息以供用户提交错误报告
count-objects 计算未打包对象的数量和磁盘空间占用
difftool 使用常见的差异工具显示更改
fsck 验证仓库中对象的连通性和有效性
gitweb Git web 界面(Git 仓库的 web 前端)
help 显示 Git 的帮助信息
instaweb 在 gitweb 中即时浏览您的工作仓库
merge-tree 显示三路合并而不动索引
rerere 重用冲突合并的解决方案记录
show-branch 显示分支和提交
verify-commit 检查 GPG 提交签名
verify-tag 检查标签的 GPG 签名
whatchanged 显示每一个提交引入的差异日志
与其它系统交互
archimport 将一个 GNU Arch 仓库导入到 Git
cvsexportcommit 将一个提交导出到 CVS 检出中
cvsimport 从另外一个人们爱恨的配置管理系统中拯救你的数据
cvsserver Git 的一个 CVS 服务模拟器
imap-send 从标准输入将一组补丁发送到IMAP文件夹
p4 导入和提交到 Perforce 仓库中
quiltimport 将一个 quilt 补丁集应用到当前分支。
request-pull 生成待定更改的摘要
send-email 通过电子邮件发送一组补丁
svn Subersion 仓库和 Git 之间的双向操作
低级命令/操作者
apply 应用一个补丁到文件和/或索引区
checkout-index 从索引拷贝文件到工作区
commit-graph 写入和校验 Git 提交图文件
commit-tree 创建一个新的提交对象
hash-object 从一个文件计算对象 ID,并可以创建 blob 数据对象
index-pack 从一个现存的包存档文件创建包索引
merge-file 运行一个三路文件合并
merge-index 对于需要合并的文件执行合并
mktag 创建一个标签对象
mktree 基于 ls-tree 的格式化文本创建一个树对象
multi-pack-index 写入和校验多包索引
pack-objects 创建对象的存档包
prune-packed 删除已经在包文件中的多余对象
read-tree 将树信息读取到索引
symbolic-ref 读取、修改和删除符号引用
unpack-objects 从打包文件中解压缩对象
update-index 将工作区的文件内容注册到索引
update-ref 安全地更新存储于引用中的对象名称
write-tree 从当前索引创建一个树对象
低级命令/询问者
cat-file 提供仓库对象的内容、类型或大小
cherry 查找尚未应用到上游的提交
diff-files 比较工作区和索引区中的文件
diff-index 将一个树和工作区或索引做比较
diff-tree 比较两个树对象的文件内容和模式
for-each-ref 对每一个引用输出信息
get-tar-commit-id 从 git-archive 创建的归档文件中提取提交 ID
ls-files 显示索引和工作区中文件的信息
ls-remote 显示一个远程仓库的引用
ls-tree 显示一个树对象的内容
merge-base 为了合并查找尽可能好的公共祖先提交
name-rev 查找给定版本的符号名称
pack-redundant 查找冗余的包文件
rev-list 按时间顺序列出提交对象
rev-parse 选出并处理参数
show-index 显示打包归档索引
show-ref 显示本地仓库中的引用
unpack-file 用 blob 数据对象的内容创建一个临时文件
var 显示一个Git逻辑变量
verify-pack 校验打包的Git存仓文件
低级命令/同步仓库
daemon 一个非常简单的 Git 仓库服务器
fetch-pack 从另一个仓库获取缺失的对象
http-backend Git HTTP 协议的服务端实现
send-pack 使用 Git 协议推送对象到另一个仓库
update-server-info 更新辅助信息文件以帮助哑协议服务
低级命令/内部助手
check-attr 显示 gitattributes 信息
check-ignore 调试 gitignore / exclude 文件
check-mailmap 显示联系人的规范名称和电子邮件
check-ref-format 确保引用名称格式正确
column 以列的方式显示数据
credential 检索和存储用户密码
credential-cache 在内存中临时存储密码的助手
credential-store 在磁盘存储密码的助手
fmt-merge-msg 生成一个合并提交信息
interpret-trailers 添加或解析提交说明中的结构化信息
mailinfo 从单个电子邮件中提取补丁和作者身份
mailsplit 简单的 UNIX mbox 邮箱切分程序
merge-one-file 与 git-merge-index 一起使用的标准向导程序
patch-id 计算一个补丁的唯一 ID
sh-i18n 为 shell 脚本准备的 Git 国际化设置代码
sh-setup 常用的 Git shell 脚本设置代码
stripspace 删除不必要的空白字符
外部命令
cz
$ git help -g
Git 概念向导有:
attributes 定义路径的属性
cli Git 命令行界面和约定
core-tutorial 面向开发人员的 Git 核心教程
credentials 为 Git 提供用户名和口令
cvs-migration 适合 CVS 用户的 Git 帮助
diffcore 调整差异输出
everyday 每一天 Git 的一组有用的最小命令集合
faq 关于使用 Git 的常见问题
glossary Git 词汇表
hooks Git 使用的钩子
ignore 忽略指定的未跟踪文件
modules 定义子模组属性
namespaces Git 名字空间
remote-helpers 与远程仓库交互的助手程序
repository-layout Git 仓库布局
revisions 指定 Git 的版本和版本范围
submodules 将一个仓库安装到另外一个仓库中
tutorial 一个 Git 教程
tutorial-2 一个 Git 教程:第二部分
workflows Git 推荐的工作流概览
参考文档