一、Git是什么?
如果你問大部份正在使用 Git 這個工具的人「什麼是 Git」,他們大多可能會回答你「Git 是一種版本控制系統」,專業一點的可能會回答你說「Git 是一種分散式版本的版本控制系統」。「版本控制系統」的英文是「Version Control System」,但這個回答,對沒接觸過的新手來說,有講跟沒講差不多。到底什麼是「版本」?要「控制」什麼東西?什麼又是「分散式」?
不管你是不是工程師,只要你是電腦工作者,你每天的工作可能都是每天新增、編輯、修改許多檔案。舉個例子來說,你可能是一名人資部門主管,你有一個叫做 resume
的目錄,裡面專門用來存放面試者的資料。
二、SVN與Git的最主要的區別?
SVN是集中式版本控制系統,版本庫是集中放在中央服務器的,而乾活的時候,用的都是自己的電腦,所以首先要從中央服務器哪裡得到最新的版本,然後乾活,幹完後,需要把自己做完的活推送到中央服務器。集中式版本控制系統是必須聯網才能工作,如果在局域網還可以,帶寬夠大,速度夠快,如果在互聯網下,如果網速慢的話,就納悶了。
Git是分佈式版本控制系統,那麼它就沒有中央服務器的,每個人的電腦就是一個完整的版本庫,這樣,工作的時候就不需要聯網了,因為版本都是在自己的電腦上。既然每個人的電腦都有一個完整的版本庫,那多個人如何協作呢?比如說自己在電腦上改了文件A,其他人也在電腦上改了文件A,這時,你們兩之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。
二、Git 的缺點
Git 的缺點,大概就是易學難精吧。雖然 Git 的指令有非常多,而且有的指令有點複雜,但還好平常會用到的指令不太多,根據「80/20 法則」,大概 20% 的指令就足以應付平日 80% 的工作。
除了在終端機(或命令提示字元)環境的 Git 指令外,也有許多厲害的圖形介面工具,可以讓使用者不用敲打複雜的指令就可以享用 Git 強大的功能。本書也將會使用終端機指令解述概念並以圖形介面工具(例如 SourceTree)輔助說明 Git 是怎麼運作的。
Git 我知道,我有看過那個 GitHub 什麼的…
這也是很多新手容易有的誤會,以為 Git 就是 GitHub(或是反過來以為 GitHub 就是 Git), 甚至也曾看過在公司徵人的職缺上寫著「會使用 GitHub」這項技能。事實上 Git 是一款版本控制軟體,而 GitHub 是一個商業網站,GitHub 的本體是一個 Git 伺服器,但這個網站上的應用程式讓大家可以透過 Web 介面來操作一些原本需要複雜的 Git 指令才能做到的事。
三、在windows上如何安裝Git?
直接到Git官網下載:https://git-scm.com/
都使用預設值一路安裝完畢即可
安裝完成後,在開始菜單裡面找到 “Git –> Git Bash”,如下:
會彈出一個類似的CMD窗口的東西,就說明Git安裝成功。如下:
安裝完成後,還需要最後一步設定,在命令行輸入如下:
因為Git是分佈式版本控制系統,所以需要填寫用戶名和郵箱作為一個標識。
注意:git config –global 參數,有了這個參數,表示你這台機器上所有的Git倉庫都會使用這個配置,當然你也可以對某個倉庫指定的不同的用戶名和郵箱。
四、如何操作?
- 創建版本庫。
什麼是版本庫?版本庫又名倉庫,英文名repository,你可以簡單的理解一個目錄,這個目錄裡面的所有文件都可以被Git管理起來,每個文件的修改,刪除,Git都能跟踪,以便任何時刻都可以追踪歷史,或者在將來某個時刻還可以將文件”還原”。
所以創建一個版本庫也非常簡單,如下我是C槽 –>新建一個 Tese版本庫。
通過命令 git init 把這個目錄變成git可以管理的倉庫,如下:
這時候你當前 Tese 目錄下會多了一個.git的目錄,這個目錄是Git來跟踪管理版本的,沒事千萬不要手動亂改這個目錄裡面的文件,否則,會把git倉庫給破壞了。如下:
下面先看下demo如下演示:
我在版本庫testgit目錄下新建一個記事本文件 readme.txt 內容如下:11111111
第一步:使用命令 git add readme.txt添加到暫存區裡面去。如下:
如果和上面一樣,沒有任何提示,說明已經添加成功了。
第二步:用命令 git commit告訴Git,把文件提交到倉庫。
現在我們已經提交了一個readme.txt文件了,我們下面可以通過命令git status來查看是否還有文件未提交,如下:
說明沒有任何文件未提交,但是我現在繼續來改下readme.txt內容,比如我在下面添加一行2222222222內容,繼續使用git status來查看下結果,如下:
上面的命令告訴我們 readme.txt文件已被修改,但是未被提交的修改。
把文件添加到版本庫中。
首先要明確下,所有的版本控制系統,只能跟踪文本文件的改動,比如txt文件,網頁,所有程序的代碼等,Git也不列外,版本控制系統可以告訴你每次的改動,但是圖片,視頻這些二進製文件,雖能也能由版本控制系統管理,但沒法跟踪文件的變化,只能把二進製文件每次改動串起來,也就是知道圖片從1kb變成2kb,但是到底改了啥,版本控制也不知道。
接下來我想看下readme.txt文件到底改了什麼內容,如何查看呢?可以使用如下命令:
git diff readme.txt 如下:
如上可以看到,readme.txt文件內容從一行11111111改成 二行 添加了一行22222222內容。
知道了對readme.txt文件做了什麼修改後,我們可以放心的提交到倉庫了,提交修改和提交文件是一樣的2步(第一步是git add 第二步是:git commit)。
如下:
- 版本回退:
如上,我們已經學會了修改文件,現在我繼續對readme.txt文件進行修改,再增加一行內容為33333333333333.繼續執行命令如下:
現在我已經對readme.txt文件做了三次修改了,那麼我現在想查看下歷史記錄,如何查呢?我們現在可以使用命令 git log 演示如下所示:
git log命令顯示從最近到最遠的顯示日誌,我們可以看到最近三次提交,最近的一次是,增加內容為333333.上一次是添加內容222222,第一次默認是 111111.如果嫌上面顯示的信息太多的話,我們可以使用命令 git log –pretty=oneline 如下:
現在我想使用版本回退操作,我想把當前的版本回退到上一個版本,要使用什麼命令呢?可以使用如下2種命令,第一種是:git reset –hard HEAD^ 那麼如果要回退到上上個版本只需把HEAD^ 改成 HEAD^^ 以此類推。那如果要回退到前100個版本的話,使用上面的方法肯定不方便,我們可以使用下面的簡便命令操作:git reset –hard HEAD~100 即可。未回退之前的readme.txt內容如下:
如果想回退到上一個版本的命令如下操作:
git reset –hard HEAD~1
再來查看下 readme.txt內容如下:通過命令cat readme.txt查看
可以看到,內容已經回退到上一個版本了。我們可以繼續使用git log 來查看下歷史記錄信息,如下:
我們看到 增加333333 內容我們沒有看到了,但是現在我想回退到最新的版本,如:有333333的內容要如何恢復呢?我們可以通過版本號回退,使用命令方法如下:
git reset –hard 版本號 ,但是現在的問題假如我已經關掉過一次命令行或者333內容的版本號我並不知道呢?要如何知道增加3333內容的版本號呢?可以通過如下命令即可獲取到版本號:git reflog 演示如下:
通過上面的顯示我們可以知道,增加內容3333的版本號是 04358c9.我們現在可以命令git reset –hard 04358c9來恢復了。演示如下:
可以看到 目前已經是最新的版本了。
- 理解工作區與暫存區的區別?
工作區:就是你在電腦上看到的目錄,比如目錄下testgit裡的文件(.git隱藏目錄版本庫除外)。或者以後需要再新建的目錄文件等等都屬於工作區範疇。
版本庫(Repository):工作區有一個隱藏目錄.git,這個不屬於工作區,這是版本庫。其中版本庫裡面存了很多東西,其中最重要的就是stage(暫存區),還有Git為我們自動創建了第一個分支master,以及指向master的一個指針HEAD。
我們前面說過使用Git提交文件到版本庫有兩步:
第一步:是使用 git add 把文件添加進去,實際上就是把文件添加到暫存區。
第二步:使用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支上。
我們繼續使用demo來演示下:
我們在readme.txt再添加一行內容為4444444,接著在目錄下新建一個文件為test.txt 內容為test,我們先用命令 git status來查看下狀態,如下:
現在我們先使用git add 命令把2個文件都添加到暫存區中,再使用git status來查看下狀態,如下:
接著我們可以使用git commit一次性提交到分支上,如下:
- Git撤銷修改。
在我未提交之前,我發現添加5555555555555內容有誤,所以我得馬上恢復以前的版本,現在我可以有如下幾種方法可以做修改:
第一:如果我知道要刪掉那些內容的話,直接手動更改去掉那些需要的文件,然後add添加到暫存區,最後commit掉。
第二:我可以按以前的方法直接恢復到上一個版本。使用 git reset –hard HEAD^
五、遠程倉庫(Gitlab)
在了解之前,先註冊github賬號,由於你的本地Git倉庫和github倉庫之間的傳輸是通過SSH加密的,所以需要一點設置:
第一步:創建SSH Key。在用戶主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個文件,如果有的話,直接跳過此如下命令,如果沒有的話,打開命令行,輸入如下命令:
ssh-keygen -t rsa –C “youremail@example.com”, 由於我本地此前運行過一次,所以本地有,如下所示:
id_rsa是私鑰,不能洩露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。
第二步:登錄gitlab,打開”偏好設定”中的SSH Keys頁面,然後在右邊”加入 SSH Key”標題中填上任意title,在Key文本框裡黏貼id_rsa.pub文件的內容。
也可以參考這裡:
https://www.codeprj.com/blog/9e2d2e1.html
如何添加遠程庫?
現在的情景是:我們已經在本地創建了一個Git倉庫後,又想在gitlab創建一個Git倉庫,並且希望這兩個倉庫進行遠程同步,這樣github的倉庫可以作為備份,又可以其他人通過該倉庫來協作。
首先,登錄 gitlab 上,然後在右上角找到”新增專案版本庫”創建一個新的倉庫。如下:
新增一個空白專案name填入Test,其他保持默認設置,點擊”建置專案”按鈕,就成功地創建了一個新的Git倉庫:
目前,在GitLab上的這個Test倉庫還是空的,GitHub告訴我們,可以從這個倉庫克隆出新的倉庫,
也可以把一個已有的本地倉庫與之關聯,然後,把本地倉庫的內容推送到GitHub倉庫。
現在,我們根據GitHub的提示,在本地的 Test 倉庫下運行命令:
git remote add origin http://git.chih-hao.synology.me/h63016402/test.git
接下來可以把本地的master內容推送到遠端倉庫
在推送前因為本地的分支是 master 我們創的是main所以要先切過去:
查看有哪些分支:
git fetch --all
在來使用已下指令切過去main:
git checkout -b main origin/main
最後標註要上傳的檔案並上傳:
git add test.txt git commit -m "test" git push -uf origin main
這裡會發現她說某些引用無法推送到Gitlab所以失敗,哪是一位這個Git一開始是本地的所以無法直接合併到main上去,解決方法有2個:
第一個:先把容器從遠端克隆回來再將資料放進去推送
第二個:創建一個分支之後再合併回去
我選擇第二個:
git push origin main:pzi //表示將本地main分支的數據推送到遠程pzi分支上,如果遠程反之不存在則創建
結果如下:
這時候我們可以去看Gitlab會顯示已經提交分支請求,我們在做合併。
選建立合併請求
之後輸入標題跟描述最後再給被指派者審查(因為是個人專案所以只能給自己)
最後在選建立合併請求
建立之後會檢查是否可以合併,可以合併後再選合併就可以了
合併完成後就可以在main分支中查看到檔案
從現在起,只要本地作了提交,就可以通過如下命令:
git push -u origin main
把本地main分支的最新修改推送到gitlab上了,現在你就擁有了真正的分佈式版本庫了。
如果要同步倉庫的指令:
git fetch origin main
如何透過ssh拉取倉庫
可以使用以下指指令:
SSH的話:
git clone git@git.chih-hao.synology.me:test/test1.git
HTTP的話:
git clone http://git.chih-hao.synology.me/test/test1.git
連接可以在專案中找到:
如果碰到SSH認證錯誤可依參考:
解决git使用ssh克隆失败的问题_git ssh克隆失败_前尘忆梦丿的博客-CSDN博客
Git – 代碼同步的兩種方式
git pull
pull操作相當於先做了fetch操作,然後緊接著做了git merge的操作。它會先從 .git/config 中查找本地當前所在分支對應的遠程分支配置,比如:
[branch "master"]
remote = origin
merge = refs/heads/master
一般經常使用3種格式:
第一種,默認操作
git pull
此時會把master分支拉下來並與當前分支進行 merge 操作,可以通過指定 –rebase 選擇rebase合併操作。
第二種,rebase合併
git pull --rebase
第三種,從某個分支pull下來
這個命令會忽略分支的對應跟踪關係,而是從指定的分支pull到當前所在分支上:
git pull origin test_branch
git fetch
fetch操作會把遠程倉庫拉到本地倉庫中來,默認包括所有遠程倉庫中的遠程分支全都拉取到本地。默認這些分支並不會被checkout到工作區,當然通過一些參數可以指定是否要checkout出來。
它常用的操作如下:
fetch整個倉庫
這個命令會更新倉庫中所有分支
git fetch origin
fetch指定遠程分支
單獨更新倉庫中的某一個分支
git fetch origin master
fetch指定分支並checkout到本地分支
比如想要fetch遠程倉庫中的master分支,並checkout到本地分支tmp上,可以使用如下指令:
git fetch origin master:tmp
什麼是分支?
分支的概念跟使用方式可以參考這裡:
https://backlog.com/git-tutorial/tw/stepup/stepup1_1.html
使用.gitignore來忽略檔案
有時候會需要避免一些檔案進入到版本控制當中,比如暫存檔、測試的檔案…,這個時候就可以使用.gitignore來忽略掉他們,將他們排除在版本控制當中。
新增 “.gitignore” 檔案
使用git status
確認目前狀況 :
先前有預先新增一些不同檔案類型的檔案為了進行忽略測試,而.gitignore這個檔案無法被忽略掉,因為其他的團隊成員也會需要對它進行變更。
在 “.gitignore” 中輸入需要忽略的檔案或檔案類型
在.gitignore檔案中輸入index.html,表示對 “index.html”這個檔案進行忽略,所以再次使用git status
來查看狀況會發現index.html被忽略了。
若要略掉同一個檔案類型
的檔案,可以在.gitignore中輸入*.檔案類型
來忽略同一種檔案類型的檔案,底下的範例是在.gitignore中輸入*.html
來忽略掉所有html的檔案類型。
忽略整個資料夾
在專案中新增一個資料夾”css”裡面存放all.css,若要使用.gitignore來忽略掉整個資料夾,可以在.gitignore中新增資料夾名稱/
來忽略掉整個資料,利用git status
可以看到多了一個css/的資料夾未被加入到控管中。
在.gitignore中填入css/
來忽略掉css資料夾。
Sublime merge : 好上手的git工具教學
參考這邊: