初始化開發(fā)環(huán)境
安裝git后需要做的第一件事情
git config --global user.name 'exmaple: Github Account'// 配置用戶名
git config --global user.email 'example: GitHub Email Address' //配置用戶email
用于某個項(xiàng)目的特殊配置, 將上面的
--global參數(shù)替換為--local
要查看當(dāng)前的配置信息,輸入git config --listorgit config --global --list
使用github
- 生成ssh key
# Step 1.
在終端中輸入 ssh-keygen -t rsa -C "YOUR EMAIL"
一直按回車
# Step 2.
cd ~/.ssh
cat id_rsa.pub
拷貝其中內(nèi)容
- 將上一步得到的內(nèi)容設(shè)置到github中
具體的查看Github上的內(nèi)容, 此處只做記錄
GitHub: guide to generating SSH keys
使用別名設(shè)置自定義log
命令格式:git config alias.shorename <fullcommand>
//Example. 配置格式化的log
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
更加簡化的log:
git log --online
git 基本操作(常用命令)
查看git幫助文檔
git help <command>
git <command> -h
git <command> --help
git config 配置git
- 用戶配置
git config --global user.name "Demo User"
git config --global user.email "example@test.com"
這些配置會在提交中被展現(xiàn)

配置級別:
- --local 【默認(rèn), 高優(yōu)先級】:只影響本倉庫
.git/config- --global 【中優(yōu)先級】:影響所有當(dāng)前用戶的git倉庫
~/.gitconfig- --system 【低優(yōu)先級】:影響到全系統(tǒng)的git倉庫,無論是哪一個用戶
/etc/gitconfig
git init 初始化倉庫
git init [path]
git init [path] --bare
初始化后將會在被初始化的目錄下出現(xiàn)一個.git目錄, 結(jié)構(gòu)如下:
workdir
|__.git
|——HEAD
|——branches
|——config
|——description
|——hooks
|——info
|——objects
|__refs
git status
# git status 主要用于在下面3對關(guān)系之間找出他們的關(guān)系變化
- 未跟蹤 <——> 跟蹤
- 工作目錄 <——> 暫存區(qū)
- 暫存區(qū) <——> 最新提交
對文件狀態(tài)的追蹤
內(nèi)容狀態(tài): 工作區(qū),暫存區(qū),提交區(qū)
文件跟蹤狀態(tài):已跟蹤,未跟蹤

-
touch newFile, 將在工作目錄創(chuàng)建一個newFile的文件,此時(shí)文件處于未跟蹤狀態(tài)
-
git add newFileorgit add .,文件被添加到暫存區(qū),同時(shí)文件被跟蹤
.gitignore 忽略文件
- 在添加時(shí)忽略匹配文件
- 僅作用于未追蹤文件
相當(dāng)于在使用git add命令時(shí),將.gitignore文件中所列的文件類型都進(jìn)行了刪除
.gitignore文件范列
在
.gitignore文件中用"#"來添加注釋
常見的.gitignore配置,可以參考:github/gitignore
git-rm 從暫存區(qū)刪除文件
git rm --cached // 僅從暫存區(qū)刪除
git diff 顯示不同版本之間的差異
- 顯示工作目錄與暫存區(qū)之間的差異, 命令:
git diff - 暫存區(qū)與某次提交差異, 默認(rèn)為HEAD,命令:
git diff --cached [<reference>] - 工作目錄與某次提交的差異,命令:
git diff <reference> - 兩次提交之間的差異, 命令:
git diff <commitId1 commitId2>
撤銷修改
- 將文件內(nèi)容從暫存區(qū)復(fù)制到工作目錄,命令:
git checkout --<file>
此操作會丟棄你的修改
- 將文件內(nèi)容從上次提交復(fù)制到暫存區(qū),命令:
git reset HEAD <file>

