目錄
1.理解分布式版本控制系統
2.遠程倉庫
3.新建遠程倉庫
4.克隆遠程倉庫
5.向遠程倉庫推送?
6.拉取遠程倉庫
7.配置Git
7.1.忽略特殊文件
7.2.給命令配置別名
8.標簽管理
8.1.理解標簽
8.2.創建標簽
8.3.操作標簽 ?
1.理解分布式版本控制系統
Git是目前世界上最先進的分布式版本控制系統(沒有之一)。那什么是分布式版本控制系統?我們看看Git與SVN的主要區別就明白了
- SVN是集中式版本控制系統,版本庫是集中放在中央服務器的,而干活的時候,用的都是自己的電腦,所以首先要從中央服務器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服務器。集中式版本控制系統是必須聯網才能工作,如果在局域網還可以,帶寬夠大,速度夠快,如果在互聯網下,如果網速慢的話,就納悶了。
- Git是分布式版本控制系統,那么它就沒有中央服務器的,每個人的電腦就是一個完整的版本庫,這樣,工作的時候就不需要聯網了,因為版本都是在自己的電腦上。既然每個人的電腦都有一個完整的版本庫,那多個人如何協作呢?比如說自己在電腦上改了文件A,其他人也在電腦上改了文件A,這時,你們兩之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。
分布式相比于集中式的最大區別在于開發者可以提交到本地,每個開發者通過克隆(git clone),在本地機器上拷貝一個完整的Git倉庫
我們?前所說的所有內容(?作區,暫存區,版本庫等等),都是在本地!也就是在你的筆記本或者 計算機上。?我們的Git其實是分布式版本控制系統!什么意思呢? 可以簡單理解為,我們每個?的電腦上都是?個完整的版本庫,這樣你?作的時候,就不需要聯? 了,因為版本庫就在你??的電腦上。
既然每個?電腦上都有?個完整的版本庫,那多個?如何協作 呢???說你在??電腦上改了?件A,你的同事也在他的電腦上改了?件A,這時,你們倆之間只需 把各?的修改推送給對?,就可以互相看到對?的修改了。
分布式版本控制系統的安全性要?很多,因為每個?電腦?都有完整的版本庫,某?個?的電腦壞掉 了不要緊,隨便從其他?那?復制?個就可以了。
在實際使?分布式版本控制系統的時候,其實很少在兩?之間的電腦上推送版本庫的修改,因為可能 你們倆不在?個局域?內,兩臺電腦互相訪問不了。也可能今天你的同事病了,他的電腦壓根沒有開機。
因此,分布式版本控制系統通常也有?臺充當“中央服務器”的電腦,但這個服務器的作?僅僅 是?來?便“交換”?家的修改,沒有它?家也?樣?活,只是交換修改不?便?已。
有了這個“中央服務器”的電腦,這樣就不怕本地出現什么故障了(?如運?差,硬盤壞了,上?的所有東西全部 丟失,包括git的所有內容)
2.遠程倉庫
Git 是分布式版本控制系統,同?個Git倉庫,可以分布到不同的機器上。怎么分布呢?
最早,肯定只有?臺機器有?個原始版本庫,此后,別的機器可以“克隆”這個原始版本庫,?且每臺機器的版本庫其實都是?樣的,并沒有主次之分。
你肯定會想,?少需要兩臺機器才能玩遠程庫不是?但是我只有?臺電腦,怎么玩?
其實?臺電腦上也是可以克隆多個版本庫的,只要不在同?個?錄下。不過,現實?活中是不會有? 這么傻的在?臺電腦上搞?個遠程庫玩,因為?臺電腦上搞?個遠程庫完全沒有意義,?且硬盤掛了會導致所有庫都掛掉,所以我也不告訴你在?臺電腦上怎么克隆多個倉庫。
實際情況往往是這樣,找?臺電腦充當服務器的??,每天24?時開機,其他每個?都從這個“服務 器”倉庫克隆?份到??的電腦上,并且各?把各?的提交推送到服務器倉庫?,也從服務器倉庫中 拉取別?的提交。 完全可以??搭建?臺運?Git的服務器,不過現階段,為了學Git先搭個服務器絕對是?題?作。
好在這個世界上有個叫GitHub的神奇的?站,從名字就可以看出,這個?站就是提供Git倉庫托管服務 的,所以,只要注冊?個GitHub賬號,就可以免費獲得Git遠程倉庫。 github 是國外的?站,速度?較慢,我們課堂上同統?采?碼云(也就是gitee)來托管代碼。
下來,我們從零開始, 使??下碼云遠程倉庫。
gitee官網:工作臺 - Gitee.com
3.新建遠程倉庫
進去之后我們看左上角,點擊加號,選擇新建倉庫
按照下圖填寫信息?
然后就創建成功了
創建成功后,我們可以對遠程倉庫進??個基本的設置:開源or私有
?我們在右邊往下滑,就能看到
我們選擇開源
從創建好的遠程倉庫中我們便能看到,之前在本地學習過的分?,也存在于遠程倉庫中并被管理起來 了。剛創建的倉庫有且只有?個默認的master分?。
4.克隆遠程倉庫
克隆/下載遠端倉庫到本地,需要使? git clone 命令,后?跟上我們的遠端倉庫的鏈接,遠端倉庫 的鏈接可以從倉庫中找到:選擇“克隆/下載”獲取遠程倉庫鏈接:
SSH協議和HTTPS協議是Git最常使?的兩種數據傳輸協議。SSH協議使?了公鑰加密和公鑰登陸機制,體現了其實?性和安全性,使?此協議需要將我們的公鑰放上服務器,由Git服務器進?管理。使?HTTPS?式時,沒有要求,可以直接克隆下來。
使?HTTPS?式大概就是下面這樣子:
hyb@139-159-150-152:~$ git clone https://gitee.com/hyb91/git_teaching.gitCloning into 'git_teaching'...Username for 'https://gitee.com': hyb91Password for 'https://hyb91@gitee.com':
remote: Enumerating objects: 4, done.remote: Counting objects: 100% (4/4), done.remote: Compressing objects: 100% (4/4), done.remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0Unpacking objects: 100% (4/4), 1.80 KiB | 1.80 MiB/s, done.hyb@139-159-150-152:~$ lsgitcode git_teaching hyb@139-159-150-152:~$ ls git_teaching/README.en.md README.md
- 使?SSH?式:?
我們還是看克隆/下載
但是我們這次選擇SSH里面的?
?
使?SSH?式克隆倉庫,由于我們沒有添加公鑰到遠端庫中,服務器拒絕了我們的clone鏈接。需要 我們設置?下: 第?步:創建SSHKey。
在??主?錄下,看看有沒有.ssh?錄,
如果有,再看看這個?錄下有沒有 id_rsa 和 id_rsa.pub 這兩個?件,如果已經有了,可直接跳到下?步。
如果沒有,需要創建 SSH Key:
# 注意要輸???的郵箱,然后?路回?,使?默認值即可
ssh-keygen -t rsa -C "自己的郵箱"
我們一直按回車?
?順利的話,可以在??主?錄?找到 .ssh ?錄,??有 id_rsa 和 id_rsa.pub 兩個?件,這兩個就是SSH Key的秘鑰對, id_rsa 是私鑰,不能泄露出去, id_rsa.pub 是公鑰,可以放?地告 訴任何?。
我們輸入下面這個
cat ~/.ssh/id_rsa.pub
獲取公鑰,復制下來?
第?步:添加??的公鑰到遠端倉庫。
點擊 ssh 公鑰 選項,進?設置:
隨便取一個公鑰名字,然后把公鑰復制下來
?點擊確認后,需要對你進?認證,輸?你的賬號密碼即可。
?此,我們的準備?作全部做完,歡快的 clone吧。
done, 成功!如果有多個?協作開發,GitHub/Gitee允許添加多個公鑰,只要把每個?的電腦上的 Key都添加到GitHub/Gitee,就可以在每臺電腦上往GitHub/Gitee上提交推送了。
????????當我們從遠程倉庫克隆后,實際上Git會?動把本地的master分?和遠程的master分?對應起來, 并且,遠程倉庫的默認名稱是 origin 。在本地我們可以使? git remote 命令,來查看遠程庫的信息,如:?
或者,?git remote -v 顯?更詳細的信息:
上?顯?了可以抓取和推送的origin的地址。如果沒有推送權限,就看不到push的地址。推送是什么 意思呢,我們繼續往下看。?
5.向遠程倉庫推送?
本地已經clone 成功遠程倉庫后,我們便可以向倉庫中提交內容,例如新增?個?file.txt ?件:
????????提交時要注意,如果我們之前設置過全局的name和e-mail,這兩項配置需要和gitee上配置的?? 名和郵箱?致,否則會出錯。或者從來沒有設置過全局的name和e-mail,那么我們第?次提交時也會報錯。
????????這就需要我們重新配置下了,同樣要注意需要和gitee上配置的??名和郵箱?致。如何配置 已講過,在這?就不再贅述。 到這?我們已經將內容提交?本地倉庫中,如何將本地倉庫的內容推送?遠程倉庫呢,需要使? git push 命令, 該命令?于將本地的分?版本上傳到遠程并合并,命令格式如下:?
- git push < 遠程主機名 > < 本地分?名 >:< 遠程分?名 >
- #如果本地分?名與遠程分?名相同,則可以省略冒號: git push < 遠程主機名 > < 本地分?名 >
此時我們要將本地的master分?推送到origin主機的master分?,則可以:
推送成功!這?由于我們使?的是SSH協議,是不?每?次推送都輸?密碼的,?便了我們的推送操 作。如果你使?的是HTTPS協議,有個?煩地?就是每次推送都必須輸??令。
接下來,看看碼云遠端:
代碼已經被推送?遠端了:
6.拉取遠程倉庫
在gitee上點擊README.md?件并在線修改它:
此時,遠程倉庫是要領先于本地倉庫?個版本,為了使本地倉庫保持最新的版本,我們需要拉取下遠 端代碼,并合并到本地。Git提供了 git pull 命令,該命令?于從遠程獲取代碼并合并本地的版 本。格式如下:
- git pull < 遠程主機名 > < 遠 程分?名 >:< 本地分?名 >
- # 如果遠程分?是與當前分?合并,則冒號后?的部分可以省略。
- git pull < 遠程主機名 > < 遠 程分?名 >
使??下:
?
現在就沒問題了
7.配置Git
7.1.忽略特殊文件
在?常開發中,我們有些?件不想或者不應該提交到遠端,?如保存了數據庫密碼的配置?件,那怎 么讓Git知道呢?
在Git?作區的根?錄下創建?個特殊的.gitignore ?件,然后把要忽略的?件名填進去,Git就會?動忽略這些?件了。
不需要從頭寫 .gitignore ?件,gitee在創建倉庫時就可以為我們?成,不過需要我們主動勾選? 下:
?如果當時沒有選擇這個選擇,在?作區創建?個也是可以的。?論哪種?式,最終都可以得到?個完 整的 .gitignore ?件,例如我們想忽略以 .so 和 .ini 結尾所有?件,.gitignore ?件的內容 如下:
# 省略選擇模本的內容...# My configurations:*.ini*.so
?在 .gitignore ?件中也可以指定某個確定的?件。
最后?步就是把 .gitignore 也提交到遠端,就完成了:
接著我們就來驗證?下.gitignore?件的能?,在?作區新增兩個?件 a.so b.ini :
檢驗.gitignore 的標準就是 git status 命令是不是說 working tree clean 。我們發現Git 并沒有提示在工作區中有文件新增,果然.gitignore生效了!
但有些時候,你就是想添加一個文件到 Git,但由于這個文件被.gitignore 忽略了,根本添加不了,那么可以用-f強制添加:
git add -f [filename]
或者你發現,可能是.gitignore寫得有問題,需要找出來到底哪個規則寫錯了,比如說 a.so 文件是要被添加的,可以用 git check-ignore命令檢查:
Git 會告訴我們,.gitignore 的第2行規則忽略了該文件,于是我們就可以知道應該修訂哪個規則
還有些時候,當我們編寫了規則排除了部分文件時,例如:
# 排除所有.開頭的隱藏文件:
.*
但是我們發現.*這個規則把.gitignore 也排除了。
雖然可以用 git add -f 強制添加進去但有強迫癥的童鞋還是希望不要破壞.gitignore 規則,這個時候,可以添加一條例外規則:
#排除所有.開頭的隱藏文件:
# 不排除.gitignore
!.gitignore
把指定文件排除在.gitignore規則外的寫法就是!+文件名,所以,只需把例外文件添加進去即可
7.2.給命令配置別名
在我們使用 Git期間,有些命令敲的時候著實讓人頭疼(太長了。。),幸運的是,git支持對命令進行簡化!
舉個例子,將 git status簡化為 git st,對應的命令為:
git config --global alias.st status
--global 參數是全局參數,也就是這些命令在這臺電腦的所有Git倉庫下都有用。如果不加,那只針對當前的倉庫起作用。
好了,現在敲 git st 看看效果:
再來配置?個 git last ,讓其顯?最后?次提交信息:
git config --global alias.last 'log -1'
不過,我個?還是不推薦?家現在去使?他,等?家?作了,再去簡化??的?作吧,?前所有的命 令都要?動完成,盡快適應Git。?
8.標簽管理
8.1.理解標簽
標簽 tag ,可以簡單的理解為是對某次 commit 的一個標識,相當于起了一個別名。
例如,在項目發布某個版本的時候,針對最后一次commit 起一個 v1.0 這樣的標簽來標識里程碑的意義。
這有什么用呢?
相較于難以記住的 commit id, tag 很好的解決這個問題,因為 tag 一定要給-個讓人容易記住,且有意義的名字。當我們需要回退到某個重要版本時,直接使用標簽就能很快定位到。
8.2.創建標簽
在Git中打標簽非常簡單,首先,切換到需要打標簽的分支上
然后,敲命令 ?git tag [name] 就可以打?個新標簽:
可以?命令 git tag 查看所有標簽:
默認標簽是打在最新提交的 commit 上的。那如何在指定的commit上打標簽呢?
?法是找到歷史提交的commit? id,然后打上就可以了,?例如下:
注意,標簽不是按時間順序列出,而是按字母排序的。
可以用 git show [tag name]查看標簽信息。?
Git 還提供可以創建帶有說明的標簽,?-a指定標簽名,-m指定說明?字,格式為:
git tag -a [name] -m "XXX" [commit_id]
?另外,打完標簽之后,使? tree .git 命令查看?下你的本地庫有什么變化,肯定能幫助你理解!
?我們發現refs里面多了tags這個目錄
8.3.操作標簽 ?
如果標簽打錯了,也可以刪除:
因為創建的標簽都只存儲在本地,不會?動推送到遠程。所以,打錯的標簽可以在本地安全刪除。
如果要推送某個標簽到遠程,使?命令 git push origin <tagname>
我們回gitee上面看看?
我們點進去看看
?很好!
當然,如果你本地有很多標簽,也可以?次性的全部推送到遠端:
git push origin --tags
這個我們就不演示了
如果標簽已經推送到遠程,要刪除遠程標簽就?煩?點,先從本地刪除:
然后,從遠程刪除。刪除命令也是push,但是格式如下:
注意v1.0是在.git/refs/tags/目錄里的
?我們在gitee上面看也確實是刪除了?