怎么做企業(yè)網(wǎng)站一級(jí)懸浮菜單一個(gè)萬(wàn)能的營(yíng)銷方案
git,一個(gè)分布式的版本管理工具。主要用處:版本管理、協(xié)作開發(fā)。
常見版本管理工具:
VSS —— Visual Source Safe
CVS —— Concurrent Versions System
SVN —— CollabNet Subversion
GIT?
GIT安裝:下載安裝文件:Git-2.41.0-64-bit.exe
運(yùn)行:
?Git是分布式版本控制系統(tǒng)。(另一種是集中式版本控制系統(tǒng))
分布式版本控制系統(tǒng)沒(méi)有“中央服務(wù)器”,每臺(tái)電腦上都有一個(gè)完整的版本庫(kù)。
就是說(shuō),一開始,每臺(tái)電腦上都有一個(gè)一樣的版本庫(kù),然后每個(gè)人不需要聯(lián)網(wǎng),就可以做自己的版本控制,添加、修改、刪除文件等操作,操作保存在自己本地的版本庫(kù)中,經(jīng)過(guò)一段時(shí)間后,再指定一個(gè)統(tǒng)一的地方,大家都把本地的版本庫(kù)合并到這個(gè)統(tǒng)一的地方,實(shí)際上就是集中式版本系統(tǒng)的中央服務(wù)器,合并中有可能出現(xiàn)各種問(wèn)題,如沖突等,解決完這些沖突,就形成一個(gè)大家都認(rèn)可的版本,每個(gè)人再將這個(gè)版本的庫(kù)下載到本地,再次基礎(chǔ)上再次進(jìn)行開發(fā),循環(huán)往復(fù),做到版本控制。
一、版本庫(kù)創(chuàng)建
版本庫(kù)又名倉(cāng)庫(kù)(repository),創(chuàng)建版本庫(kù),需要在一個(gè)合適的地方,創(chuàng)建一個(gè)空目錄:
md e:\learngit
cd learngit
git init
Windows下:
?centos6下:
windows下可以使用git bash,環(huán)境就是模擬的linux:
?
?windows下可以使用圖形界面:即Git GUI
創(chuàng)建倉(cāng)庫(kù)后,會(huì)創(chuàng)建.git子目錄及相關(guān)文件、子目錄:
?二、使用
1、添加文件到倉(cāng)庫(kù):git add filename
需要在learngit目錄下創(chuàng)建文件,這個(gè)是工作目錄,其他地方git是無(wú)法管理的
?
?2、提交文件到倉(cāng)庫(kù):git commit -m “說(shuō)明信息”
?
?第一次提交,出現(xiàn)提示信息,在linux下,默認(rèn)使用你的登錄名和hostname作為user.name和user.email,可以使用git config --global user.name “USERNAME”? 和?git config --global user.email “EMAIL”來(lái)設(shè)置全局的用戶名和郵箱地址,來(lái)標(biāo)識(shí)提交文件的主人,不帶--global,則只在本倉(cāng)庫(kù)有效。Windows中,這兩項(xiàng)配置文件為C:\Users\Administrator\.gitconfig :
?windows下:
?配置信息及其保存位置:
git config -l 是三個(gè)信息的匯總,分別是:
1).倉(cāng)庫(kù)級(jí)別 local。 2).用戶級(jí)別global。 3).系統(tǒng)級(jí)別system。
優(yōu)先級(jí)倉(cāng)庫(kù)級(jí)別最高,用戶級(jí)別次之,系統(tǒng)級(jí)別最低。
1)、倉(cāng)庫(kù)級(jí)別:git config --local -l
?配置文件在倉(cāng)庫(kù)的.git目錄下的config文件:
2)、用戶級(jí)別global、 git? config --global -l
?配置文件在C:\Users\Administrator\.gitconfig
3)、系統(tǒng)界別system. git config --system -l
?配置文件在git安裝目錄下的etc中的gitconfig文件,如:D:\Program Files\Git\etc\gitconfig
?在centos6.7中
1)、倉(cāng)庫(kù)級(jí)別:git config --local -l 配置文件在倉(cāng)庫(kù)目錄下:.git/config
2)、用戶級(jí)別global、 git? config --global -l?配置文件在用戶家目錄下的.gitconfig
3)、系統(tǒng)界別system. git config --system -l 配置文件在/etc/gitconfig
3、git status :掌握倉(cāng)庫(kù)的當(dāng)前狀態(tài):
當(dāng)修改了某個(gè)文件,而又沒(méi)有add,更沒(méi)有commit時(shí),倉(cāng)庫(kù)中的文件就與工作區(qū)的文件不同了,此時(shí)使用gitstatus查看:
?git add后
?提交后,再次修改:使用git diff a1.txt查看不同:
?4、git log 查看提交日志
?黃色的字符串,是commit id,即版本號(hào)。簡(jiǎn)潔版的顯示
?
?5、git reset? 版本回退(或叫版本回滾),恢復(fù)到以前的某個(gè)版本
Git必須知道當(dāng)前版本是哪個(gè)版本,Git中,用HEAD表示當(dāng)前版本,上一個(gè)版本使用HEAD^表示,上上一個(gè)版本用HEAD^^,版本多了,使用HEAD~#,如HEAD~10,回退到往前第10個(gè)版本。
?
?如果要再回到第四次的版本,需要先找到第四次的commitid,方法是使用git reflog
git log無(wú)法顯示回退前的版本信息。
?這里看到readme.txt-4的commitid,使用如下命令:
git reset --hard commitid
?
?
?6、工作區(qū)和暫存區(qū)
工作區(qū)(working Directory):就是電腦中能看到的目錄,比如這里的e:\learngit
版本庫(kù)(Repository):工作區(qū)中有一個(gè)隱藏目錄“.git”,這個(gè)不算工作區(qū),而是Git版本庫(kù)。
版本庫(kù)中存了很多東西,其中最重要的就是稱為stage(或叫index)的暫存區(qū),Git自動(dòng)創(chuàng)建的第一個(gè)分支master,以及指向master的一個(gè)指針叫做HEAD。
?
?把文件往Git版本庫(kù)?添加的時(shí)候,是分兩步執(zhí)行的:
第一步是用“git add”把文件添加進(jìn)去,實(shí)際上就是把文件修改添加到暫存區(qū);
第二步是用“git commit”提交更改,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支。
因?yàn)槲覀儎?chuàng)建Git版本庫(kù)時(shí),Git自動(dòng)為我們創(chuàng)建了唯一一個(gè)master分支,所以,現(xiàn)在,
commit就是往master分支上提交更改。
需要提交的文件修改通通放到暫存區(qū),然后,一次性提交暫存區(qū)的所有修改。
對(duì)于第一次修改后,執(zhí)行了git add,然后又進(jìn)行了第二次修改,然后直接進(jìn)行g(shù)it commit,則在工作區(qū)的第二次修改因?yàn)闆](méi)有放入暫存區(qū),所以,git commit只把暫存區(qū)的第一次修改提交了,第二次修改不會(huì)被提交。
使用:git diff HEAD -- filename 來(lái)比較工作區(qū)和版本庫(kù)里面最新版本的區(qū)別:
?所以,每次工作區(qū)的修改最好都add一下,最后一起commit。
7、撤銷修改
對(duì)于存在不一致的文件,如下:
?git提示,可以使用git restore <file>來(lái)丟棄工作區(qū)的修改
?使用git checkout -- <filename>也可以實(shí)現(xiàn)。
git restore --staged <file>丟棄暫存區(qū)的修改,即git add的修改丟棄,但只是丟棄暫存區(qū)的修改,所以執(zhí)行后,status會(huì)回到Changes not staged for commit狀態(tài)。
關(guān)于git checkout命令:
Git社區(qū)發(fā)布了Git的新版本2.23。在該版本中,有一個(gè)特性非常引人矚目,就是新版本的Git引入了兩個(gè)新命令 git switch 和 git restore,用以替代現(xiàn)在的 git checkout。換言之,git checkout 將逐漸退出歷史舞臺(tái)。
Git社區(qū)決定這樣做,是因?yàn)槟壳?git checkout 命令承載了太多的功能,這讓新手們感到困惑。git checkout 的核心功能包括兩個(gè)方面,一個(gè)是分支的管理,一個(gè)是文件的恢復(fù)。這兩個(gè)核心功能,未來(lái)將由 git switch 和 git restore 分別負(fù)責(zé)。
相比之下,新命令旨在將職責(zé)明確分為兩個(gè)較窄的類別:更改分支的操作??和更改文件的操作
8、刪除文件
已經(jīng)提交的文件,在工作區(qū)刪除了
?需要使用git rm <file>執(zhí)行刪除的添加,或者還是使用git add <file>,將刪除的信息添加到暫存區(qū),然后git commit,就將倉(cāng)庫(kù)中的文件刪除了。
?恢復(fù):
9、遠(yuǎn)程倉(cāng)庫(kù):github
本地Git倉(cāng)庫(kù)和GitHub倉(cāng)庫(kù)之間的傳輸是通過(guò)SSH加密的,所以,需要一點(diǎn)設(shè)置:
第1步:創(chuàng)建SSH Key。在用戶主目錄下,看看有沒(méi)有.ssh目錄,如果有,再看看這個(gè)目錄下有沒(méi)有id_rsa和id_rsa.pub這兩個(gè)文件,如果已經(jīng)有了,可直接跳到下一步。如果沒(méi)有,打開Shell(Windows下打開Git Bash),創(chuàng)建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
需要把郵件地址換成自己的郵件地址,然后一路回車,使用默認(rèn)值即可,由于這個(gè)Key也不是用于軍事目的,所以也不需設(shè)置密碼。在用戶主目錄中找到.ssh目錄,有id_rsa和id_rsa.pub兩個(gè)文件,這兩個(gè)就是SSH Key的秘鑰對(duì),id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。
第2步,設(shè)置github上的SSH KEY
?
?這樣,就可以在本地連接github了。
先在github上創(chuàng)建一個(gè)空倉(cāng)庫(kù),learngit:
然后在本地learngit工作區(qū)中執(zhí)行:
git remote add origin git@github.com:kaoa000/learngit.git
這樣,就將本地倉(cāng)庫(kù)與github上的learngit倉(cāng)庫(kù)進(jìn)行了關(guān)聯(lián)。添加后,遠(yuǎn)程庫(kù)的名字就是origin,這是Git默認(rèn)的叫法,也可以改成別的。
git push -u origin master? ?將本地倉(cāng)庫(kù)推送到遠(yuǎn)程倉(cāng)庫(kù)。
(github訪問(wèn)確實(shí)是慢,而且時(shí)斷時(shí)續(xù))
推送前
?推送后:
?把本地庫(kù)的內(nèi)容推送到遠(yuǎn)程,用git push命令,實(shí)際上是把當(dāng)前分支master推送到遠(yuǎn)程。
由于遠(yuǎn)程庫(kù)是空的,第一次推送master分支時(shí),加上了-u參數(shù),Git不但會(huì)把本地的 master分支內(nèi)容推送的遠(yuǎn)程新的master分支,還會(huì)把本地的master分支和遠(yuǎn)程的master 分支關(guān)聯(lián)起來(lái),在以后的推送或者拉取時(shí)就可以簡(jiǎn)化命令。
現(xiàn)在只要本地作了提交,就可以通過(guò)命令: $ git push origin master
把本地master分支的最新修改推送至GitHub
從遠(yuǎn)程庫(kù)克隆:
git clone git@github.com:kaoa000/learngit.git
?gitee的使用與github相似:
git remote add origin https://gitee.com/persistself/giteetest.git
git clone?https://gitee.com/persistself/giteetest.git
?不同的是,需要輸入gitee的賬號(hào)和密碼。
10、分支管理:
創(chuàng)建與合并分支:
每次提交,Git都把它們串成一條時(shí)間線,這條時(shí)間線就是一個(gè)分支。目前為止只有一條時(shí)間線,在Git中,這個(gè)分支叫主分支,即 master分支。
HEAD嚴(yán)格來(lái)說(shuō)不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是當(dāng)前分支。
一開始的時(shí)候,master分支是一條線,Git用master指向最新的提交,再用HEAD指向master,就能確定當(dāng)前分支,以及當(dāng)前分支的提交點(diǎn):
?創(chuàng)建新的分支,如dev,Git新建了一個(gè)指針叫dev,指向master相同的提交,再把HEAD指向dev,就表示當(dāng)前分支在dev上:
?從現(xiàn)在開始,對(duì)工作區(qū)的修改和提交就是針對(duì)dev分支了,如新提交一次后,dev 指針往前移動(dòng)一步,而master指針不變:
?在dev上的工作完成了,就可以把dev合并到master上。就是直接把master指向dev的當(dāng)前提交,就完成了合并:
?可以刪除dev分支。刪除dev分支就是把dev指針給刪掉,刪掉后,就剩下了一條master分支:
?創(chuàng)建dev分支,然后切換到dev分支:
git checkout -b dev
git checkout命令加上-b參數(shù)表示創(chuàng)建并切換,相當(dāng)于以下兩條命令:
git branch dev
git checkout dev
使用git branch查看當(dāng)前分支:
?git branch列出所有分支,當(dāng)前分支前標(biāo)有一個(gè)星號(hào):*
在dev分支上提交:
?切換回master:
git checkout master
?可以看到,readme.txt中dev分支上提交的修改沒(méi)有了。因?yàn)槟莻€(gè)提交是在dev分支上。
?現(xiàn)在,把dev分支的工作成果合并到master分支上:
git merge dev :此命令用于合并指定分支到當(dāng)前分支。
?刪除dev分支,合并完成后,就可以刪除dev分支:
git branch -d dev
?Git鼓勵(lì)大量使用分支:
查看分支:git branch
創(chuàng)建分支:git branch name? ??
切換分支:git checkout name? ? 或 git switch name
創(chuàng)建+切換分支:git checkout -b name? ?或 git switch -c name
合并某分支到當(dāng)前分支:git merge name
刪除分支:git branch -d name
新版本增加git switch切換分支。
11、解決沖突
git switch -c feature1
修改readme.txt最后一行,在feature1上提交,切換到master分支:
git switch master? ?,修改readme.txt,然后提交master分支上
?此時(shí):
?這種情況下,Git無(wú)法執(zhí)行“快速合并”,即Fast-forward,這種合并會(huì)有沖突:
?
?Git用<<<<<<<,=======,>>>>>>標(biāo)記出不同分支的內(nèi)容
修改readme.txt,保存后再次添加提交:
?現(xiàn)在,分支變成如下圖:
?查看合并情況:git log --graph --pretty=oneline --abbrev-commit
?刪除feature1分支:git branch -d feature1
強(qiáng)行刪除分支:git branch -D feature1? ?:在feature1分支上已經(jīng)添加并提交,但是還沒(méi)有合并,可以使用-D強(qiáng)制刪除分支。
12、分支管理策略
合并時(shí),使用Fast forward模式,刪除分支后,會(huì)丟掉分支信息,可以強(qiáng)制禁用Fast forward模式。Git就會(huì)在merge時(shí)生成一個(gè)新的commit,這樣從分支歷史上就可以看出分支信息。
?
?13、Bug分支:
git stash
git stash list
git stash apply? ? ?git stash drop
git stash pop
14、多人協(xié)作:
從遠(yuǎn)程倉(cāng)庫(kù)克隆時(shí),實(shí)際上Git自動(dòng)把本地的master分支和遠(yuǎn)程的master分支對(duì)應(yīng)起來(lái)了,并且,遠(yuǎn)程倉(cāng)庫(kù)的默認(rèn)名稱是origin。
查看遠(yuǎn)程庫(kù)的信息,用:git remote? 或git remote -v
?抓取(fetch)和推送(push)的origin的地址。如果沒(méi)有推送權(quán)限,就看不到push的地址。
推送分支,就是把該分支上的所有本地提交推送到遠(yuǎn)程庫(kù)。推送時(shí),要指定本地分支,這樣Git就會(huì)把該分支推送到遠(yuǎn)程庫(kù)對(duì)應(yīng)的遠(yuǎn)程分支上:
git push origin master
推送其他分支:git push origin dev
使用push推送的分支,如果遠(yuǎn)程庫(kù)中不存在,會(huì)創(chuàng)建
抓取分支:其他人克隆遠(yuǎn)程庫(kù),以進(jìn)行協(xié)作開發(fā)時(shí),從遠(yuǎn)程庫(kù)clone時(shí),默認(rèn)情況下,只能看到本地的master分支,可以用git branch查看。
?要在mydev分支上開發(fā),就必須創(chuàng)建遠(yuǎn)程origin的mydev分支到本地,使用如下命令創(chuàng)建本地mydev分支:
git checkout -b mydev origin/mydev
?沖突及解決:
如果其他人向origin/mydev分支推送了提交,而碰巧自己也對(duì)同樣的文件做了修改,并試圖推送,就會(huì)推送失敗。其他人先推送
?自己修改后又要推送:
?解決辦法是按照Git的提示,使用git pull把最新的提交從
origin/mydev抓下來(lái),然后在本地合并,解決沖突在推送:
?git pull 一開始也出錯(cuò)了,需要git branch --set-upstream-to=origin/mydev mydev關(guān)聯(lián)上
?修改完后需要再次git add 和git commit,然后gitpush
其他人要接著開發(fā)時(shí),一般先git pull一下,抓取最新的版本,再繼續(xù)開發(fā):
?因此,多人協(xié)作的工作模式通常是這樣:
1. 首先,可以試圖用git push origin branch-name推送自己的修改;
2. 如果推送失敗,則因?yàn)檫h(yuǎn)程分支比你的本地更新,需要先用git pull試圖合并;
3. 如果合并有沖突,則解決沖突,并在本地提交;
4. 沒(méi)有沖突或者解決掉沖突后,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,則說(shuō)明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒(méi)有創(chuàng)建,用命令git branch --set-upstream-to branch-name origin/branch-name。
多人協(xié)作小結(jié)
? 查看遠(yuǎn)程庫(kù)信息,使用git remote -v;
? 本地新建的分支如果不推送到遠(yuǎn)程,對(duì)其他人就是不可見的;
? 從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓
取遠(yuǎn)程的新提交;
? 在本地創(chuàng)建和遠(yuǎn)程分支對(duì)應(yīng)的分支,使用git checkout -b branch-name origin/branchname,本地和遠(yuǎn)程分支的名稱最好一致;
? 建立本地分支和遠(yuǎn)程分支的關(guān)聯(lián),使用git branch --set-upstream branch-name
origin/branch-name;
? 從遠(yuǎn)程抓取分支,使用git pull,如果有沖突,要先處理沖突。
15、忽略文件
在git的工作區(qū)的根目錄下創(chuàng)建一個(gè)特殊的.gitignore文件,然后把要忽略的文件名填進(jìn)去,Git就會(huì)自動(dòng)忽略這些文件。