# 相关概念
## 工作区与暂存区
工作区(Working Directory)就是我们电脑中能看见的目录
暂存区或者说版本库:我们使用 git add 操作就是把文件放到了暂存区,git commit 就是把暂存区所有内容提交到当前分支。
![](https://box.kancloud.cn/03bb953d87658b477835d8a2f19b4d1c_587x313.png =400x)
## Git 与 SVN
Git 属于分布式版本控制系统,而 SVN 属于集中式。
![](https://img.kancloud.cn/f4/c0/f4c0e3930e3431dcc97cbea1ebe46680_849x494.png =400x)
集中式版本控制只有中心服务器拥有一份代码,而分布式版本控制每个人的电脑上就有一份完整的代码。
集中式版本控制有安全性问题,当中心服务器挂了所有人都没办法工作了。
集中式版本控制需要连网才能工作,如果网速过慢,那么提交一个文件会慢的无法让人忍受。而分布式版本控制不需要连网就能工作。
分布式版本控制新建分支、合并分支操作速度非常快,而集中式版本控制新建一个分支相当于复制一份完整代码。
# 全局配置
```shell
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
```
[TOC]
# 创建仓库
本地 push 源码一般分为两种情况
## 本地无源码
第一步,clone 远程源码
```txt
git clone https://path/to/your/repository
```
第二步,编写源码,完成后上传源码
```txt
git add .
git commit -m "your commit message"
git push origin master --set-upstream
```
注意初次提交时需要加上`--set-upstream`参数,因为远程不存在 master 分支,需要创建分支,第二次提交时就不需要了
## 本地有源码
第一步,初始化 git 仓库
```txt
git init
```
第二步,添加远程仓库
```txt
git remote add origin https://path/to/your/repository
```
第三步,上传源码,与上一种情况方法相同
## 相关 git 命令
`git init`:创建一个空仓库
`git remote`:关联一个远程库
`git clone` :克隆远程库
`git add`(将文件添加至暂存区)
```shell
$ git add fileName.fileType # 将与仓库同一目录(子目录)下的文件添加到仓库中
$ git add --all # 将所有的已跟踪的文件的修改与删除和新增的未跟踪的文件都添加到暂存区
```
`git commit`(提交暂存区文件)
```shell
$ git commit -m "message" # 将文件提交给仓库, -m 后面为本次提交的说明
```
> 为什么 git 添加文件需要 add、commit 两步呢?因为 commit 可以一次提交很多文件,所以我们可以多次 add 不同文件后再提交。
```shell
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
```
# 查询仓库状态
`git status`:查询当前仓库状态(例如 readme.txt 被修改了会给出如下提示)
```shell
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
```
`git diff <fileName>`:显示对该文件做了哪些修改
# 时光穿梭机
## 版本回退
`git log`:显示从最近的到最远的提交日志,其中的 **HEAD** 表示当前版本
`git log --pretty=oneline`:只显示每次提交的 message 信息
![](https://box.kancloud.cn/8c5a3f04ee5532c1089047843d28797e_826x423.png)
`git reset`:版本更改,`git reset --hard HEAD~N`命令可以回退到之前的第 N 个版本
`git reset --hard commidID`命令可以回退到该 commit id 对应的版本
`git reflog`:查看历史命令,可以看到所有命令的 commit id,如果回退到以前的版本又想返回未回退前的状态可以使用该命令获取对应的 commit id 再使用`git reset`
## 撤销修改
`git checkout -- file`:丢弃工作区的修改。
假设我们执行 git checkout -- readme.txt,那么会有以下两种情况:
- 一种是 readme.txt 自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
- 一种是 readme.txt 已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次 git commit 或 git add 时的状态。
## 删除操作
`git rm test.txt`:从版本库中删除该文件,然后执行`rm test.txt`从工作区删除该文件,最后`git commit -m "'remove test.txt"`提交本次操作
# 分支管理
`git checkout`命令加上`-b`参数表示创建并切换,相当于以下两条命令:
```shell
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
```
然后,用`git branch`命令查看当前分支:
```shell
$ git branch
* dev
master
```
`git branch`命令会列出所有分支,当前分支前面会标一个`*`号。然后可以使用`checkout master`又切换回 master 分支。
`git merge`命令用于合并指定分支到当前分支。
`git branch -d dev`命令表示删除 dev 分支。
*****
总结:
查看分支:`git branch`
创建分支:`git branch <name>`
切换分支:`git checkout <name>`
创建+切换分支:`git checkout -b <name>`
合并某分支到当前分支:`git merge <name>`
删除分支:`git branch -d <name>`
显示工作区与当前分支文件的差异:`git diff HEAD`(HEAD 指向的是 local repository 中最新提交的版本)
# 解决冲突
当 Git 无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把 Git 合并失败的文件手动编辑为我们希望的内容,再提交。
用 `git log --graph` 命令可以看到分支合并图。
## git 冲突的场景
* 情景一:多个分支代码合并到一个分支时;
* 情景二:多个分支向同一个远端分支推送代码时;
实际上,push 操作即是将本地代码 merge 到远端库分支上。
关于 push 和 pull 其实就分别是 **用本地分支合并到远程分支** 和 **将远程分支合并到本地分支**
所以这两个过程中也可能存在冲突。
git 的合并中产生冲突的具体情况:
- 两个分支中修改了同一个文件(不管什么地方)
- 两个分支中修改了同一个文件的名称
两个分支中分别修改了不同文件中的部分,不会产生冲突,可以直接将两部分合并。
## 冲突解决方案
* 情景一:在当前分支上,直接修改冲突代码--->add--->commit。
* 情景二:在本地当前分支上,修改冲突代码--->add--->commit--->push
具体见:[https://www.cnblogs.com/gavincoder/p/9071959.html](https://www.cnblogs.com/gavincoder/p/9071959.html)
# 参考链接
[Git教程-廖雪峰的官方网站](https://www.liaoxuefeng.com/wiki/896043488029600)
[https://github.com/CyC2018/CS-Notes/blob/master/notes/Git.md](https://github.com/CyC2018/CS-Notes/blob/master/notes/Git.md)
- 序言 & 更新日志
- H5
- Canvas
- 序言
- Part1-直线、矩形、多边形
- Part2-曲线图形
- Part3-线条操作
- Part4-文本操作
- Part5-图像操作
- Part6-变形操作
- Part7-像素操作
- Part8-渐变与阴影
- Part9-路径与状态
- Part10-物理动画
- Part11-边界检测
- Part12-碰撞检测
- Part13-用户交互
- Part14-高级动画
- CSS
- SCSS
- codePen
- 速查表
- 面试题
- 《CSS Secrets》
- SVG
- 移动端适配
- 滤镜(filter)的使用
- JS
- 基础概念
- 作用域、作用域链、闭包
- this
- 原型与继承
- 数组、字符串、Map、Set方法整理
- 垃圾回收机制
- DOM
- BOM
- 事件循环
- 严格模式
- 正则表达式
- ES6部分
- 设计模式
- AJAX
- 模块化
- 读冴羽博客笔记
- 第一部分总结-深入JS系列
- 第二部分总结-专题系列
- 第三部分总结-ES6系列
- 网络请求中的数据类型
- 事件
- 表单
- 函数式编程
- Tips
- JS-Coding
- Framework
- Vue
- 书写规范
- 基础
- vue-router & vuex
- 深入浅出 Vue
- 响应式原理及其他
- new Vue 发生了什么
- 组件化
- 编译流程
- Vue Router
- Vuex
- 前端路由的简单实现
- React
- 基础
- 书写规范
- Redux & react-router
- immutable.js
- CSS 管理
- React 16新特性-Fiber 与 Hook
- 《深入浅出React和Redux》笔记
- 前半部分
- 后半部分
- react-transition-group
- Vue 与 React 的对比
- 工程化与架构
- Hybird
- React Native
- 新手上路
- 内置组件
- 常用插件
- 问题记录
- Echarts
- 基础
- Electron
- 序言
- 配置 Electron 开发环境 & 基础概念
- React + TypeScript 仿 Antd
- TypeScript 基础
- 样式设计
- 组件测试
- 图标解决方案
- Algorithm
- 排序算法及常见问题
- 剑指 offer
- 动态规划
- DataStruct
- 概述
- 树
- 链表
- Network
- Performance
- Webpack
- PWA
- Browser
- Safety
- 微信小程序
- mpvue 课程实战记录
- 服务器
- 操作系统基础知识
- Linux
- Nginx
- redis
- node.js
- 基础及原生模块
- express框架
- node.js操作数据库
- 《深入浅出 node.js》笔记
- 前半部分
- 后半部分
- 数据库
- SQL
- 面试题收集
- 智力题
- 面试题精选1
- 面试题精选2
- 问答篇
- Other
- markdown 书写
- Git
- LaTex 常用命令