維基百科:git 是一個(gè)分散式版本控制軟體豁翎,由Linus Torvalds創(chuàng)作佃扼,于2005年以GPL推出
開發(fā)動(dòng)力來(lái)自對(duì)Linux核心采用來(lái)自BitKeeper的付費(fèi)版本控制軟件的不合缝驳,盡管BitKeeper母公司授權(quán)Linux社區(qū)免費(fèi)使用該軟件异袄。其他的開源集中式版本控制系統(tǒng)如CVS/SVN則被Linus所不喜(集中式夫偶,速度慢且必須聯(lián)網(wǎng)使用)亥曹,于是Linus用了10天時(shí)間用C編寫了分布式版本控制Git軟件,其特點(diǎn)是不需服務(wù)器端軟體毡泻,就可運(yùn)行版本控制且速度很快胜茧,其中最出色的功能是合并追蹤(merge tracing)。
簡(jiǎn)介
關(guān)于Git 的詳細(xì)介紹可參見廖雪峰老師的Git介紹仇味,有詳細(xì)的比喻呻顽。
簡(jiǎn)要來(lái)說(shuō)就是通過(guò)分布式版本控制,每個(gè)人電腦上都有一個(gè)完整的git版本庫(kù)丹墨,自動(dòng)記錄每次文件及目錄的改動(dòng)廊遍,并提供協(xié)作編輯的能力(通過(guò)服務(wù)器實(shí)現(xiàn)修改的交換),可追蹤多個(gè)版本的開發(fā)及維護(hù)工作贩挣,相比CVS/SVN等SCM(Software Configuration Managemen) 工具喉前,有著cheap local branching, convenient staging areas, multiple workflows等優(yōu)點(diǎn),且不管是小項(xiàng)目還是大項(xiàng)目王财,都有很快的速度和極高的效率卵迂。
安裝
從官網(wǎng)下載安裝最新版本,舊版本在Github上可以找到绒净。
使用
-
git init
在當(dāng)前目錄下創(chuàng)建版本庫(kù)(.git目錄下), git將用該目錄來(lái)跟蹤管理倉(cāng)庫(kù)(repository)见咒,該命令會(huì)創(chuàng)立唯一的master分支. -
git add sample.txt
將文件sample添加到暫存區(qū)(stage或index),以便后續(xù)提交到分支中.
每次修改后,必須用git add命令將修改添加到暫存區(qū)再提交.
git commit -m "wrote a sample file"
將文件提交到當(dāng)前分支進(jìn)行保存挂疆,-m后表示提交說(shuō)明.
可多次add不同文件改览,最后提交一次,類似選中多個(gè)后提交. -
git status
掌握倉(cāng)庫(kù)當(dāng)前的狀態(tài), 想了解文本文件詳細(xì)的變化可用以下命令:
git diff sample.txt
列出文本文件所修改的地方缤言,確認(rèn)無(wú)誤后宝当,重新添加提交
git add sample.txt
git commit -m "modify some words"
以上即是對(duì)文本修改后的重新提交至倉(cāng)庫(kù),生成新版本 -
git log
顯示從最近到最遠(yuǎn)的commit歷史胆萧,將輸出commit_id及提交說(shuō)明庆揩。其中commit_id是由SHA-1校驗(yàn)和作為版本id.
命令末尾可添加--pretty=oneline
,輸出簡(jiǎn)要的id及修改信息. -
git relog
查看命令歷史鸳碧,可用于確定要回到未來(lái)的哪個(gè)版本. -
git reset --hard commit_id
git通過(guò)HEAD指針指向commit的不同版本的Master分支,HEAD^
可表示上個(gè)版本分支盾鳞,類似HEAD^^
,HEAD~**
瞻离,回退到上上個(gè)版本或往上100個(gè)版本. -
git checkout -- file.txt
撤銷對(duì)file的修改腾仅,回到上一次commit的狀態(tài),用版本庫(kù)里的替換工作區(qū)的套利。
checkout -b xxx 表示切換到其他分支
小結(jié):
場(chǎng)景1:改亂了工作區(qū)某個(gè)文件的內(nèi)容推励,想直接丟棄工作區(qū)的修改時(shí)鹤耍,用命令git checkout -- file。
場(chǎng)景2:不但改亂了工作區(qū)某個(gè)文件的內(nèi)容验辞,還添加到了暫存區(qū)時(shí)稿黄,想丟棄修改,分兩步跌造,第一步用命令git reset HEAD <file>杆怕,就回到了場(chǎng)景1,第二步按場(chǎng)景1操作壳贪。
-
git remote add origin git@server-name:path/repo-name.git
將本地倉(cāng)庫(kù)關(guān)聯(lián)到一個(gè)遠(yuǎn)程倉(cāng)庫(kù)
git remote -v
將用于查看遠(yuǎn)程分支的信息. -
git push -u origin master
將本地master分支與遠(yuǎn)程的master分支連接陵珍,并將本地所有提交推送到遠(yuǎn)程
以上兩步通常是遠(yuǎn)程庫(kù)為空,將本地庫(kù)推送到遠(yuǎn)程的步驟 -
git clone git@github.com:repo-name.git
從遠(yuǎn)程復(fù)制倉(cāng)庫(kù)到本地违施,clone僅僅將復(fù)制master分支互纯。若要對(duì)其他分支進(jìn)行操作,需要建立與遠(yuǎn)程分支一致的分支磕蒲,例如
git checkout -b dev origin/dev
留潦,后續(xù)pull,push進(jìn)行推送即
git branch --set-upstream-to=origin/<branch> dev
(鏈接本地與origin)
git pull
(注:若有沖突需要先解決沖突再commit后進(jìn)行push)
git push origin/dev
注:從Github上獲取clone的地址。
地址有兩種辣往,一種是SSH兔院,一種HTTPS
HTTPS除了速度慢,每次推送都必須輸入口令站削,在某些只開放HTTP端口的公司內(nèi)部就無(wú)法使用ssh協(xié)議而只能用https秆乳,而通過(guò)SSH支持的原生Git協(xié)議速度最快。 -
git branch
用于查看當(dāng)前的分支
git branch name
創(chuàng)建name分支 -
git merge branchA
將指定branchA分支合并到當(dāng)前所在分支
合并有Fast-forward模式钻哩,即將當(dāng)前分支指針指向指向指定的提交,將不保留分支信息肛冶,即看不出進(jìn)行過(guò)合并.
若通過(guò)--no-ff禁用Fast-forward模式街氢,Git將通過(guò)新建commit進(jìn)行提交以保留分支信息,即git merge --no-ff -m "merge with no-off" A -
git branch -d branchA
刪除branchA
git branch -D <name>
將強(qiáng)制刪除睦袖,適用于刪除一個(gè)沒有被合并過(guò)的分支 -
git log --graph
顯示分支合并圖
小結(jié):
通常實(shí)際中珊肃,master分支十分穩(wěn)定,通過(guò)派生出的dev分支進(jìn)行開發(fā)工作馅笙,每個(gè)人在自己的dev分支上進(jìn)行開發(fā)新功能伦乔,再將新功能合并到dev分支上,大版本更新時(shí)將dev分支合并到master分支董习,在master分支上發(fā)布新的大版本. -
git stash
將當(dāng)前工作狀態(tài)保存后留待后續(xù)使用烈和,提供干凈的環(huán)境,以便處理新的緊急情況 -
git stash list
列出保存的工作狀態(tài) -
git stash pop
orgit stash apply
git stash drop
恢復(fù)有兩種方式皿淋,pop將恢復(fù)并刪除stash招刹,apply恢復(fù)但不刪除而通過(guò)drop進(jìn)行刪除 -
git rebase
將本地未push的分支提交歷史整理為直線恬试,使我們查看歷史提交更容易,缺點(diǎn)是本地的分叉提交被修改過(guò)疯暑。 -
git tag v1.0
給當(dāng)前分支取標(biāo)簽训柴,便于記憶及使用,默認(rèn)是在當(dāng)前分支最新提交上commit上打標(biāo)簽妇拯,即有該commit的分支均可看到該標(biāo)簽
git tag v0.9 commit_id
對(duì)某個(gè)commit打標(biāo)簽
git show tag_name
顯示標(biāo)簽信息
git tag
顯示所有的標(biāo)簽
git tag -d tag_name
從本地刪除某個(gè)標(biāo)簽幻馁,然后從遠(yuǎn)程刪除git push origin :refs/tags/tag_name
git push origin tag_name
推送某個(gè)標(biāo)簽到遠(yuǎn)程, push origin --tags將推送所有未推送過(guò)的標(biāo)簽