git是分布式版本控制系統(tǒng)桥温,啥是分布式的呢聘芜,就是每一個(gè)用戶的主機(jī)上都有一個(gè)版本庫,可以在本地進(jìn)行版本管理趋厉。如果需要多人合作的時(shí)候寨闹,就再通過中央服務(wù)器進(jìn)行版本交換。和集中式的版本控制的區(qū)別就是君账,集中式的版本管理是只在遠(yuǎn)程繁堡,每一次commit都必須聯(lián)網(wǎng),這就有網(wǎng)絡(luò)的時(shí)延大大滴,而且當(dāng)中央服務(wù)器掛掉的時(shí)候所有人都掛了椭蹄,因?yàn)橥暾麄}庫只存在于服務(wù)器闻牡。
git版本庫
版本庫可以理解為Git倉庫,這個(gè)目錄下的所有文件都會被Git管理起來绳矩,每個(gè)文件的修改罩润,刪除,Git都能跟蹤翼馆,以便任何時(shí)刻都可以追蹤歷史割以,或者在將來某個(gè)時(shí)刻還原。
命令:
在一個(gè)目錄下应媚,git init
就可以把此目錄變成Git可以管理的目錄严沥。
這里有幾個(gè)概念:
工作區(qū):電腦里能看到的目錄,嗯中姜,就是單純的目錄
版本庫(Repository):Git的版本庫里存了很多東西消玄,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有Git為我們自動創(chuàng)建的第一個(gè)分支master扎筒,以及指向master的一個(gè)指針叫HEAD莱找。
把文件往Git版本庫里添加的時(shí)候,是分兩步執(zhí)行的:
第一步是用
git add file
把文件添加進(jìn)去嗜桌,實(shí)際上就是把文件修改添加到暫存區(qū)奥溺;
同理rm 是刪除,git rm file
是將文件在暫存區(qū)內(nèi)刪除第二步是用
git commit -m "commit message"
提交更改骨宠,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支浮定。
因?yàn)槲覀儎?chuàng)建Git版本庫時(shí),Git自動為我們創(chuàng)建了唯一一個(gè)master分支层亿,所以桦卒,現(xiàn)在,git commit就是往master分支上提交更改匿又。
你可以簡單理解為方灾,需要提交的文件修改通通放到暫存區(qū),然后碌更,一次性提交暫存區(qū)的所有修改裕偿。
如果有一些文件沒有add到暫存區(qū),那么這些文件也是commit不上去的哦~
但是難免會犯錯(cuò)
- Case1:當(dāng)改亂了工作區(qū)的修改痛单,想直接丟棄工作區(qū)的修改嘿棘,回退到clean的狀態(tài),用命令
git checkout -- file
- Case2:改亂了工作區(qū)的修改旭绒,并且add到暫存區(qū)了鸟妙。首先焦人,將暫存區(qū)的內(nèi)容回退到add前的版本
git reset HEAD file
,其次丟棄工作區(qū)的修改git checkout -- file
- Case3:已經(jīng)提交(add)了修改至?xí)捍鎱^(qū)重父,并且commit到版本庫了花椭,使用
git reset --hard commit_id
回退到commit_id的版本。commit_id是怎樣獲得的呢房午,通過git log
,git log --pretty=online
,git reflog
來查看个从。
git log
與git reflog
的區(qū)別是,git log
當(dāng)回退到某個(gè)版本時(shí)歪沃,此版本之后的記錄都自動抹去了。git reflog
是提交的完整的命令歷史嫌松,回退到某個(gè)版本沪曙,仍然可以查到位于此版本號以后的版本號。
遠(yuǎn)程倉庫
關(guān)聯(lián)遠(yuǎn)程倉庫:git remote add origin git@server-name:path/repo-name.git
萎羔。
關(guān)聯(lián)后液走,使用命令git push -u origin master
第一次推送master分支的所有內(nèi)容
以后每次本地提交后,都可以使用git push origin master
推送最新修改
使用git clone
從遠(yuǎn)程倉庫克隆至本地呀
git創(chuàng)建分支
git branch 查看當(dāng)前分支
git branch dev 創(chuàng)建dev分支
git checkout dev 切換至dev分支
git checkout -b dev 創(chuàng)建并切換至dev分支
git merge xxx 用于將指定分支的工作成果合并到當(dāng)前分支
git branch -d branchname
git解決沖突
當(dāng)兩個(gè)分支同時(shí)對一個(gè)文件進(jìn)行修改時(shí)贾陷,merge時(shí)會發(fā)生沖突缘眶,解決辦法是git status查看沖突文件,然后查看文件內(nèi)容髓废,Git用<<<<<<<巷懈,=======,>>>>>>>標(biāo)記出不同分支的內(nèi)容慌洪。
例如:
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
然后手動修改沖突的內(nèi)容顶燕,解決沖突。
用git log
可以查看分支歷史冈爹。git log --graph
命令可以看到分支合并圖
git 分支管理策略
一般情況下涌攻,合并分支是采用的fast-forward,即當(dāng)前分支與要合并的分支指針指向同一處频伤。
不使用fast-forward恳谎,命令為git merge --no-off dev,兩個(gè)分支的指針是指向不同位置的憋肖。
bug分支
存在的問題:當(dāng)前工作區(qū)在開發(fā)新功能因痛,但是線上出了問題急需解決,需要一個(gè)干凈的工作區(qū)瞬哼。
git提供了一個(gè)stash功能婚肆,git stash
可以把當(dāng)前工作現(xiàn)場儲藏起來,拉過來一個(gè)干凈的工作現(xiàn)場坐慰,然后從master分支拉出來一個(gè)新的分支较性,修復(fù)完成后用僧,切換到master分支并完成合并。
恢復(fù)工作現(xiàn)場時(shí):
查看工作現(xiàn)場:git stash list
恢復(fù)工作現(xiàn)場:git stash apply
刪除工作現(xiàn)場:git stash drop
恢復(fù)&刪除工作現(xiàn)場:git stash pop
如果多次stash赞咙,恢復(fù)的時(shí)候先用git stash list查看责循,然后恢復(fù)指定的stash:git stash apply stash@{0}
開發(fā)新分支
開發(fā)一個(gè)新feature,最好新建一個(gè)分支
如果要丟棄一個(gè)沒有被合并過的分支攀操,可以通過git branch -D
<name>強(qiáng)行刪除院仿。
多人合作
多人協(xié)作的工作模式通常是這樣:
- 首先,可以試圖用
git push origin branch-name
推送自己的修改速和; - 如果推送失敗歹垫,則因?yàn)檫h(yuǎn)程分支比你的本地更新,需要先用
git pull
試圖合并颠放; - 如果合并有沖突排惨,則解決沖突,并在本地提交碰凶;
- 沒有沖突或者解決掉沖突后暮芭,再用
git push origin branch-name
推送就能成功! - 查看遠(yuǎn)程庫信息欲低,使用
git remote -v
辕宏;
本地新建的分支如果不推送到遠(yuǎn)程,對其他人就是不可見的砾莱;
從本地推送分支瑞筐,使用git push origin branch-name
,如果推送失敗恤磷,先用git pull
抓取遠(yuǎn)程的新提交面哼;
在本地創(chuàng)建和遠(yuǎn)程分支對應(yīng)的分支,使用git checkout -b branch-name origin/branch-name
扫步,本地和遠(yuǎn)程分支的名稱最好一致魔策;
從遠(yuǎn)程抓取分支,使用git pull河胎,如果有沖突闯袒,要先處理沖突。
如果git pull提示“no tracking information”游岳,則說明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒有創(chuàng)建政敢,用命令git branch --set-upstream branch-name origin/branch-name
。
標(biāo)簽
Git標(biāo)簽是版本庫的快照胚迫,其實(shí)是指向某個(gè)Commit的指針喷户,是以一種容易記憶的方式設(shè)定的,一般可指定為版本號vx.x
打標(biāo)簽git tag v1.0
正常情況下访锻,標(biāo)簽是打在此分支的最新提交的commit上的
git tag 查看標(biāo)簽
git show tagname 查看標(biāo)簽信息
git tag commit_id 為commit_id打標(biāo)簽
git tag -a v0.1 -m "version 0.1 released" 3628164 創(chuàng)建帶有說明的標(biāo)簽褪尝,-a指定標(biāo)簽名闹获,-m指定說明文字
git push origin v0.1 推送標(biāo)簽到遠(yuǎn)程
git push origin --tags 一次性推送尚未推送到遠(yuǎn)程的本地標(biāo)簽
git tag -d v0.1 在本地刪除標(biāo)簽
git push origin :refs/tags/v0.9 刪除遠(yuǎn)程的標(biāo)簽
參考文獻(xiàn)
Git教程