hiahiahia我又來做惡了,莫名其妙的第八次實驗還要更新!git
Git是一個免費的開源分佈式版本控制系統,旨在快速高效地處理從小型到大型項目的全部事務。Git易於學習,佔地面積小,具備閃電般快速的性能。而且它超越了Subversion,CVS,Perforce和ClearCase等SCM工具,具備廉價的本地分支,便捷的臨時區域和多個工做流程等功能。github
Git具備分佈式版本控制系統,它保存的是文件的完整快照,而不是差別變化或者文件補丁。每一次提交,Git保存的都是對項目文件的一個完整拷貝,所以開發者能夠徹底恢復到之前的一個提交而不會發生任何區別。這裏容易讓人疑惑的是,Git佔用的空間會不會隨着提交次數的增長而線性增長呢?好比項目大小是10M,提交了10次,佔用的空間是否是100M呢?顯然不是,若是文件沒有變化,它只會保存一個指向上一個版本的指針,這就是說對一個特定版本的文件,Git只會保存一個副本,但能夠由多個指向該文件的指針。vim
在《Pro Git》中,做者提到Git最適合保存文本文件(如各類語言的源代碼,這也是Git設計的初衷),由於Git能夠對文本文件進行很好的壓縮和差別分析。但像二進制文件如視頻、圖片等,Git也能管理,但壓縮比率低而且不能進行差別分析,Git佔用的空間幾乎隨着提交的次數線性增加。windows
常見Git指令清單以下,注意git指令是大小寫敏感的緩存
版本控制系統是指能隨時間的推動記錄一系列文件以便於開發者之後想要回退到某個版本的系統,主要分爲三類:本地版本控制系統、集中版本控制系統和分佈式版本控制系統。服務器
本地版本控制系統是指文件的各個版本以必定的數據格式存儲在本地的磁盤中,這種方式在必定程度上解決了手動複製粘貼的問題,可是沒法解決多人協做的問題。
markdown
集中版本控制系統與本地版本控制系統相似,可是多了一箇中央服務器,各個版本的數據存儲在中央服務器,管理員能夠控制開發人員的權限,開發人員也能夠從中央服務器拉去數據。這解決了LVCS沒有解決的多人協做問題,可是因爲數據集中存儲,一旦服務器宕機或者磁盤損壞,會形成不可估量的損失。ssh
分佈式版本控制系統與前二者均不一樣。首先,在分佈式版本控制系統中,系統保存的不是文件變化的差量,而是文件的快照,即把文件的總體複製下來保存,而不關係具體的變化內容。其次,最重要的是分佈式版本控制系統是分佈式的,開發者從中央服務器拷貝下來代碼時,拷貝的是一個完整的版本庫,包括歷史記錄,提交記錄等,這樣即便某一臺機器宕機也能找到文件的完整備份。編輯器
Git從核心上看是簡單地存儲鍵值對,值爲文件的內容,鍵爲文件內容與文件頭信息的40個字符長度的SHA-1校驗和。Git使用校驗和並非爲了加密,而是爲了保證數據的完整性,這樣即使要回退到一個好久以前的commit狀態,也不會出現一絲差錯。當對文件進行了哪怕一丁點兒的修改,也會計算出徹底不一樣的SHA-1校驗和。分佈式
SHA-1校驗和即上面提到的文件的指針,與C語言指針不一樣,Git指針指向的文件內容發生變化時,指針行業會發生改變,這樣每個版本的文件,Git都有一個惟一的指針指向它。
工做目錄是當前進行工做的區域,文件修改但未提交,處於已修改狀態(modified);
暫存區域是運行git add命令後文件保存的區域,也就是下次提交要保存的文件,文件處於已暫存狀態(staged);
本地倉庫即版本庫,記錄了工程提交的完整狀態和內容,文件處於已經提交狀態(committed)。
使用Git的工做流程基本就是文件在三個工做區域之間的流動。
下圖簡單展現了一個工程中各個對象之間的關係,圖中每個對象對應不一樣SHA-1指針,File1-2爲File1-1的修改。
分支是Git進行版本控制的利器,Git鼓勵工程中頻繁使用分支與合併,由於Git分支很是輕量級,Git本質上只是一棵巨大的文件樹,樹的每個節點就是blob對象,而分支只是樹的一個分叉,即分支只是一個有名字的引用,建立分支就是向文件寫入一個校驗和,速度極快。
Git默認分支爲master,建立分支只須要運行
git branch [branch-name]
[branch-name]爲分支名字。切換分支只須要運行
git checkout [branch-name]
快進(Fast forward):分支合併時,若是順着一個分支走下去能夠到達另外一個分支的話,那麼git在合併兩個分支時只會簡單地把指針右移,這種合併過程被稱爲快進。
當要合併的分支不在一條線時,Git首先會用兩個分支的末端及它們共同的祖先進行一次簡單的三方合併計算並提交。
以下圖將v三、v5和v7合併計算出v8並提交。
[1]軟工第二次上機PPT
*這部分圖片太多了,就不從本地粘過來了,以前直接在CSDN寫的,有水印,就當給本身打廣告了
啓動Git GUI:Git GUI Here
git clone:主面板選擇Clone Existing Repository,設定原路徑,本地目標路徑與克隆模式,單擊Clone按鈕
git init:主面板選擇Create New Repository,設定版本庫位置,單擊Create按鈕
git add:存在未被添加到Staging區的改動時,在主操做面板單擊Rescan按鈕,改動將出如今Unstaged Changes區域內,再次單擊Stage Change按鈕,將改動添加到Staging區
git rm:存在已被添加到Staging區的改動時,選中在緩存區改動列表中一項或多項文件,在菜單欄中選擇Commit→Unstage From Commit,能夠看到剛被添加的改動被退回到Unstaged Changes區域中
git branch與checkout:在菜單欄中選擇Branch選項,打開Branch菜單欄,菜單欄中包括五種行爲
git commit:在將文件添加至Staging區後,在Commit描述窗口輸入描述後,單擊Commit按鈕,按成一次提交(注意要添加Commit Message),在Commit菜單欄有更多操做
git merge:在菜單欄中選擇Merge選項,在打開的Merge菜單欄中選擇Local Merge選項,打開Merge窗口,在窗口中能夠選擇將要合併的當前分支的本地或遠程分支,單擊Merge按鈕完成合並,若兩分支出現衝突,則須要先解決衝突,而後才能進行合併
在Git版本控制系統中,本地版本庫與遠程版本庫的數據交互受權能夠經過HTTPS與SSH兩種方式實現。前者經過輸入我的帳戶名與密碼實現,後者須要在我的帳戶中配置RSA密鑰,將私鑰置於本地,公鑰上傳至遠程版本庫,再者以後遠程版本庫將會經過SSH協議認證用戶身份,再也不須要在每次上傳或下載改動時輸入用戶名與密碼。
git config --global user.name "xxx"
xxx指你本身的用戶名
git config --global user.email "1234567890@xx.com"
1234567890 @xx.com指你本身的郵箱我不是針對在作各位,這郵箱要是能重名…那咱們這麼有緣爲何不作個朋友呢 😃
ssh-keygen -t rsa -C '1234567890@xx.com'
打開下方輸出中對應路徑的 id_rsa 文件,將其中存放的密匙粘貼到對應網頁中的key中,title本身定義就能夠
第一次經過下面步驟鏈接GitHub時須要輸入帳戶名和密碼,輸入錯誤則沒法鏈接,而且沒法在相似界面再次輸入,由於該帳戶名和密碼已經自動被windows備份,此時能夠經過修改以下圖控制面板中的windows憑據信息從新輸入正確的帳戶名和密碼。
1. checkout: git checkout xxx
,xxx
是你所要上傳到的分支的名稱,切換到分支。
2. add:git add xxx
,xxx
是你所要上傳的文件(包括路徑)。經常使用git add .
添加本地修改到倉庫。
3. commit:將暫存區版本提交到本地版本庫(注意不要屢次commit不push哦,會出錯的)
(1)-m添加註釋
git commit -m 「message」
git commit -m ' message1 message2 message3 '
不加 -m參數Git默認調用編輯器通常是vim來讓你輸入這個message
界面就像下圖這樣 花裏胡哨
(2)-a懶漢版打包提交
git commit -a -m 「massage」
-a參數能夠將全部已跟蹤文件中的執行修改或刪除操做的文件都提交到本地倉庫,即便它們沒有通過git add
添加到暫存區。可是新增文件沒有被git管理,是沒有辦法經過-a識別上傳的。
(3)- -amend追加提交
git commit --amend
對於那種馬馬虎虎還有點強迫症的人來講,這是一個很人性化的設計,這樣子你就不會被你的小組同胞,甚至是路過的遊客 ,發現本身差很少的東西由於奇奇怪怪的小毛病重複提交了不少版本~~,簡稱:amend,你的蠢在我(am)這裏終止(end)~~ 😐 。
4. push:上傳到遠程倉庫