>http://www.jianshu.com/p/12b0099d4625
http://alfred-sun.github.io/blog/2015/01/10/jekyll-liquid-syntax-documentation/
[手把手教你使用Git](https://my.oschina.net/gsbhz/blog/337719)
[TOC]
# Git筆記
---
### 理解Git與GitHub

1. git 是一個軟件
2. git 可以在 .git 文件夾里面維護你的歷史代碼
3. 指定了 remote 鏈接和用戶信息(git 靠用戶名+郵箱識別用戶)之后,git 可以幫你將提交過的代碼 push 到遠程的倉庫(任意提供了 git 托管服務的服務器上都可以,包括你自己建一個或者 GitHub/BitBucket 等網站提供的服務器)或者將遠程倉庫的代碼 fetch 到本地。
相當于本地、公司服務器、Github網站服務器都裝Git做版本控制,只不過Github的服務器強大些,對全球用戶托管的項目用Git做版本控制!
正是由于Github用Git做版本控制,所以可以輕松的記錄項目的變遷史,然后有了下圖:

你可以在瀏覽器里面先試試Git的命令行,盡情[Try Git](https://try.github.io/)吧
### 1. 工作區(Working Directory)和版本庫(Repository)

**說明:**
* 工作區就是創建倉庫的文件夾如(learngit文件夾就是一個工作區)
* 版本庫就是工作區的隱藏目錄`.git`,版本庫中有暫存區(stage/index)和分支(master)
* git add 實際是把文件添加到暫存區,`git commit` 把暫存區的內容提交到當前分支
### 2.創建版本庫
1. 創建git倉庫文件夾,名為:`learngit`
$ mkdir learngit
2. 進入leadngit文件夾
$ cd learngit
3. 初始化git倉庫
$ git init
### 3. 添加文件
1. 在`leangit`下添加一個`readme.txt`文件,并編輯一些內容
2. 添加到倉庫暫存區()在暫存區 文件會變綠
$ git add readme.txt
3. 提交readme.txt文件到當前分支, -m "提交說明"(只有進行 git add 后 go commit 命令才有效)
$ git commit -m "add readme.txt"
### 4. 修改文件
#### 4.1 當文件在工作區時
1. 查看readme.txt文件內容
$ cat readme.txt
2. 修改readme.txt文件內容
3. 查看倉庫狀態
$ git status
4. 添加到倉庫暫存區,并提交到分支
$ git add readme.txt
$ git commit -m "modify readme.txt"
#### 4.2 當文件在暫存區時
1. 修改文件內容
2. 添加到倉庫暫存區
$ git add readme.txt
3. 提交到分支
$ git commit -m "modify readme.txt at the stage"
### 5. 撤銷修改文件(未提交到分支)
#### 5.1 當文件在工作區時
1. 執行撤銷命令
$ git checkout -- readme.txt
#### 5.2 當文件在暫存區時
1. 令文件回到工作區
$ git reset HEAD readme.txt
2. 執行撤銷命令
$ git checkout -- readme.txt
### 6. 版本控制(無限次后悔)
說明:在Git中,`HEAD`表示當前版本,`HEAD^`表示上一版本 `HEAD^^`表示上上一個版本
1. 查看提交日志輸出(完整版)
$ git log
2. 查看提交日志輸出(精簡版)
$ git log --pretty=noline
3. 回到上一版本
$ git reset --hard HEAD^
4. 回到指定版本(hard 后面添加版本號)
$ git reset --hard ea34578
5. 查看命令歷史
$ git reflog
### 7. 遠程倉庫(github)
#### 7.1 添加到遠程庫
1. 在github上創建一個名為`learngit`的空倉庫
2. 在本地`learngit`倉庫下運行命令
$ git remote add origin git@github.com:iphone5solo/learngit.git
3. 把本地內容推送到github遠程庫上(第一次push 參數帶 `-u` 關聯遠程倉庫)
$ git push -u origin master
注意:如果在git push -u origin master時出現以下錯誤,證明電腦沒有修改遠程倉庫的公鑰,
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
解決方法:
1. 在github上點擊`Edit profile` --> `SSH and GPG keys` --> `new SSH key` 添加SHH公鑰
2. 打開`id_rsa.pub`文件(C:/Users/Administrator/.ssh/id.rsa.pub)
3. 將`id_rsa.pub`文件內容拷貝到key就可以了,title隨便填。
#### 7.2 從遠程庫克隆
1. 在github上創建一個名為`clonegit`的倉庫
2. 使用命令克隆倉庫
$ git clone git@github.com:iphone5solo/clonegit
#### 7.3 從遠程倉庫更新本地倉庫(已關聯)
$ git pull origin master
### 8. 分支管理
**圖文說明:**
`master`分支是一條線,git用`master`指向最新的提交,在用`HEAD`指向`master`,以此才確定當前分支,和提交點。

**1. 創建分支**
當我們創建新的分支,例如`newBranch`,git就會新建一個指針`newBranch`,指向`master`相同的提交,再把`HEAD`指向`newBranch`,就表示當前分支在`newBrach`上

**2. 新分支的修改和提交**
現在對工作區的修改和提交就是針對`newBranch`分支了,比如新提交一次后,`newBranch`指針就向前移動一步,指向最新提交,而`master`指針指向不變。

**3. 分支的合并**
把`newBranch`合并到`master`上,直接把`master`指向`newBranch`的當前提交,就完成了合并。

**4. 合并完成刪除分支**
刪除分支`newBranch`,就剩下一個`master`分支

**5. 查看分支合并圖解**

**關于分支的主要命令如下**
* 查看分支
$ git branch
* 創建`newBranch`分支
$ git branch newBranch
* 切換`HEAD`指向`newBranch`分支
$ git checkout newBranch
* 創建+切換分支
$ git checkout -b newBranck
* 合并某分支到當前分支
$ git merge newBranch
* 普通刪除`newBranch`分支
$ git branch -d newBranch
* 強行刪除`newBranch`分支
$ git branch -D newBranch
* 查看分支合并狀況
$ git log --graph --pretty=oneline --abbrev-commit
### 9. 藏匿當前未提交的分支
如: 當前在修改自己的分支`dev`,突然項目經理要求修復一個bug-07
解決方法:
1. 藏匿當前`dev`分支的工作狀態
$ git stash
2. 新建一個`bug-07`分支
$ git branch -b bug-07
3. 修復bug并提交,合并`bug-07`到`master`分支
$ git commit -m "fix the bug-07"
$ git checkout master
$ git merge --no-ff -m "merge bug-07" bug-07
4. 刪除`bug-07`分支
$ git branch -d bug-07
5. 查看當前`stash`
$ git stash list
6. 恢復`dev`分支的工作狀態,并刪除stash內容
$ git stash pop
### 10. 多人協作
* 查看遠程庫信息
$ git remote
* 詳細查看遠程信息
$ git remote -v
* 推送分支到遠程庫
$ git remote origin master
* 抓取遠程分支
$ git pull origin master
### 11. 標簽管理
* 創建一個標簽,默認為`HEAD`當前分支添加標簽
$ git tag v1.0
* 為版本號為`e8b8ef6`添加`v2.0`標簽
$ git tag v2.0 e8b8ef6
* 為版本號為`6cb5a9e`添加帶有說明的標簽,`-a`指定標簽名,`-m`指定說明文字
$ git tag -a v3.0 -m "version 0.2 released" 6cb5a9e
* 根據標簽查看指定分支
$ git show v0.2
* 查看所有標簽
$ git tag
* 刪除`v1.0`標簽
$ git tag -d v1.0
* 把`v0.9`標簽推送到遠程
$ git push origin v0.9
* 推送所有尚未推送到遠程的本地標簽
$ git push origin --tags
* 刪除遠程標簽, 先刪除本地標簽,再刪除遠程標簽
$ git tag -d v0.9
$ git push origin :refs/tags/v0.9
- 講解 Markdown
- 示例
- SVN
- Git筆記
- github 相關
- DESIGNER'S GUIDE TO DPI
- JS 模塊化
- CommonJS、AMD、CMD、UMD、ES6
- AMD
- RequrieJS
- r.js
- 模塊化打包
- 學習Chrome DevTools
- chrome://inspect
- Chrome DevTools 之 Elements
- Chrome DevTools 之 Console
- Chrome DevTools 之 Sources
- Chrome DevTools 之 Network
- Chrome DevTools 之 Memory
- Chrome DevTools 之 Performance
- Chrome DevTools 之 Resources
- Chrome DevTools 之 Security
- Chrome DevTools 之 Audits
- 技巧
- Node.js
- 基礎知識
- package.json 詳解
- corepack
- npm
- yarn
- pnpm
- yalc
- 庫處理
- Babel
- 相關庫
- 轉譯基礎
- 插件
- AST
- Rollup
- 基礎
- 插件
- Webpack
- 詳解配置
- 實現 loader
- webpack 進階
- plugin 用法
- 輔助工具
- 解答疑惑
- 開發工具集合
- 花樣百出的打包工具
- 紛雜的構建系統
- monorepo
- 前端工作流
- 爬蟲
- 測試篇
- 綜合
- Jest
- playwright
- Puppeteer
- cypress
- webdriverIO
- TestCafe
- 其他
- 工程開發
- gulp篇
- Building With Gulp
- Sass篇
- PostCSS篇
- combo服務
- 編碼規范檢查
- 前端優化
- 優化策略
- 高性能HTML5
- 瀏覽器端性能
- 前后端分離篇
- 分離部署
- API 文檔框架
- 項目開發環境
- 基于 JWT 的 Token 認證
- 扯皮時間
- 持續集成及后續服務
- 靜態服務器搭建
- mock與調試
- browserslist
- Project Starter
- Docker
- 文檔網站生成
- ddd