Git三部曲html
git add * | git add . git commit -m "註釋" git push origin name(通常就是git push origin master)
git
在使用Git過程當中最經常使用的就是這三個命令,其具體什麼功能下面會詳細介紹。github
GitHub是什麼?app
GitHub是一個面向開源及私有軟件項目的託管平臺,由於只支持Git做爲惟一的版本庫格式進行託管,故名GitHub。ssh
通俗的講,能夠說是一個開源的雲盤,放在互聯網上的SVN。分佈式
GitHub如何使用?加密
建立帳號這種說明就無需多說,你們都是搞互聯網的,別說不會註冊帳號?spa
將本身電腦裏的項目上傳至本身的GitHub社區首先須要下載Git,就像網盤同樣,須要一個客戶端。命令行
在Git下載裏下載本身電腦對應版本的Git。如需安裝教程請點這裏。版本控制
一、配置(本地倉庫)用戶名和郵箱
由於Git是分佈式版本控制系統,因此須要填寫用戶名和郵箱做爲一個標識。
注:git config --global 參數,有了這個參數,表示你這臺機器上全部的Git倉庫都會使用這個配置,固然你也能夠對某個倉庫指定的不一樣的用戶名和郵箱。
配置(全局)用戶名: git config --global user.name "your name"
配置(全局)郵箱: git config --global user.email "your email"
二、配置SHH Key
因爲你的本地Git倉庫和GitHub倉庫之間的傳輸是經過SSH加密的,因此須要配置一下。若是沒有配置SHH,你的本地項目就不能提交到你的GitHub的遠程倉庫中進行管理。
第一步:建立SSH Key。在用戶主目錄下,看看有沒有.ssh目錄,若是有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個文件,若是有的話,直接跳過以下命令,若是沒有的話,打開命令行,輸入以下命令:
ssh-keygen -t rsa –C 「你的郵箱地址」,因爲我本地以前運行過一次,因此本地有,以下所示:
id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,能夠放心地告訴任何人。
如今你已經生成了一個SHH Key,來驗證一下是否配置成功,在Git Bash裏輸入:
ssh -T git@github.com 出現以下提示說明配置成功,你能夠將本地項目提交到遠程倉庫了。
三、建立版本庫
版本庫又名倉庫,英文名Repository,你能夠簡單的理解一個目錄,這個目錄裏面的全部文件均可以被Git管理起來,每一個文件的修改,刪除,Git都能跟蹤,以便任什麼時候刻均可以追蹤歷史,或者在未來某個時刻還能夠將文件「還原」。
首先建立一個遠程倉庫,由於咱們使用GitHub的最終目的就是使用遠程倉庫來管理咱們的本地倉庫(項目)。
遠程倉庫的建立很是簡單,只須要在你的GitHub首頁點擊New Repository按鈕便可。
接下來建立你的本地倉庫,建立本地倉庫有兩種方法:一種是「無中生有」,另外一種是「同化」。
無中生有
當你經過桌面快捷方式或者任務欄菜單打開Git Bash時,它默認會在你的用戶目錄的根目錄,你能夠經過pwd查看當前目錄。
此時咱們來建立一個名爲gitTest的本地倉庫。
這時你的用戶目錄的根目錄會多出一個gitTest文件夾。進入剛剛建立的文件夾。
注:在Git Bash中輸入命令時按下tab鍵會進行自動補齊,如果有類似命令或文件名,會進行提示。
隨後將這個文件夾變成本地倉庫。
此時gitTest文件夾就變成了一個版本庫,內部會有一個隱藏文件夾.git。這個文件夾是用來管理版本庫的,切不可隨意更改!
同化
經過Git Bash輸入命令或經過鼠標右鍵Git Bash Here進入一個已存在的文件夾,使用git init使其變成一個版本庫。
四、管理本地倉庫
添加&提交(add&commit)
如今咱們的gitTest內什麼都沒有,咱們先來建立一個文本文件(Git Bash不能建立文件)並在其內寫入內容「This is a readme.txt」,而後將它提交到緩衝區。
什麼提示都沒有,說明命令執行成功了。
接下來使用git commit -m "註釋"將其提交到倉庫。
咱們已經將readme.txt提交了,接下來查看還有沒有文件沒有被提交的。
這裏提示沒有未提交的文件,咱們將readme.txt內容進行更改後再執行git status看看有什麼結果。
這裏提示readme.txt被更改且未被提交。咱們來看看哪裏被更改了。
這裏看到,readme.txt文件新加了一行內容"My name is readme.txt"
注:首先要明確下,全部的版本控制系統,只能跟蹤文本文件的改動,好比txt文件,網頁,全部程序的代碼等,Git也不列外,版本控制系統能夠告訴你每次的改動,可是圖片,視頻這些二進制文件,雖能也能由版本控制系統管理,但無法跟蹤文件的變化,只能把二進制文件每次改動串起來,也就是知道圖片從1kb變成2kb,可是到底改了啥,版本控制也不知道。
接下來咱們將更改後的文件進行提交,步驟一樣是先add後commit。
注:add命令能夠add單獨文件或者git add * 添加全部文件。commit必須有註釋,否則會報錯。
工做區和暫存區
工做區:就是你在電腦上看到的目錄,好比目錄下gitTest裏的文件(.git隱藏目錄版本庫除外)。或者之後須要再新建的目錄文件等等都屬於工做區範疇。
版本庫(Repository):工做區有一個隱藏目錄.git,這個不屬於工做區,這是版本庫。其中版本庫裏面存了不少東西,其中最重要的就是stage(暫存區),還有Git爲咱們自動建立了第一個分支master,以及指向master的一個指針HEAD。
咱們前面說過使用Git提交文件到版本庫有兩步:
第一步:是使用 git add 把文件添加進去,實際上就是把文件添加到暫存區。
第二步:使用git commit提交更改,實際上就是把暫存區的全部內容提交到當前分支上。
分支(Fork)
分支能夠理解爲版本,不一樣的分支對應不一樣的版本。把Git看作樹的話,分支就是不一樣的樹枝,各個分支相互獨立。
在遠程倉庫GitHub上,當你看到別人好的代碼想要拿過來研究的時候,只須要點擊Fork按鈕,你就會得到一份如出一轍的克隆代碼。
而此時你對你Fork來的代碼作任何修改都不會影響到「母體」。
注:這裏能夠看到個人幾個項目前面的圖標不一樣,前兩個是從個人本地倉庫提交過來的,其餘的是我Fork別人的項目。
注:Fork別人的項目過來加入本身東西當然方便,可是看成者進行更新時,你的代碼版本依然停留在Fork時的版本,不能享受到最新的功能,爲解決這個問題後面將介紹分支的合併與衝突。
在本地倉庫也是同樣,項目剛剛建立時,默認只有一個分支master,你能夠建立多個分支,對項目進行不一樣版本的管理,各分支的更改互不影響。
接下來咱們先查看本地倉庫的分支,而後新建一個dev分支並切換過去。
git checkout -b name 建立並切換分支,至關於如下兩條命令
git branch name 建立一個分支
git checkout name 切換到一個分支
git branch 查看全部分支,當前分支前面會有星號而且標綠色
版本回退
我對readme.txt文件作了幾回更改,如今來查看一下歷史記錄。在此以前先查看readme.txt的文件內容。
git log命令顯示從最近到最遠的顯示日誌,若是嫌上面顯示的信息太多的話,咱們能夠這樣:
如今我想使用版本回退操做,我想把當前的版本回退到上一個版本,可使用git reset --hard HEAD~N便可,未回退以前的readme.txt內容以下:
如今我向後回退一個版本,即「刪除」內容爲「33333」的版本並查看文件內容。
如今我想把3333版本恢復回來,該如何作呢?Git既然叫作版本控制器,並且每步操做都對應一個版本號,那麼只要找到333的版本號就能夠了。
如今找到了操做3333的版本號,根據版本號就能夠將其恢復回來。
撤銷修改
我如今在readme.txt文件內加入一行內容。
我在add文件以前先cat查看了一下,發現有一行錯誤代碼,我須要把代碼恢復成沒有寫這行錯誤代碼以前的狀態。有兩種方法:
第一:若是我知道要刪掉哪些內容的話,直接手動更改那些須要更改的文件,而後add添加到暫存區,最後commit掉。
第二:我能夠按之前的方法直接恢復到上一個版本。使用 git reset --hard HEAD~1。
可是如今我不想使用上面的兩種方法,我想直接想使用撤銷命令該如何操做呢?首先在作撤銷以前,咱們能夠先用 git status 查看下當前的狀態。
能夠發現,Git會告訴你,git checkout -- file 能夠丟棄工做區的修改。
能夠看到錯誤代碼被刪掉了。
刪除文件
首先咱們先在咱們的工做區新建一個a.txt文件,而後將其提交到版本庫中。
如今我想要把a.txt文件刪除掉,有兩種方法:
第一種:直接在工做區將文件刪除
第二種:使用 rm a.txt 命令能夠將文件刪除
可是這個命令只是刪除了工做區的文件,以前已經將文件提交到版本庫了,版本庫內的文件怎麼刪除呢?看圖片演示~
那麼有時候咱們發現要刪除的文件搞錯了,怎麼把文件找回來呢?咱們先把readme.txt刪掉。
這裏咱們看到提示,可使用git checkout -- file進行文件恢復,咱們來演示一下。
那若是是rm以後有進行add操做,這樣還能恢復嗎?
這裏咱們看到提示,可使用git reset HEAD file進行恢復,咱們來試一下。
能夠看到,雖然執行了這行命令,也沒有報錯,但爲何文件沒有被恢復呢?
還記得前面講過的工做區和暫存區嗎?rm操做是將工做區內的文件刪除,add是將工做區內的操做提交到暫存區。
若是僅僅是rm可是並無add,那麼使用git checkout -- file就能夠將工做區內的文件恢復。
若是已經add了,將操做提交到了暫存區,git reset HEAD file命令能夠將暫存區的操做回退,而後再使用git checkout -- file命令就能夠恢復工做區的文件。
能夠理解爲git checkout -- file是用來抵消rm的,git reset HEAD file是用來抵消add的。
注:git reset HEAD file對應撤銷對暫存區內file的修改,git checkout -- file對應撤銷對工做區內file的修改。修改不止於刪除文件,還能夠撤銷對文件內容的修改。
推送至遠程倉庫
以前的全部操做都是在本地進行操做的,也就是本地倉庫。以前說過,咱們的最終目的就是經過遠程倉庫來管理咱們的項目,而且在團隊開發過程當中,你只在本身的電腦上進行更改,其餘人也看不到。因此將咱們的本地倉庫推送到遠程倉庫上,團隊內全部人均可以隨時Fork,隨時將本身的工做進度推送上去。
推送至遠程倉庫有兩種方法,一種是使用HTTPS進行推送,另外一種是使用SSH進行推送。那具體怎麼操做把本地倉庫推送到遠程上呢?
HTTPS方法
首先咱們先在GitHub上新建一個遠程倉庫(前面講過怎麼作),名字與本地倉庫相同。
新建一個遠程倉庫以後的界面如上圖所示,將裏面的http地址拷貝備用。
能夠看到我連續輸入了兩行命令。
第一行的意思是將本地倉庫與遠程倉庫以HTTPS方式進行關聯,否則Git不知道你要把本地倉庫推送到哪一個遠程倉庫去。
第二行的意思是將本地倉庫推送到遠程倉庫。git push的用法不僅有這一句命令,詳情可參考git push的常見用法。
隨後咱們查看遠程倉庫的內容,已經和本地倉庫內容一致了!
使用HTTPS方式與遠程倉庫進行關聯時,有一個不方便的地方就是每次push的時候,都須要輸入github的帳號和密碼。
爲解決這個問題,咱們可使用SSH方式與遠程倉庫進行關聯。
SSH方法
首先先查看當前遠程關聯信息,使用git remote -v能夠查看。
能夠看到當前的項目是以HTTPS方法與遠程倉庫進行關聯的。
還記得前面講過的配置SHH Key嗎?沒有SSH Key是沒有辦法進行SHH關聯的。
使用SSH方法與遠程倉庫進行關聯,要麼在新建關聯時就使用SSH地址,或者後期也能夠從HTTPS轉換成SSH。這裏演示如何從HTTPS轉成SSH。
首先在一個已有項目內拷貝SSH地址。
而後刪除現有項目的遠程鏈接,命令是:git remote remove origin。而後經過SHH地址與遠程倉庫進行關聯,命令是:git remote add origin 複製的ssh地址。
克隆遠程倉庫至本地
當你在GitHub上發現一個很酷的項目,想要down到本身本地上研究的時候應該怎麼作呢?
剛剛咱們在建立遠程倉庫的時候讓你們拷貝備用的http地址,這個地址是每一個在GitHub上的項目都會有的,咱們就是經過這個地址來克隆遠程倉庫的。
接下來我在GitHub上隨便找一個項目,並記錄他的http地址而後將它克隆到本地。
這樣本地就有了一份項目,在團隊項目開發時,如果有同事將他的代碼push到遠程,你就須要更新你的本地代碼,這個時候就不須要再clone了,只須要git pull就能夠了,這裏就不作演示了。
分支的合併與衝突
前面已經介紹了分支是什麼,而且已經建立了一個dev分支。我說過度支之間是獨立的,分支內的更改是互不影響的,每一個本地倉庫在建立時都有一個默認分支master,這個是主分支,在團隊開發時通常不在主分支上開發,通常是在子分支開發完成後再向主分支合併,而後將主分支推送到遠程倉庫裏。到目前爲止咱們只向GitHub推送了本地的master分支,因此遠程倉庫裏也只有一個master分支。如今咱們在本地切換到dev分支並將其推送到GitHub上。
因爲遠程倉庫沒有dev分支,因此在第一次推送本地dev分支的時候要順帶着新建一個遠程的dev分支。如今能夠看到遠程倉庫裏有兩個分支了。
如今回到本地倉庫,一塊兒來看看分支的合併是怎麼回事。
首先咱們先分別看看兩個分支裏readme.txt的內容。
兩個分支的內容居然不同,這是爲何呢?由於個人dev分支是在111222333內容添加之間就建立的,因此這些內容dev分支上並無,這正是說明分支之間的更改是互不影響的。以前也說過,分支能夠理解爲版本,那麼也就是說master的版本比dev的版本更新。那麼咱們嘗試把master合併到dev上看看有什麼效果。
合併說完了,衝突又是什麼意思呢?如今兩個分支的內容徹底同樣了,咱們分別在兩個分支內向readme.txt內加入不一樣的內容,如:master內寫入mastermaster,dev內寫入devdevdev,而後再將dev合併到master上。
怎麼解決衝突呢?很簡單,既然看到哪裏不同了,只須要把不一樣的地方改爲相同的就能夠了。
這種狀況通常出如今團隊開發過程當中兩我的同時修改了一處地方且修改內容不一樣,這時候只要團隊協調好用誰的代碼就能夠了。
通常來講咱們不推薦直接在主分支master上工做,而是使用子分支進行開發,當認爲項目已經開發完成能夠上線時,再將子分支合併到主分支上。
當項目出現bug時怎麼用分支管理來解決呢?你固然會說,直接新建一個bug分支,改好再合併到主分支就好了。可是若是你手頭的工做沒有完成,不能切換分支呢?好比我在開發中接到一個bug的時候,咱們能夠建立一個bug分支來修復它,可是,當前的dev分支上的工做尚未提交。並非我不想提交,而是工做進行到一半時候,咱們還沒法提交,好比我這個dev分支要2天完成,可是我bug須要5個小時內完成。怎麼辦呢?還好,Git還提供了一個stash功能,能夠把當前工做現場 」隱藏起來」,等之後恢復現場後繼續工做。
隨後咱們就能夠建立bug分支進行修復了,這裏演示一下建立和刪除分支(修復完bug記得合併哦!)。
至此bug已經修復完了,讓咱們回到咱們的工做上,把dev找回來。這裏有兩種方法能夠恢復dev分支。
一、git stash apply恢復,恢復後,stash內容並不刪除,你須要使用命令git stash drop來刪除。
二、另外一種方式是使用git stash pop,恢復的同時把stash內容也刪除了。
什麼意思呢?就是說以前的隱藏工做至關於備份了一份你當前的工做在別的地方,你恢復的時候,使用git stash apply是從備份處將工做複製一份回來,git stash pop是從備份處剪切回來。
團隊開發
在團隊開發模式下,你們都是在子分支下進行開發,而後向遠程倉庫的主分支進行推送,當有同事比你早推送時,遠程倉庫的版本就比你的更新,你再進行推送時會提示錯誤,這時只須要你將遠程倉庫pull到本地和你的本地倉庫進行合併,合併成功後你再push就好了;若是合併出現衝突,那就是你和同事同時修改了同一處而且內容不一致,這時候就按照前面講過的解決衝突的方法解決完衝突提交到本地倉庫後再push就好了。
Git基本經常使用命令
mkdir directory 新建目錄
pwd 顯示當前目錄路徑
git init 把當前目錄變成版本庫
git add file 把文件添加到暫存區
git add * | git add . 把當前目錄下所有文件添加到暫存區
git commit -m "註釋" 提交文件到版本庫
git status 查看倉庫狀態
git diff file 查看文件修改了哪些內容
git log 查看日誌(歷史記錄)
git reset --hard HEAD~N 回退N個版本
cat file 查看文件內容
git reflog 查看歷史記錄的版本號
git checkout -- file 撤銷文件在工做區的操做
git checkout name 切換分支
git checkout -b name 建立並切換到分支上
git branch 查看全部分支(當前分支會標星號且爲綠色)
git branch name 建立分支
git branch -d name 刪除分支
git merge name 在當前分支上合併目標分支
git rm file 刪除文件
git remote add origin https://xxxx 關聯一個遠程倉庫
git remote 查看遠程庫信息
git remote -v 查看遠程庫詳細信息
git remote remove name 移除遠程鏈接
git push -u origin master 把當前master分支推送到遠程庫上(第一次使用-u,以後不須要)
git clone https://xxxx 克隆遠程庫
git stash 隱藏當前工做
git stash list 查看隱藏信息
git stash apply 恢復隱藏工做,可是內容不刪除
git stash drop 刪除內容
git stash pop 恢復工做同時刪除內容