配置git
git config --global user.name/user.email
// 配置級(jí)別
--local // 默認(rèn)官紫,高優(yōu)先級(jí),只影響本倉(cāng)庫(kù)
--global // 中富蓄, 影響到當(dāng)前用戶的所有g(shù)it倉(cāng)庫(kù)
--system // 低徘六, 影響全局git 倉(cāng)庫(kù)
初始化倉(cāng)庫(kù)
git init [[path]/ [path]--bare]
基本操作
git status // 對(duì)狀態(tài)的跟蹤 內(nèi)容狀態(tài):工作目錄/ 暫存區(qū)/提交區(qū) 文件狀態(tài): 未跟蹤/已跟蹤
git add // 添加文件到暫存區(qū)(同時(shí)文件被跟蹤)
git add . // 他會(huì)監(jiān)控工作區(qū)的狀態(tài)樹(shù)沼死,使用它會(huì)把工作時(shí)的所有變化提交到暫存區(qū)歼跟,包括文件內(nèi)容修改(modified)以及新文件(new),但不包括被刪除的文件巴刻。
git add -u // 他僅監(jiān)控已經(jīng)被add的文件(即tracked file),他會(huì)將被修改的文件提交到暫存區(qū)蛉签。add -u 不會(huì)提交新文件(untracked file)胡陪。(git add --update的縮寫(xiě))
git add -A // 是上面兩個(gè)功能的合集(git add --all的縮寫(xiě))
git rm // 刪除
-- cached // 僅從暫存區(qū)刪除
--f // 從暫存區(qū)與工作目錄刪除
git rm $(git ls-files --deleted) // 刪除所有被跟蹤,但是在工作目錄被刪除的文件
git ls-files // 展示所有被跟蹤的文件
git checkout -- <file> // to discard changes in working directory(撤銷工作目錄的修改碍舍,緩存區(qū)內(nèi)容覆蓋工作目錄)
git reset HEAD <file> // to unstage (撤銷暫存區(qū)內(nèi)容柠座, 即暫存區(qū)被提交區(qū)內(nèi)容覆蓋)
git checkout HEAD -- <file> // 提交區(qū)的內(nèi)容覆蓋暫存區(qū)和工作目錄,即撤銷所有修改到上次commit
git commit // 提交到 提交區(qū)
-m 'message' // 提交時(shí)的message
-a -m'message' // 直接從工作目錄提交到提交區(qū)
-m"message" -n // m:message, n :no-verify
git-log // 查看提交的歷史記錄
--oneline // 簡(jiǎn)短記錄乒验,一行
git 中別名的設(shè)置
git config alias.<shortname> '<fullcommand>' // 為fullcommand 配置別名shortname
// eg:
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
"
顯示工作目錄與暫存區(qū)的差異
git diff // 工作目錄與暫存區(qū)的差異
git diff -cached [<reference>] // 暫存區(qū)與某次提交差異愚隧,默認(rèn)為HEAD
git diff <reference> // 工作目錄與某次提交的差異
忽略文件
.gitignore //在添加時(shí)忽略匹配文件蒂阱,僅作用于**未跟蹤**的文件
分支管理
git branch // 分支的增刪改查
git branch <branchName> // 查看分支
git branch -a // 查看本地和遠(yuǎn)程分支
git branch -m "daily/0.0.1" // 在本分支修改名字
git branch –d <branchName> // 如果是要?jiǎng)h除本地已經(jīng)合并了的分支
git branch –D <branchName> // 如果是要?jiǎng)h除本地未合并的分支
git branch -v 顯示所有分支信息
git checkout <branchName> 通過(guò)移動(dòng)HEAD檢出版本锻全,切換分支
git checkout -b <branchName> 創(chuàng)建分支狂塘,并切換到該分支
git checkout -b <branchName> origin/<branchName> 以origin/branchName 為基礎(chǔ)創(chuàng)建分支并切換到該分支
git fetch origin <origin branchName>:<local branchName> // 使用該方式會(huì)在本地新建分支x,但是不會(huì)自動(dòng)切換到該本地分支x鳄厌,需要手動(dòng)checkout荞胡。
git reset -將當(dāng)前分支會(huì)退到歷史某個(gè)版本
git reset --mixed <commit> // (默認(rèn)), 把分支(branch&HEAD)移動(dòng)到 commit, 且把暫存區(qū)內(nèi)容替換為commit
git reset --soft <commit> // 暫存區(qū)和工作目錄不改變
git reset --hard <commit> // 且把暫存區(qū)和 工作目錄都用commit內(nèi)容替換掉
// reset 捷徑
A^ // A的上一次提交
A~n // A之前的第n次提交
// eg:
git reset HEAD^
git reset HEAD~5
git reset HEAD 撤銷 add .到add 前。
git reset --hard HEAD^ 撤銷到commit的上一次了嚎,如果要撤銷到上99次泪漂,可以用 git reset --hard~99;
git reset --hard 9425c47b6 //版本號(hào)
git reflog // 查詢所有提交log,包括回退前的版本
git stash // 保存當(dāng)前的暫存區(qū)和工作目錄到git stash 棧中歪泳,并從最近的一次提交中讀取相關(guān)內(nèi)容萝勤,讓暫存區(qū)和工作目錄保持clean,從而可以切換分支等一系列操作呐伞。
git stash save 'message' // 同 git stash 并增加 message敌卓,便于理解保存內(nèi)容
git stash pop: 從Git stash棧中讀取最近一次保存的內(nèi)容,恢復(fù)工作區(qū)的相關(guān)內(nèi)容伶氢。由于可能存在多個(gè)Stash的內(nèi)容趟径,所以用棧來(lái)管理,pop會(huì)從最近的一個(gè)stash中讀取內(nèi)容并恢復(fù)癣防。
git stash apply stash@{0} // 讓保存的stash@{0} 中的內(nèi)容從新回到工作目錄和暫存區(qū)
git stash drop stash@{0} // 刪除git stash棧中的stash@{0}內(nèi)容
git stash list: 顯示Git stash棧內(nèi)的所有備份蜗巧,可以利用這個(gè)列表來(lái)決定從那個(gè)地方恢復(fù)。
git stash clear: 清空Git棧蕾盯。此時(shí)使用gitg等圖形化工具會(huì)發(fā)現(xiàn)幕屹,原來(lái)stash的哪些節(jié)點(diǎn)都消失了。
git merge // 合并分支, 默認(rèn)為 fast-forward合并
git merge branchA // 把branchA 合并到當(dāng)前分支
git merge branchA branchB // 把branchA合并到branchB
git merge --no-ff branchA // 合并分支级遭,并保留分支的合并信息
git cat-file -p HEAD|| branch|| commitHash // 查看具體分支的詳細(xì)信息 -p 參數(shù)為 'Pretty-print the contents of object based on its type.'
reset vs checkout
reset 與checkout命令對(duì)比圖
rebase 變基
git rebase branchA// 檢修提交歷史基線香嗓,使合并的分支branchA成為線性
git rebase -- onto branchA commitId // 同上,只不過(guò)合并了commitId装畅,而不是本分支的所有內(nèi)容靠娱。
盡量不要在共有分支上使用rebase,因?yàn)閞ebase會(huì)從新生成commitID會(huì)導(dǎo)致你本地的部分commidId和隊(duì)友的不同掠兄,從而造成沒(méi)必要的沖突
git rebase
while(存在沖突) {
git status
找到當(dāng)前沖突文件像云,編輯解決沖突
git add -u
git rebase --continue
if( git rebase --abort ) 如果rebase過(guò)程中,你想中途退出蚂夕,恢復(fù)rebase前的代碼則可以用命令
break;
}
使用git rebase合并多次commit
1.首先使用git log查看一下提交歷史
2. git 壓縮 git rebase -i HEAD~4
git pull = git fetch + git merge
git pull --rebase = git fetch + git rebase
使用別名
git tag tagName branch || commitId // 把 此時(shí)此刻的branch 或者commitId 打上名為tagName 的tag
git tag -l // 列出tag的list
git push origin tagName // 把tag推到origin
創(chuàng)建本地遠(yuǎn)程提交倉(cāng)庫(kù)
git init [path] --bare // --bare 表示為裸倉(cāng)庫(kù)迅诬,是因?yàn)檫@個(gè)倉(cāng)庫(kù)只保存git歷史提交的版本信息
遠(yuǎn)程提交
源倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)合并
git remote -v 查看遠(yuǎn)程主機(jī)狀態(tài)
git remote rm origin 刪除遠(yuǎn)程倉(cāng)庫(kù)
git remote add upstream git@github.com:xxx/xxx.git 添加源倉(cāng)庫(kù)地址
git fetch upstream 從源倉(cāng)庫(kù)更新同步代碼
git merge upstream/master 合并到本地代碼
git push 向自己遠(yuǎn)程倉(cāng)庫(kù)推送剛才同步源倉(cāng)庫(kù)后的代碼
git fetch // 本地更新遠(yuǎn)程同步
$ git push origin newBranch // 把分支同步到遠(yuǎn)程,如果遠(yuǎn)程沒(méi)有該分支婿牍,直接創(chuàng)建一個(gè)(但是前提是local分支名字要和遠(yuǎn)程相同)
git push origin --delete thisBranch // 刪除遠(yuǎn)程分支
git clone // 克隆一個(gè)遠(yuǎn)程倉(cāng)庫(kù)
gid