499元做網(wǎng)站微信營銷技巧
git的下載
版本控制系統(tǒng)一般分為兩種,集中式版本控制系統(tǒng),分布式版本控制系統(tǒng)
什么是集中式版本控制系統(tǒng):版本庫集中存放在中央服務(wù)器,工作時候使用自己的電腦,當(dāng)工作時候在中央服務(wù)器上拉取最新版本的代碼,然后開始工作,工作完成之后,將自己編寫完的代碼再推送給中央服務(wù)器。
他的缺點也顯而易見,當(dāng)中央服務(wù)器宕機時全部的工作就無法再去進(jìn)行,而且無法確保每個人的網(wǎng)絡(luò)速度都很快,拉取推送代碼會很慢浪費大量時間。(比較有代表性的是:svn,svc等)
什么是分布式版本控制系統(tǒng):我們的每個主機設(shè)備就是一個完整的版本庫,我們可以直接在我們本地進(jìn)行工作,也不用網(wǎng)絡(luò),當(dāng)我們多人協(xié)作的時候,只需要相互推送一下代碼,這樣就可以看到各自的內(nèi)容
分布式是目前比較熱門的一種方式,優(yōu)點就是不用連接網(wǎng)絡(luò)確保了我們工作時候只需要在本地,即使是多人協(xié)作,他的速度也是非??斓摹?/p>
缺點就是,可能在本地儲存需要大量的儲存,在數(shù)據(jù)方面需要大量的維護(hù)
(在線分布式庫也有很多:github,gitlab,gitee)
什么是git:git是一個開源的分布式版本控制系統(tǒng),開源有效,快速的對很小到非常大的項目版本進(jìn)行管理
下載git
訪問官網(wǎng):
Git - 安裝 Githttps://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git
?
在這里選擇下載的平臺版本?
這里下載的gui界面
Gui界面也涵蓋了各個平臺的
初始化操作
git -v
?# 可以看到git版本
再使用git之需要先去配置一下用戶名和郵箱
git config --global user.name 'tarro'
--global : 全局配置對所有倉庫生效,如不加這個參數(shù)則只對當(dāng)前倉庫生效
--system : 系統(tǒng)配置,對所有用戶生效(這個是系統(tǒng)級別配置,一般不使用,一般使用global)
(? 其實用戶名為tarro其實可以不用’’引起來 如果是kali tarro 中間有空格 那就一定需要’’ ,如果沒有空格的情況下去掉空格也是可以的? )
配置完用戶再來配置一下郵箱
git config --global user.email 123@qq.com
由于郵箱中間是沒有空格的這里可以直接省略引號
git config --global credential.helper store???
保存一下用戶名和密碼這樣就不用每次都輸入了
git config --global --list
可以使用該命令去查看一下剛剛寫入的內(nèi)容
?
創(chuàng)建初始本地倉庫
創(chuàng)建倉庫一般有兩種方式
- 在本地進(jìn)行管理
git init
- 克隆遠(yuǎn)程倉庫
git clone
創(chuàng)建本地倉庫
git init
該命令直接把當(dāng)前所在目錄變成git的倉庫
可以看到我們執(zhí)行了該命令之后我們的目錄后面就有提示一個master的標(biāo)識
使用ls -a 還可以看到一個隱藏文件.git的文件,這個不可以進(jìn)去刪除,如果刪除了里面的東西就可以造成git結(jié)構(gòu)的破壞
如果我直接把.git這個目錄刪除那么這個目錄也不在是master
還可以在git init 后面通過路徑的方式去創(chuàng)建git倉庫
git init my-git
我們這個就是在當(dāng)前目錄下生成一個git倉庫,git init可以寫相對路徑,也可以寫絕對路徑
克隆遠(yuǎn)程倉庫?
git clone git@github.com:KALItarro/git.git
這樣就把我github上的倉庫克隆到本地了
?
?
Linux搭建本地倉庫
我準(zhǔn)備了兩個Linux,一個Windows,分別為
1.centos7?? ip: 192.168.6.1??? git主服務(wù)器
2.centos7?? ip: 192.168.6.2??? 客戶端
3.windows10 ip:192.168.6.254?? 客戶端
我分別在Linux和Windows中都安裝了git工具
先去搭建Linux的主服務(wù)器,在第一臺6.1服務(wù)器上
去創(chuàng)建一個用戶
useradd -m git
echo git:123 | chpasswd
讓后切換到這個角色中
su - git
mkdir git && cd git
先去創(chuàng)建一個目錄
git init --bare
直接創(chuàng)建一個裸模板庫,就是不放在隱藏目錄里,直接放目錄里
現(xiàn)在就不需要去配置別的了,到第二臺6.2服務(wù)器上操作即可
我先做個ssh免密,如果不做也是可以的,只不過每次遠(yuǎn)程操作都要輸入密碼
在6.2服務(wù)器上
ssh-keygen -t rsa
讓后一直回車
ssh-copy-id git@192.168.6.1
輸入yes然后輸入git的密碼123即可
先去創(chuàng)建一個名為git的文件夾(不是git也可以)
再去把項目克隆下來
git clone git@192.168.6.1:/home/git/git
由于我們還沒在這個里面做任何配置,所以空的是正常的
再次進(jìn)入剛剛克隆的git目錄
創(chuàng)建一個1.html內(nèi)容為1
echo 1 > 1.html
可以看到剛剛添加的一個,現(xiàn)在我將他添加到暫存區(qū)
git add .
這樣就添加進(jìn)去了
git status
可以查看做的操作
讓后保存到本地
git commit -m '第一次修改'
-m是注釋
下面這報錯是沒有寫用戶名和郵箱,設(shè)置一下就行
補充完之后再推送即可
git push origin master
推送成功,現(xiàn)在我們把git目錄刪除,再重新拉取一下就行
這樣的話就保存進(jìn)倉庫了,后期做出了修改等操作都可以重新推送
這些就是linux上的一些操作
現(xiàn)在去win10上通過git自帶的gui進(jìn)行一次提交,windows上的git命令也是和Linux上一樣的
?
然后多次輸入密碼
讓后就成功連接并且克隆到本地了
我在做個目錄中添加一個文件名為321
點擊一下rescan就可以看到剛剛做出的操作了
然后依次向下點,分別是放到暫存區(qū),寫入本地,推送到服務(wù)器
當(dāng)我們點擊了push的時候,如果你沒有寫你的user名稱和郵箱就會彈窗讓你寫,只需寫完重新推送即可
現(xiàn)在我去Linux上拉取一下看看
也可以看到321,這樣就同步成功了
工作區(qū)域和文件狀態(tài)
git的工作區(qū)域主要分為3個:工作區(qū),暫存區(qū),本地倉庫
git的文件一共有4種狀態(tài):未跟蹤 ,未修改,已修改,已暫存
git init #創(chuàng)建本地倉庫
git status #查看倉庫狀態(tài)
git add #添加到暫存區(qū)域
git commit #提交
上一節(jié)我已經(jīng)創(chuàng)建了一個本地倉庫
我在這創(chuàng)建了一個文件,再使用status去查看發(fā)現(xiàn)他是一個未跟蹤的一個狀態(tài)
我使用
git add file1.txt
他現(xiàn)在就是暫存區(qū)的了,再去放到本地倉庫,他放本地倉庫他只會放暫存區(qū)域的,我這里再創(chuàng)建一個文件
可以看到新文件沒有放到暫存區(qū)域,所以等會提交并不會
git commit -m "第一次提交"
?如果不加-m會進(jìn)入vim的交互模式寫入介紹
可以到第一個文件已經(jīng)不存在了,因為他只會提交在暫存區(qū)中的文件
還能通過通配符去匹配內(nèi)容
我這里創(chuàng)建了幾個文件在這個目錄里,都是未跟蹤狀態(tài)?
git add *t
或者使用
git add .
將這個目錄下所有的對象放到暫存區(qū)
?
這次使用
git commit
進(jìn)行提交,會進(jìn)入到vim的編輯模式
把介紹寫在最上面
可以看到提交過后沒有再提交的內(nèi)容了?
使用
git log
查看提交的歷史記錄
還可以使用?
git log --oneline
查看簡潔的更新內(nèi)容
reset 版本回退
當(dāng)需要回退版本的時候? 就 使用 git reset 進(jìn)行版本的回退,可以回退到某次的提交那次
reset 有三種用法 也是就是在后面加上三種參數(shù)
git? reset --soft?? # 也就是保留工作區(qū)和暫存區(qū)的內(nèi)容
get reset --hard? # 也就是丟棄工作區(qū)和暫存區(qū)的內(nèi)容
get reset --mixed # 介于上面兩者之間,他會保存工作區(qū)的東西但是不會保存暫存區(qū)的東西
mixed也是reset的默認(rèn)參數(shù)
soft
這里我直接創(chuàng)建幾個文件
然后將這個目錄復(fù)制出來三個
一個目錄演示一個操作
先進(jìn)入到soft中演示一下soft的效果
可以看到我當(dāng)前沒有進(jìn)行恢復(fù),所以他里面沒有要更新的東西,我把他恢復(fù)成第二次的記錄,不出意外的話再去查看,他應(yīng)該顯示有個3.txt沒有暫存,因為當(dāng)時做第二個快照的時候沒有第三個,他也不會去清除第三個,所以他肯定有一個3.txt的沒有記錄?
?
使用他前面的數(shù)值進(jìn)行恢復(fù)一下
git reset --soft 93919bd
?
這樣就恢復(fù)成功了,可以看到他保留了暫存區(qū)
?hard
進(jìn)入git-hard/目錄
可以直接使用HEAD^恢復(fù)到上一次快照
git reset --hard HEAD^
可以看到工作目錄和暫存區(qū)都沒有東西了
mixed
最后再去看一下mixed參數(shù)
切換到mixed工作目錄之后,直接執(zhí)行
git reset HEAD^
然后查看一下提交歷史
可以看到他并沒有保存暫存區(qū)
操作回溯
在實際操作中我們一般都是使用的,soft和mixed??? , hard很少使用,他可能會造成誤刪除的效果,但是誤刪除了問題也不大,因為所有操作都是可以進(jìn)行回溯的
我們再回到hard目錄中
使用
git reflog
查看一下操作的歷史記錄
?
git reset --hard 6892b0f
就直接恢復(fù)到指定的步驟了????????
diff查看差異
git diff 用于查看差異
可以查看工作目錄差異,暫存差異,分支差異等
?
我準(zhǔn)備了3個文件,分別是1,2,3.txt?? 每創(chuàng)建了一個文件夾都進(jìn)行了一次備份
我直接去更改一下3.txt文件內(nèi)容
然后使用
git diff
可以看到他的一個改動信息
默認(rèn)的是工作區(qū)和暫存區(qū)進(jìn)行一個比較
可以使用git add .暫存區(qū)同步一下
查看工作區(qū)和版本庫之間的差異?
git diff HEAD
查看暫存區(qū)和版本庫之間的差異?
git diff --cached
?還可以進(jìn)行版本之間的比較
只用前面的數(shù)值比較即可?
git diff 3854b95 07f5c66
比較上一次提交的版本和當(dāng)前的提交版本之間的變化
git diff HEAD~ HEAD
?git diff HEAD^ HEAD也是一樣的
git diff HEAD~2 HEAD
?就表示之前的兩個版本
git diff 3.txt
也可以針對某個文件查看差異內(nèi)容
git diff 查看分支差異的話直接加上分支的名稱就可以了
從版本庫中刪除文件
有兩種辦法一種直接在工作目錄中刪除再同步? 一種直接在版本庫刪除
但是暫存區(qū)中的3.txt還沒被刪除掉
再去更新一下暫存區(qū)
發(fā)現(xiàn)3.txt沒了,這種辦法十分的低效
可以直接使用git rm命令去刪除
他會把本地工作區(qū)和暫存區(qū)的都刪除掉
?如果不想刪除本地的話可以在后面加上--cached
git rm --cached 文件名
?
忽略文件
忽略文件就是不應(yīng)該加入到版本庫中的文件
只要在.gitignore中列出要忽略的清單,他就不會去提交到倉庫中
現(xiàn)在我創(chuàng)建了兩個log文件
我現(xiàn)在不想把access.log提交到倉庫中,我可以這樣做
echo access.log > .gitignore
再去提交一下
發(fā)現(xiàn)access.log成功被隱藏
我們也可以使用通配符進(jìn)行配置
我直接編輯.gitignore這個文件
意思是所有l(wèi)og后綴的文件都不上傳
現(xiàn)在一切以.log結(jié)尾的文件都不上傳了
因為剛剛已經(jīng)上傳過了,雖然還有他,但是我現(xiàn)在對other.loh插入一些數(shù)據(jù)看看?
可以看到他還是會進(jìn)行記錄的,因為他有個前提就是必須是先在.gitignore里寫要忽略的文件
如果我已經(jīng)提交上去了再去進(jìn)行忽略就是無效的
這時通過git rm命令刪除一下就行
?
git rm --cached other.log
此外還可以對整個目錄進(jìn)行忽略
這個就是對整個temp進(jìn)行忽略
他是支持一些簡單的Linux中正則表達(dá)式的
這就是一個簡單的案例
管理遠(yuǎn)程倉庫
創(chuàng)建好github賬戶之后創(chuàng)建一個新的倉庫
?
創(chuàng)建好倉庫等會在下一步,想克隆遠(yuǎn)程倉庫進(jìn)行工作必須要先進(jìn)行ssh密鑰的認(rèn)證?
windows上生成ssh密鑰?
ssh-keygen -t rsa
一直回車
再去c盤下找到你的用戶目錄里?
有個.ssh的目錄里面id_rsa.pub 內(nèi)容就是我們需要的密鑰
里面這串就是密鑰
?Linux下獲取密鑰
?ssh-keygen -t rsa
一直回車
這個就是密鑰
將密鑰放入github
然后回到倉庫中
點擊ssh
然后回到我們設(shè)備上
克隆到本地
git clone git@github.com:KALItarro/git.git
不要寫我的地址,后面要寫你的倉庫地址
我這里創(chuàng)建了一個文件,加到了緩存區(qū),又進(jìn)行了提交,最后推送到github上
現(xiàn)在我到github上看一下
可以成功看到內(nèi)容了推送成功
關(guān)聯(lián)本地倉庫
上一節(jié)展示了將倉庫克隆下來再進(jìn)行同步
這次要展示的是將本地已有的倉庫推送到公網(wǎng)倉庫上
再去創(chuàng)建一個github倉庫
然后我在本地創(chuàng)建了一個倉庫
我再把他進(jìn)行暫存,再提交一下本地就可以進(jìn)行下一步了
復(fù)制一下倉庫地址
git remote add origin git@github.com:KALItarro/git1.git
git branch -M main
git push -u origin main
這就成功的傳上來了?? push 是上傳?? pull是拉取
上傳是把本地的數(shù)據(jù)上傳上去,也就是讓倉庫和本地的進(jìn)行同步
拉取就是讓本地的倉庫和github倉庫進(jìn)行同步
我去github里修改一下東西
現(xiàn)在我創(chuàng)建的100個文件都是空文件,我現(xiàn)在在github的在線倉庫中的66文件中寫入一下東西
?
再到本地進(jìn)行拉取
?可以看到文件內(nèi)容被拉取下來了
他拉取下來的內(nèi)容會被合并,當(dāng)本地也有同樣的文件可能會導(dǎo)致合并失敗
還可以用fetch他不會去進(jìn)行合并
git分支的管理
git的倉庫默認(rèn)是main
使用命令
git branch
可以看到目前就一個main分支
我現(xiàn)在創(chuàng)建3個文件,每創(chuàng)建一個提交一次
我這里使用的GitKraken可以看到每次提交的一個過程
創(chuàng)建分支
現(xiàn)在我創(chuàng)建一個名為dev的分支
git branch dev
現(xiàn)在就可以看到dev分支了,再去進(jìn)入分支
進(jìn)入分支
git checkout dev
使用checkout也是可以進(jìn)入分支的,但是checkout他是可以恢復(fù)文件,有些情況下當(dāng)文件名和分支名稱重復(fù)了之后,再去使用checkout恢復(fù),他只會先去切換分支
官方因為這個操作,又出了個switch他和checkout都是可以進(jìn)行切換分支,但是switch是專門用來切換分支的
git switch main
我再切換回dev
git switch dev
?我再到dev分支下創(chuàng)建一些文件,并提交
?再切換回main分支
git switch main
?
可以看到dev里的和main的不同步所以他們互不干擾
合并分支
我現(xiàn)在在main里 想把dev的內(nèi)容合并到main里
?
git merge dev
如果想把main的合并進(jìn)dev里的話,需要先切換到dev里然后執(zhí)行 git merge main
可以看到現(xiàn)在dev合并過來了
git log --graph --oneline --decorate --all
可以看到合并的情況
刪除分支
當(dāng)我合并完分支之后?
發(fā)現(xiàn)dev分支依然存在
分支必須要進(jìn)行手動刪除
git branch -d dev
-d是刪除已合并的分支,無法刪除未合并的
-D是強制刪除,都可以刪除
解決合并分支沖突
我先在main分支的main內(nèi)容為1
我切換到feach分支中去修改main1中的內(nèi)容并且去提交
git switch feach
再去提交,再換回main分支也去修改main1的文件內(nèi)容
也是去提交,再進(jìn)行合并,由于都是在一個文件同樣的位置,所以合并就報錯
git merge feach
可以看到已經(jīng)報錯了
git diff
可以看到具體的內(nèi)容
main1中成這樣的,我們再這里進(jìn)行合適的調(diào)整之后,再去提交就自動進(jìn)行合并了
合并成功了
如果想終止合并的話可以使用
git merge --abort