目录
- 配置
- 初始化仓库
- 克隆
- git remote
- cherry pick
- git stash
- 文件状态
- 日志
- git blame
- 查看分支
- 切换分支
- 创建分支
- 删除分支
- 重命名分支
- 合并
- 解决冲突
- 暂存
- 删除
- 还原
- 提交
- 推送
- 拉取
- 移动-重命名
- 查看文件内容变动
- 回滚版本
- 撤销
- 标签
- git rebase
- git flow
- git submodule
- git bisect
- git switch
- git archive
- 格式化日志
- 清空commit历史
- 仓库迁移
- 奇技淫巧
- GUI客户端
- 生成SSHKey
- 提交规范
- 其他
- 帮助
- 加速
- 思维导图
配置
1 |
|
命令别名配置
1 |
|
配置代理
1 |
|
初始化仓库
git init
创建一个空的Git仓库或重新初始化一个现有的仓库
实际上 git init
命令用得不多,通常在GUI上进行操作。
1 |
|
克隆
1 |
|
git remote
git remote
命令通常用来管理远程仓库。
1 |
|
cherry pick
检出某次commit提交, 如果当前分支上的某次提交的修改正是当前需要的,那么可以使用此命令进行操作。
需要注意的是提交时必须使用 git push -f
强制提交方式。
1 |
|
git stash
应用场景:假设当前分支某些功能做到一半了, 突然需要切换到其他分支修改Bug, 但是又不想提交(因为切换分支必须清理当前工作区,否则无法切换),这个时候 git stash
应用场景就来了。
1 |
|
文件状态
1 |
|
日志
查看历史日志可以通过 git log
/ git shortlog
/ git reflog
。
git log
命令是3个最强大的命令
1 |
|
git shortlog
以简短的形式输出日志, 通常用于统计贡献者代码量。
1 |
|
git reflog
通常被引用为 安全网
,当 git log
没有想要的信息时可以尝试用 git reflog
。
当回滚某个版本时记录是不保存在 git log
中, 想要找到这条回滚版本信息时 git reflog
就用上了。
1 |
|
git blame
git blame
意思是责怪,你懂的。
git blame
用于查看某个文件的修改历史记录是哪个作者进行了改动。
1 |
|
查看分支
1 |
|
切换分支
另一种切换分支方法是使用 switch命令
1 |
|
在克隆时使用 --depth=1
切换其他分支,比如切换 dev 分支:
1 |
|
创建分支
1 |
|
删除分支
1 |
|
重命名分支
1 |
|
合并
1 |
|
合并部分文件或文件夹
假设有 dev 和 main 2个分支,可是 dev 分支改动比较大,只想合并某个文件夹到 main 分支上,可以这么做:
1 |
|
需要注意的是这会直接覆盖现有文件,而不是本质上的合并。
解决冲突
代码合并/更新代码 经常会遇到冲突的情况。
1、按照惯例直接把代码提交到远程, 有几种情况:
- 代码顺利的推送的远程分支 (无需理会)
- 出现冲突, git自动做了合并 (无需理会)
- git发现本地文件在远端做了修改,需要进行 git pull
1
git push
出现冲突,如图:
2、按照提示执行 git pull
拉取代码
1 |
|
提示有文件存在冲突,如图:
3、编辑冲突文件, 解决冲突需要自己去判断到底要保留远端代码还是本地代码或者两端都保留。
4、这是解决后的代码,保留了本地代码
最后按照惯例,把代码推送到远端即可。
除了使用git命令解决以外, 可以使用一些开发工具自带git进行处理。
另外推荐3个工具专门处理git冲突:
暂存
1 |
|
删除
git add 的反向操作
1 |
|
还原
还原操作通过 git restore
命令。
git restore
是在 2.23
引入的, 是为了分离 git checkout
/ git reset
职责。
1 |
|
提交
1 |
|
推送
1 |
|
拉取
拉取远程分支最新内容
1 |
|
拉取指定分支
1 |
|
拉取指定工作目录
1 |
|
移动-重命名
git mv
命令用来重命名文件或移动文件, 大部分开发者会选择手动进行移动文件, 手动和用 git mv
是有区别的。
手动和命令两者的区别(假设README.md
重命名为README2.md
):
- 手动:先删除
README.md
, 然后创建README2.md
, 历史记录无法正常追踪 git mv
: 实际上是更新索引,把文件进行重命名, 可以通过历史记录方便检索
git mv
和 uninx mv
命令很像,如果你熟悉的话。
注意:新创建的文件不支持 git mv
, 必须先提交。
1 |
|
查看文件内容变动
git diff
命令用于查看工作区文件
内容与暂存区或远端之间的差异。git show
命令用于查看远端文件修改内容。
git diff
1 |
|
git show
1 |
|
回滚版本
回滚版本有2种方法:
git reset
- 回滚版本后之前的历史记录将不保存, 不保留痕迹, 基本上不存在冲突情况。git revert
- 回滚版本后之前的历史记录还存在并多增加了一条Revert
记录,很容易出现冲突。
git reset
命令用法:
1 |
|
git revert
命令用法:
1 |
|
撤销
1 |
|
标签
1 |
|
git rebase
git rebase
命令有2个比较实用的功能:
- 将多个commit记录合并为一条
- 代替
git mrege
合并代码
1、将多个commit记录合并为一条
要注意保证当前工作区没内容再操作。
1、指定需要操作的记录,这时候会进入交互式命令
1 |
|
参数 | 描述 |
---|---|
p, pick | 保留当前commit,默认 |
r, reword | 保留当前commit,但编辑提交消息 |
e, edit | 保留当前commit,但停止修改 |
s, squash | 保留当前commit,但融入上一次提交 |
b, break | 在这里停止(稍后使用 git rebase --continue 继续重新设置基准) |
d, drop | 删除当前commit |
这里是倒序排列,最新的记录在最后
2、除了第一条后面全部改成 s
或 squash
:
3、按 :wq
退出交互式,接着进入另一个交互式来编辑commit消息, 如果不需要修改之前的commit消息则直接退出:
4、强制推送到远端
1 |
|
2、合并分支代码
都说用 git rebase
代替 git merge
进行合并,这2个区别在于 git rebase
可以使历史记录更清晰, 下面2张图对比一下:
第一张图是 git rebase
,第二张图是 git merge
。
可以看出 git rebase
是一条直线的,git merge
则是各种交叉,很难理解。
假设有2个分支,main 和 dev,下面使用 git rebase
将 dev 分支代码合并到 main 分支上。
1 |
|
中断 git rebase
操作, 如果操作一半不想继续使用 rebase
命令则可以中断此次操作。
1 |
|
git flow
Git Flow 是一套基于git的工作流程,这个工作流程围绕着project的发布(release)定义了一个严格的如何建立分支的模型。
git flow
只是简化了操作命令,不用 git flow
也可以,只要遵循 git flow
流程操作即可,手动一条一条命令执行也一样的。
git flow
不是内置命令,需要单独安装。
初始化
每个仓库都必须初始化一次才能使用,这是针对当前用户而言的。
1 |
|
开始开发一个功能
假设我们要开始开发一个新的功能比如登录注册,这个时候就要打一个 feature
分支进行独立开发。
1 |
|
打补丁
什么情况下需要打补丁? 假设已经上线的功能有BUG需要修复就需要打补丁了。
hotfix 是针对 master
分支进行打补丁的。
1 |
|
发布
假设产品给了个新需求并完成,这个时候可以选择发布。不发布也行,但是发布后会有版本区分,以后想找到某个版本的代码就很方便。
1 |
|
参考:
- https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow
- https://www.git-tower.com/learn/git/ebook/cn/command-line/advanced-topics/git-flow
Git flow schema
git submodule
git submodule
子模块的作用类似于包管理,类似 npm
/ maven
, 但比包管理使用起来更方便。
子模块可以不建立版本分支管理代码, 因为它是依赖主应用,所以建立版本分支可以从主应用去操作,那么一旦建立新的版本分支当前的所有内容都会被锁定在这个分支上,不管子模块仓库怎么修改。
1 |
|
更新子模块代码是比较头疼的事,所以分开来讲
1、通常我们需要更新代码只需要执行 git pull
, 这是比较笨的办法。
1 |
|
2、使用 git submodule update
更新子模块
1 |
|
3、使用 git pull
更新, 这是一种新的更新模式,需要 >= 2.14
1 |
|
如果嫌麻烦每次 git pull 都需要手动添加 --recurse-submodules
,可以配置 git pull 的默认行为, 如何配置请参考 配置
具体使用还可以看这里 git submodule子模块使用教程
git bisect
git bisect
基于二分查找算法, 用于定位引入Bug的commit,主要4个命令。
此命令非常实用, 如果你的Bug不知道是哪个 commit 引起的,可以尝试此方法。
1 |
|
参考 https://github.com/bradleyboy/bisectercise
git switch
git switch
命令在git版本 2.23
引入, 用于切换分支。
git checkout
同样可以切换分支, git switch
意义在哪里? 因为 git checkout
不但可以切换分支还可以撤销工作,导致命令含糊不清,所以引入了 git switch
。
注:由于生态原因, 大部分还是会使用 git checkout
。
1 |
|
git archive
创建一个归档文件,可以理解为将当前项目压缩为一个文件。会忽略掉 .git
目录。
但与 zip
/ tar
等压缩不同,git archive
支持将某个分支或commit进行归档。
参数
参数 | 描述 |
---|---|
–format | 可选,指定格式,默认 tar, 支持 tar 和 zip,如果不填会根据 –output后缀格式进行推断 |
–output | 输出到指定目录 |
1 |
|
格式化日志
在使用 git log
命令时可以携带 --pretty=format
用来格式化日志。
常用格式如下:
参数 | 描述 |
---|---|
%H | 完整 commit hash |
%h | 简写commit hash 一般是前7位 |
%T | 完整 hash 树 |
%t | 简写 hash 树 |
%an | 作者名称 |
%ae | 作者邮箱 |
%ad | 作者日期, RFC2822风格:Thu Jul 2 20:42:20 2020 +0800 |
%ar | 作者日期, 相对时间:2 days ago |
%ai | 作者日期, ISO 8601-like风格: 2020-07-02 20:42:20 +0800 |
%aI | 作者日期, ISO 8601风格: 2020-07-02T20:42:20+08:00 |
%cn | 提交者名称 |
%ce | 提交者邮箱 |
%cd | 提交者日期,RFC2822风格:Thu Jul 2 20:42:20 2020 +0800 |
%cr | 提交者日期,相对时间:2 days ago |
%ci | 提交者日期,ISO 8601-like风格: 2020-07-02 20:42:20 +0800 |
%cI | 提交者日期,ISO 8601风格: 2020-07-02T20:42:20+08:00 |
%d | 引用名称: (HEAD -> master, origin/master, origin/HEAD) |
%D | 引用名称,不带 () 和 换行符: HEAD -> master, origin/master, origin/HEAD |
%e | 编码方式 |
%B | 原始提交内容 |
%C | 自定义颜色 |
例子:
1 |
|
清空commit历史
清空 commit
有2种方法。
1、第一种方法原理是通过新建新的分支,假设当前分支是 develop
1 |
|
2、第二种方法通过更新 引用
, 假设要重设 master
分支
1 |
|
这2种方法都是用于清空 commit 历史, 不会造成当前文件的丢失,所以放心。
笔者推荐使用第二种方法,更安全可靠。
仓库迁移
仓库迁移也可以叫复制仓库。
有时候需要从一个旧仓库迁移到新仓库,如果手动只能把文件进行迁移,但是如果需要把分支、标签、历史记录一起迁移就需要复制仓库。
旧仓库A: https://github.com/xjh22222228/A.git 新仓库B: https://github.com/xjh22222228/B.git
1、克隆旧裸仓库
1 |
|
2、镜像推送至新仓库
1 |
|
3、删除刚刚克隆的旧仓库
1 |
|
4、拉取新仓库
1 |
|
除了通过命令迁移之外,可以通过网页导入仓库的方式也可以。
奇技淫巧
美化 git log
, 直逼GUI
1 |
|
效果图
GUI客户端
推荐几款比较好用的 git 图形界面工具, 不分先后。
- 免费 - Github Desktop
- 免费 - Sourcetree
- 免费 - tortoiseGit
- 免费 - gitkraken
- 免费 - gitup
- 收费 - smartgit
- 收费 - git-fork
- 收费 - tower
- 收费 - lazygit
生成SSHKey
1、替换为您的GitHub电子邮件地址
1 |
|
2、当提示”输入要在其中保存密钥的文件”时,按Enter。接受默认文件位置。 (建议修改名字,防止以后被覆盖)
1 |
|
3、在提示符下,键入一个安全密码, 默认回车即可
1 |
|
4、生成的SSH Key 添加到 ssh config
中
1 |
|
最后将公钥添加到 https://github.com/settings/keys 中
1 |
|
提交规范
标志 | 描述 |
---|---|
feat | 该提交含有新的特性 |
style | 通常是代码格式的修改 |
chore | 通常是代码格式的修改 |
fix | 修复Bug |
docs | 文档修改 |
test | 单元测试改动 |
refactor | 代码重构 |
perf | 性能优化、体验 |
revert | 回滚版本 |
merge | 代码合并 |
typo | 错字, 比如单词拼错 |
例子:
1 |
|
其他
1 |
|
帮助
1 |
|
加速
在国内克隆或下载版本会很慢,可以借助下面2个镜像站点进行加速。
- https://github.com.cnpmjs.org
- https://hub.fastgit.org
1 |
|
资源加速:
1 |
|
思维导图
转自:https://raw.githubusercontent.com/xjh22222228/git-manual