第一部分:Git 基础
一、Git综述
1、Git
Git是一个开源、敏杰高效的分布式版本控制工具。
2、版本控制比较
-
本地版本控制系统
1)本地版本控制系统- 用目录拷贝区别不同的版本
- 公共文件容易被覆盖
- 成员沟通成本高,代码集成效率低下
2)如图:
-
集中化的版本控制系统
1)集中式版本控制系统- 有集中的版本管理服务器
- 具备文件版本管理和分支管理能力
- 集成效率有明显的提高
- 客户端必须时刻和服务器相连
2)如图
-
集中化的版本控制系统
1)分布式版本控制系统- 服务端和客户端都有完整的版本库
- 脱离服务端,客户端照样可以管理版本
- 查看历史和版本比较等多数操作,都不需访问服务器,比集中式更能提高版本管理效率
2)如图
二、Git 安装
三、Git配置
1、仓库的配置 git config
git config 命令专门用来配置或读取相应的工作环境变量
Git 有三种级别的环境变量,它们分别是: 系统 Git 配置、当前用户 Git 配置 和 当前项目 Git 配置
这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。
各个环境配置文件及查看命令如下:
1、系统配置 `/etc/gitconfig` 文件
/etc/gitconfig 是对所有用户都普遍适用的配置
可以使用以下命令来读写 /etc/gitconfig 文件
$ git config --system [...]
2、当前用户 `~/.gitconfig` 文件
~/.gitconfig 这个当前用户目录下的配置文件只适用于当前用户
可以使用以下命令来读写 ~/.gitconfig 文件
$ git config --global [...]
3、当前项目 `.git/config ` 文件
是当前项目下的配置文件,只适用于当前项目有效
可以使用以下命令来读写 .git/config 文件
$ git config --local [...]
环境变量级别优先级: 当前项目 > 当前用户 > 系统配置
2、Git 对命令设置别名
根据跟人喜好,将常用命令设置别名
$ git config --global alias.cg "config --global"
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
四、Git 工作流程
使用 Git 日常开发的流程一般如下
- 创建或克隆 Git 资源作为工作目录
- 在克隆的资源上添加或修改文件
- 如果其他人修改了,我们可以更新资源
- 在提交前查看修改
- 提交修改到本地
- 提交修改到远程
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交
五、初始化Git本地仓库
# 初始化本地仓库
$ git init [--bare]
# 将远程仓库拉去到本地
$ git clone [--bare] originPah
六、四个区五种状态
四个区
- 工作区
- 暂存区
- 本地仓库
- 远程仓库
五种状态
- 未修改(origin)
- 已修改(Modified)&未追踪(Untracked)
- 已暂存(Staged)
- 已提交(Commited)
- 已推送(Pushed)
顺序操作
-
1、工作区与仓库保持一致
-
2、文件增删改,变为已修改状态
-
3、git add ,变为已暂存状态
$ git add --all # 当前项目下的所有更改 $ git add . # 当前目录下的所有更改 $ git add -u # 将工作空间被修改和被删除的文件添加到暂存区(不包含没有纳入Git管理的新增文件) $ git add a.js b.js # 添加某几个文件 -
4、git commit 变为已提交状态
$ git commit -m "commit 描述" # 将已暂存文件,提交到本地仓库 # commit 其他的使用方法 # 01、git commit -am # 如果已修改文件以在暂存区中,修改文件后,可以省去 git add 命令 $ git commit -am "commit 描述" # 02、git commit --amend # git commit --amend 作用如下: # 1)、如果是未修改状态,可以修改最后一次 commit 的描述。 # 2)、如果文件修改了,并提交到了暂存区,可以将当前修改合并到上个commit中 $ git commit --amend -
5、git push,变为已推送状态
$ git push -u origin master # 第一次推送,需要将本地与远程进行关联 $ git push # 非第一次提交,不许知名推动的远程分支
操作图解
七、Git分支
- Git分支简介
Git分支是将你开发工作从项目主线分离开来,以免影响开发主线。
- Git分支在项目开发中的作用
1、分离主线开发
2、并行开发
- 创建分支
$ git branch dev
# or 创建游离分支
$ git checkout [commit-sha1]
- 切换分支
# 切换dev分支
$ git checkout dev
- 一步代替创建和切换
$ git checkout -b dev
- 删除分支
# 删除本地分支
$ git branch -d [branch-name]
# 删除远程分支
$ git push origin :[branch-name]
# or
$ git push origin --delete [branch-name]
-
合并分支
merge合并# 分支合并。git的合并是个三方合并。 $ git merge [--no-ff] dev三方合并
什么是三方合并?
三方合并是指,在执行merge命令后,将当前分支、被合并分支以及这两个分支的共同祖先进行合并。
merge合并冲突解决
如果冲突时,会展示当前分支HEAD和被合并分支之间的不同。如果想展示共同祖先的版本。参考:zhuanlan.zhihu.com/p/78505692 主要设置合并冲突的展示方式,命令如下。默认是 merge $ git config --global merge.conflictstye diff3
-ff与--no-ff区别:
- -ff不会出现要给新的合并。 --no-ff会出现一个新的commit
```
# 合并分支 dev 【默认开启 fast-forward模式】
$ git merge dev
# 禁用 fast-forward
$ git merge --no-ff dev
```
ff[fast-foward快进合并]
- 合并分支时Git默认会使用fast-forward模式
- 在这种模式下,删除分支会丢掉分支信息
- 合并时加上 --no-ff参数会禁用fast-forward。这样会多出一个commit id
`rebase合并`
rebase合并 dev
$ git rebase dev
rebase注意事项
- rebase过程也会出现冲突
- 解决冲突后,使用 git add 添加冲突文件,然后执行git rebase --continue
- 接下来Git会继续应用余下的补丁
- 任何时候都可以通过git rebase --abort,终止rebase,分支会恢复到rebase开始前的状态
`rebase与merge区别` [链接:merge 和 rebase 区别](http://igit.58corp.com/_fe/documents/tree/master/白皮书/规范/git)
- merge合并后提交记录有分叉,rebase合并后是一条直线
- merge不会修改提交历史,rebase会修改。
`rebase最佳实践`
- 不要对master分支执行rebase,否则会引起很多问题
- 一般来说,执行rebase的分支都是自己本地的分支,没有推送到远程版本的分支