# 相關概念
## 工作區與暫存區
工作區(Working Directory)就是我們電腦中能看見的目錄
暫存區或者說版本庫:我們使用 git add 操作就是把文件放到了暫存區,git commit 就是把暫存區所有內容提交到當前分支。

## Git 與 SVN
Git 屬于分布式版本控制系統,而 SVN 屬于集中式。

集中式版本控制只有中心服務器擁有一份代碼,而分布式版本控制每個人的電腦上就有一份完整的代碼。
集中式版本控制有安全性問題,當中心服務器掛了所有人都沒辦法工作了。
集中式版本控制需要連網才能工作,如果網速過慢,那么提交一個文件會慢的無法讓人忍受。而分布式版本控制不需要連網就能工作。
分布式版本控制新建分支、合并分支操作速度非常快,而集中式版本控制新建一個分支相當于復制一份完整代碼。
# 全局配置
```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 信息

`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 基礎
- React + ts
- 樣式設計
- 組件測試
- 圖標解決方案
- Storybook 的使用
- Input 組件
- 在線 mock server
- 打包與發布
- Algorithm
- 排序算法及常見問題
- 劍指 offer
- 動態規劃
- DataStruct
- 概述
- 樹
- 鏈表
- Network
- Performance
- Webpack
- PWA
- Browser
- Safety
- 微信小程序
- mpvue 課程實戰記錄
- 服務器
- 操作系統基礎知識
- Linux
- Nginx
- redis
- node.js
- 基礎及原生模塊
- express框架
- node.js操作數據庫
- 《深入淺出 node.js》筆記
- 前半部分
- 后半部分
- 數據庫
- SQL
- 面試題收集
- 智力題
- 面試題精選1
- 面試題精選2
- 問答篇
- 2025面試題收集
- Other
- markdown 書寫
- Git
- LaTex 常用命令
- Bugs