git分支操作
分支的增刪查改 git branch
創(chuàng)建分支
git branch <branchName>
刪除分支
git branch -d <branchName>
查看所有分支信息
git branch -v
所有的分支信息都會存放在下面的文件中
cat .git/refs/heads/master
git checkout 通過移動HEAD檢出版本,可用于分支切換
git checkout <branchName> // 切換分支
git checkout -b <branchName> // 新建并切換到一個分支
git checkout - // 恢復(fù)到上一個分支
git checkout <commit> // 切換到某次提交, head處于分離狀態(tài),此時(shí)避免做write操作
git reset 將當(dāng)前分支回退到歷史某個版本
git reset --mixed <commit> (默認(rèn)) // 會將當(dāng)前內(nèi)容復(fù)制到暫存區(qū)
git reset --soft <commit> // 會暫存區(qū)和工作目錄的狀態(tài),不會有任何變化
git reset --hard <commit> // 會將當(dāng)前內(nèi)容復(fù)制到暫存區(qū)和工作目錄
區(qū)別主要在于: 內(nèi)容是否會恢復(fù)到工作目錄或者暫存區(qū)
使用捷徑
- A^ : A上的父提交
- A~n: 在A之前的第n次提交
reset 與 checkout的區(qū)別(commit操作&file操作)
reset & checkout
| 命令 | 移動 | 范例(HEAD/branch) | 說明 |
|---|---|---|---|
| git reset 【commit】 | git reset HEAD^ --soft | 是/是 | 完全回退到某提交 |
| git reset 【file】 | git reset README.me | 否/否 | 恢復(fù)暫存區(qū)到某提交狀態(tài) |
| git checkout 【commit】 | git checkout master | 是/否 | 移動當(dāng)前指針HEAD到某提交 |
| git checkout 【file】 | git checkout --README.md git checkout HEAD --xx.log | 否/否 | 恢復(fù)工作目錄到某狀態(tài) |
git stash
保存目前的工作目錄和暫存區(qū)狀態(tài)并返回到干凈的工作空間
使用場景: 其他分支有緊急任務(wù), 但當(dāng)前分支還存在未完成的工作(不能提交也不能放棄修改的情況下)
- 保存當(dāng)前工作目錄和暫存區(qū)的文件
git stash save 'push to stash area'
- 查看暫存區(qū)內(nèi)容
git stash list
// stash@{0}: On master: push to stash area
- 取回暫存區(qū)內(nèi)容到工作目錄
git stash apply stash@{0}
- 丟棄暫存區(qū)對應(yīng)的stash
git stash drop stash@{0}
- 取回暫存區(qū)棧頂一條內(nèi)容到工作目錄并丟棄暫存區(qū)棧頂內(nèi)容
git stash pop stash@{0}
// stash pop = stash apply + stash drop
分支合并 git merge
- 解決merge沖突
- 不要使用fast-forward
穿入?yún)?shù)--no-ff
eg: git merge next --no-ff
- git rebase
修剪提交歷史基線,俗稱“變基”
eg. git rebase master // 將會進(jìn)行分支重演
如果只需要從某次提交修剪可使用以下命令:
git rebase --onto master commit
## git tag 對某個提交設(shè)置一個不變的別名
1. 為某次commit設(shè)置別名(tag)
git tag v1.0 commit
or
git tag -a 'v1.0' -m 'commit msg'
git push origin --tags
# git 遠(yuǎn)程操作
git 支持本地協(xié)議, 所以我們可以初始化一個本地的遠(yuǎn)程服務(wù)器
git init ~/git-server --bare
> bare 參數(shù)的意思是將當(dāng)前倉庫初始化為一個裸倉庫,裸倉庫沒有工作目錄
> 其文件結(jié)構(gòu)為:
git-server
|— HEAD
|—branches
|— config
|— description
|— hooks
|— info
|— objects
|— refs
## git push 用于提交本地歷史到遠(yuǎn)程
## git remote 遠(yuǎn)程倉庫的相關(guān)配置
1. 配置遠(yuǎn)程映射
git remote add origin ~/git-server // 添加遠(yuǎn)程倉庫別名(origin 就是遠(yuǎn)程倉庫git-server的別名,信息會放在.git/config文件下)
git remote -v // 查看遠(yuǎn)程倉庫配置
## push 沖突
> 其他用戶先于你push時(shí), 會產(chǎn)生沖突
1. 使用git fetch+merge來解決這一問題
step 1
git fetch origin master
step 2
git merge origin/master
step 3
將這次提交推送到服務(wù)器
* 1中的3個步驟也可以使用
