內(nèi)容提要
本文分為兩個個部分
1.Git教程
2.Github教程
第一部分
1.什么是GitHub?
GitHub是世界上最大的軟件遠程倉庫煎殷,是一個面向開源和私有軟件項目的托管平臺唉铜,使用Git做分布式版本控制。
簡單的來說涧偷,GitHub就是全是界程序員和組織發(fā)布程序代碼的平臺之一,全世界各地的程序員講自己寫的代碼上傳到這里與大家分享毙死。
當(dāng)你需要完成某個輪子(開發(fā)某個東西)的時候燎潮,可以嘗試先去GitHub借鑒一下別人已經(jīng)開發(fā)過的。
或者你和同伴們打算開發(fā)一個小軟件扼倘,就可以將代碼放到GitHub上來實現(xiàn)合作開發(fā)确封。
使用GitHub,首先要會使用Git。
內(nèi)容為精簡版再菊,詳細內(nèi)容可參考廖雪峰git教程
2.Git極簡入門
1.Git是什么爪喘?
Git是實現(xiàn)分布式版本控制的一個工具,簡單的來說就是實現(xiàn)文件歷史管理的工具纠拔。
下面我舉一個例子秉剑,說明Git的作用。
1.你是公司的一名程序員稠诲,現(xiàn)在你寫了一段程序:
print('Hello')
2.老板看到你的代碼太差了侦鹏,讓你改掉诡曙,于是你改成了:
print("你好")
3.老板看到以后覺得不行,讓你把代碼改回到上一次的狀態(tài)
如果你從1改到2改了一大半內(nèi)容略水,并且還沒有留1的備份价卤,是不是要哭了?
如果你在這個時候使用了Git做版本控制,就不會有這種問題了渊涝。
每一次你修改代碼之后都做用Git一次記錄,Git就會知道你每一次改了什么內(nèi)容慎璧。
老板讓你回到1,你只要輸入 git reset --hard 1跨释,就回到了當(dāng)時的版本炸卑。
所以說,Git就是實現(xiàn)歷史版本管理的工具煤傍。不論你改了多少內(nèi)容,改了多少次嘱蛋,Git都能回到當(dāng)時的版本蚯姆。
同時Git也是合作開發(fā)的工具。
比如現(xiàn)在有100個人的團隊一起開發(fā)某個軟件洒敏,大家肯定不能用復(fù)制粘貼代碼來合作龄恋。
我們可以指定所有人都把代碼上傳到一臺服務(wù)器,然后大家下載服務(wù)器上的代碼來修改凶伙,修改完了再上傳回去郭毕。這時,Git記錄每個人什么時候函荣,改了什么內(nèi)容显押。實現(xiàn)所有人同步,在必要時回到某些版本傻挂。
再比如乘碑,QQ每隔一段時間都要更新版本,忽然某個新版本不穩(wěn)定金拒,騰訊決定撤回到上個版本兽肤,這個時候就要讓代碼回到發(fā)布新版本之前。
2.使用Git
下載Git
去Git官網(wǎng)下載對應(yīng)操作系統(tǒng)的Git绪抛。
windows和mac的安裝過程簡單资铡,這里不做贅述,講一下linux (ubuntu)的幢码,其他linux系統(tǒng)的玩家水平應(yīng)該都很高笤休,不需要看教程~~
在終端輸入
sudo apt-get install git
輸入密碼安裝即可。
設(shè)置Git
windows打開GitBash蛤育,macos和linux用戶打開終端宛官。
首先要設(shè)置自己的身份葫松,比如git提交代碼的時候要讓別人知道什么人提交了代碼,
設(shè)置身份內(nèi)容有兩條底洗,一個是你的郵箱腋么,另一個是你的稱呼 ,以后你提交的代碼都根據(jù)這個來確定是你
提交的的了亥揖。Your Name填你想讓別人知道的名字珊擂,email@example.com換成自己的郵箱。
自此以后你寫的bug就會被人認出來是你寫的了费变。
輸入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
使用Git
從終端(cmd)進入你想要記錄內(nèi)容更改的文件夾里
例如我們進入gittest
文件夾
輸入:
git init
這個文件夾以后的更改就會被記錄了摧扇。(如果是空文件夾會提示Initialized empty Git repository in /home/yep/code/gittest/.git/
,告訴你文件夾為空)
現(xiàn)在我們在文件夾里新建一個文件hello.txt,內(nèi)容是
print("Hello World")
現(xiàn)在我們要把這個文件放入git倉庫挚歧。
和把大象放到冰箱需要3步相比扛稽,把一個文件放到Git倉庫只需要兩步。
第一步:保存后滑负,我們使用git add
命令在张,告訴git我們把文件添加到倉庫緩存區(qū)了,在終端輸入
git add hello.txt
沒有提示說明操作成功矮慕。
第二步:使用git commit
命令帮匾,告訴git我們要把緩存區(qū)的所有文件正式提交到倉庫:
git commit -m "添加了hello.txt"
其中 -m 和后面引號內(nèi)容是本次提交的說明,也就是描述你每次改了什么痴鳄。
嫌麻煩不想輸入-m "xxx"行不行瘟斜?確實有辦法可以這么干,但是強烈不建議你這么干痪寻,因為輸入說明對自己對別人閱讀都很重要螺句。實在不想輸入說明的童鞋請自行Google,我不告訴你這個參數(shù)槽华。
[master (root-commit) ec4652d] 添加了hello.txt
1 file changed, 1 insertion(+)
create mode 100644 hello.txt
git commit命令執(zhí)行成功后會告訴你壹蔓,1 file changed
:1個文件被改動(我們新添加的hello.txt文件);1 insertions
:插入了兩行內(nèi)容(hello.txt有一行內(nèi)容)猫态。
為什么Git添加文件需要add
佣蓉,commit
一共兩步呢?因為commit
可以一次提交很多文件亲雪,所以你可以多次add
不同的文件勇凭,比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
add
把文件放到了緩存區(qū),然后commit
正式提交到倉庫义辕。
實現(xiàn)版本回退
現(xiàn)在修改hello.txt里的內(nèi)容:
print("Hello World")
print("老板是神經(jīng)病")
因為對工作很不滿虾标,下班前添加了第二行,“老板是神經(jīng)病”,然后提交
git add hello.txt
git commit -m "hello.txt里添加了一句話"
提示:
[master 88d885c] 在hello.txt添加了一句話
1 file changed, 2 insertions(+), 1 deletion(-)
像這樣灌砖,你不斷對文件進行修改璧函,然后不斷提交修改到版本庫里傀蚌,就好比玩RPG游戲時,每通過一關(guān)就會自動把游戲狀態(tài)存盤蘸吓,如果某一關(guān)沒過去善炫,你還可以選擇讀取前一關(guān)的狀態(tài)。有些時候库继,在打Boss之前箩艺,你會手動存盤,以便萬一打Boss失敗了宪萄,可以從最近的地方重新開始艺谆。Git也是一樣,每當(dāng)你覺得文件修改到一定程度的時候拜英,就可以“保存一個快照”静汤,這個快照在Git中被稱為commit。一旦你把文件改亂了居凶,或者誤刪了文件撒妈,還可以從最近的一個commit恢復(fù),然后繼續(xù)工作排监,而不是把幾個月的工作成果全部丟失。
現(xiàn)在杰捂,我們回顧一下hello.txt文件一共有幾個版本被提交到Git倉庫里了:
版本1:添加了hello.txt
版本2:在hellotxt添加了幾句話
到了第二天早上你后悔了舆床,想回到昨天下班前代碼的狀態(tài)
當(dāng)然了,在實際工作中嫁佳,我們腦子里怎么可能記得一個幾千行的文件每次都改了什么內(nèi)容挨队,不然要版本控制系統(tǒng)干什么。版本控制系統(tǒng)肯定有某個命令可以告訴我們歷史記錄蒿往,在Git中盛垦,我們用git log命令查看:
輸入git log
命令查看版本情況
輸入:
git log
顯示了過去所有的修改時間、修改人瓤漏、修改內(nèi)容:
commit 88d885c21216cbedacb1692e08d51afa6d4e32a7 (HEAD -> master)
Author: yepdlpc <mattbaisteins@gmail.com>
Date: Wed Dec 19 20:13:22 2018 +0800
在hello.txt添加了一句話
commit ec4652d5d0b8662fc8730d64b42341d1c363a442
Author: yepdlpc <mattbaisteins@gmail.com>
Date: Wed Dec 19 20:11:42 2018 +0800
添加了hello.txt
yepdlpc和郵箱都是我的腾夯。。我們可以看到蔬充,最新的提交在最上面蝶俱,并按時間有近到遠。并且每一次提交修改都生成了一個commit id饥漫,我們可以認為這個id是當(dāng)時的這個版本的版本號榨呆,這個commit id是我們找回當(dāng)時版本的唯一憑據(jù)
。
我們只有兩次提交庸队,只需要回到ec645.......
這個commit id時的版本就行积蜻。
Git中使用HEAD表示當(dāng)前版本闯割,也就是commit 88d885c21216cbedacb1692e08d51afa6d4e32a7
,
HEAD^
表示上一個版本竿拆,HEAD^^
表示上上一個版本宙拉,當(dāng)然往上100個版本寫100個^
比較容易數(shù)不過來,所以寫成HEAD~100
如输。
現(xiàn)在鼓黔,我們要把當(dāng)前版本回退到上一個版本,就可以使用git reset
命令:
git reset --hard HEAD^
--hard
參數(shù)有啥意義不见?這個后面再講澳化,現(xiàn)在你先放心使用。
此時我們可以看到hello.txt的文件內(nèi)容變回了:
print("Hello World")
果然被還原了稳吮。
還可以繼續(xù)回退到上一個版本缎谷,不過且慢,然我們用git log
再看看現(xiàn)在版本庫的狀態(tài):
Author: yepdlpc <mattbaisteins@gmail.com>
Date: Wed Dec 19 20:11:42 2018 +0800
添加了hello.txt
最新的那個版本88d885c21216cbedacb1692e08d51afa6d4e32a7
已經(jīng)看不到了灶似!好比你從21世紀坐時光穿梭機來到了19世紀列林,想再回去已經(jīng)回不去了,腫么辦酪惭?
辦法其實還是有的希痴,只要上面的命令行窗口還沒有被關(guān)掉,你就可以順著往上找啊找啊春感,找到那個commit id是88d885c21216cbedacb1692e08d51afa6d4e32a7
砌创,于是就可以指定回到未來的某個版本:
git reset --hard 88d885
版本號沒必要寫全,前幾位就可以了鲫懒,Git會自動去找嫩实。當(dāng)然也不能只寫前一兩位,因為Git可能會找到多個版本號窥岩,就無法確定是哪一個了甲献。
我們再看hello.txt的內(nèi)容:
print("Hello World!")
print("老板是神經(jīng)病")
果然,我胡漢三又回來了颂翼。
Git的版本回退速度非郴稳鳎快,因為Git在內(nèi)部有個指向當(dāng)前版本的HEAD指針朦乏,當(dāng)你回退版本的時候锥累,Git僅僅是把HEAD從指向某個版本:
現(xiàn)在,你回退到了某個版本集歇,關(guān)掉了電腦桶略,第二天早上就后悔了,想恢復(fù)到新版本怎么辦?找不到新版本的commit id
怎么辦际歼?
在Git中惶翻,總是有后悔藥可以吃的。當(dāng)你用$ git reset --hard HEAD^
回退到舊版本時鹅心,再想恢復(fù)到新版本吕粗,就必須找到新版本的的commit id。
Git提供了一個命令git reflog
用來記錄你的每一次命令:
$ git reflog
88d885c (HEAD -> master) HEAD@{0}: reset: moving to 88d885c21216cbedacb1692e08d51afa6d4e32a7
ec4652d HEAD@{1}: reset: moving to HEAD^
88d885c (HEAD -> master) HEAD@{2}: commit: 在hello.txt添加了一句話
ec4652d HEAD@{3}: commit (initial): 添加了hello.txt
后悔藥來了
第二部分 GitHub
為什么用GitHub?
學(xué)會使用Git后我們的團隊合作能力大大提升旭愧,我們可以設(shè)置一臺代碼倉庫服務(wù)器颅筋,本地提交完成(commit)后將代碼與倉庫同步,就能實現(xiàn)分布式版本控制了输枯。
然而议泵,為一個小項目單獨設(shè)立倉庫服務(wù)器成本有些高,另外桃熄,自己搭建的物理主機服務(wù)器難免會有故障先口,我們也很難保障網(wǎng)絡(luò)(獨立ip很貴),于是瞳收,大膽的想法就出現(xiàn)了碉京!
沒錯!就是上云啦螟深!GitHub就是這樣一家提供免費代碼倉庫的公司谐宙,它是由Git之父、linux之父linus成立的(git其實是linus為了維護linux開發(fā)的)為廣大程序員提供遠程代碼倉庫的偉大公司~~
前不久被微軟收購了界弧。
頁面大概是這樣:
每個用戶有一個類似博客的主頁卧惜,和很多倉庫(一個項目一個倉庫),程序員把自己寫的代碼上傳到GitHub來托管夹纫,因為是大公司在管,你不必擔(dān)心它的服務(wù)器會掛掉设凹,在全球任何有網(wǎng)絡(luò)的地方你都可以開始工作舰讹!
沒錯,很多公司也使用GitHub管理他們的項目
大概有三種用途:
1.合作開發(fā)
如果有多個人一起開發(fā)某項目闪朱,把倉庫設(shè)在GitHub月匣,大家在各自筆記本寫代碼、修改使用git上傳奋姿、同步锄开,避免了復(fù)制粘貼代碼,而且還能實現(xiàn)版本控制称诗,誰修改了什么內(nèi)容一清二楚萍悴,連誰寫了多少行改了多少行代碼都能統(tǒng)計清楚。摸魚是不可能的。
2.軟件倉庫
GitHub提供兩種倉庫私有倉庫和公開倉庫癣诱。
GitHub免費為所有用戶提供公開倉庫空間计维,公開倉庫向網(wǎng)絡(luò)公開,所有人都能訪問撕予,但只有所有者和授權(quán)用戶才能修改鲫惶。
私有倉庫不對外公開,但要向GitHub付費实抡。
3.代碼公開
這一條應(yīng)該是最有用的了欠母,你可以在這里找到全世界程序員的勞動成果,上到各種算法實現(xiàn)吆寨、下到各種app源碼赏淌。只要遵循開源協(xié)議,你都可以copy下來用鸟废。
使用GitHub
第一步:注冊賬號GitHub官網(wǎng)
第二步:創(chuàng)建SSH Key猜敢。在用戶主目錄下,看看有沒有.ssh目錄盒延,如果有缩擂,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個文件,如果已經(jīng)有了添寺,可直接跳到下一步胯盯。如果沒有,打開Shell(Windows下打開Git Bash)计露,創(chuàng)建SSH Key:
ssh-keygen -t rsa -C "youremail@example.com"
你需要把郵件地址換成你自己的郵件地址博脑,然后一路回車,使用默認值即可票罐,由于這個Key也不是用于軍事目的叉趣,所以也無需設(shè)置密碼。
如果一切順利的話该押,可以在用戶主目錄里找到.ssh目錄疗杉,里面有id_rsa
和id_rsa.pub
兩個文件,這兩個就是SSH Key的秘鑰對蚕礼,id_rsa
是私鑰烟具,不能泄露出去,id_rsa.pub
是公鑰奠蹬,可以放心地告訴任何人朝聋。
打開id_rsa.pub,復(fù)制里面的內(nèi)容。
第三步囤躁,登陸GitHub冀痕,打開“Account settings”荔睹,“SSH Keys and GPG keys”頁面:
然后,點“New SSH Key”金度,填上任意Title应媚,在Key文本框里粘貼id_rsa.pub文件的內(nèi)容即可。
點“Add Key”猜极,你就應(yīng)該看到已經(jīng)添加的Key中姜。
為什么GitHub需要SSH Key呢?因為GitHub需要識別出你推送的提交確實是你推送的跟伏,而不是別人冒充的丢胚,而Git支持SSH協(xié)議,所以受扳,GitHub只要知道了你的公鑰携龟,就可以確認只有你自己才能推送。
當(dāng)然勘高,GitHub允許你添加多個Key峡蟋。假定你有若干電腦,你一會兒在公司提交华望,一會兒在家里提交蕊蝗,只要把每臺電腦的Key都添加到GitHub,就可以在每臺電腦上往GitHub推送了赖舟。
最后友情提示蓬戚,在GitHub上免費托管的Git倉庫,任何人都可以看到喔(但只有你自己才能改)宾抓。所以子漩,不要把敏感信息放進去。
創(chuàng)建倉庫
然后你可以創(chuàng)建倉庫了
首先石洗,登陸GitHub幢泼,然后,在右上角找到“Create a new repo”按鈕讲衫,創(chuàng)建一個新的倉庫
然后起一個項目名
來到這個項目的主頁
可以看到主頁提供了兩種和本地倉庫關(guān)聯(lián)起來的方式
方法一:
把本地已有的同名Git倉庫和GitHub上的倉庫關(guān)聯(lián)起來
我們在本地新建了一個名為Gittest的文件夾
git init
將Gittest文件夾設(shè)置為Git倉庫
添加文件,比如我們新寫了一個hello.txt:
git add hello.txt
git commit -m "first commit"
到此為止已經(jīng)提交到了本地倉庫
接下來我們把本地倉庫和遠程倉庫聯(lián)系起來
git remote add origin git@github.com:MachinePlay/Gittest.git
請千萬注意缕棵,把上面的MachinePlay替換成你自己的GitHub賬戶名,否則焦人,你在本地關(guān)聯(lián)的就是我的遠程庫,關(guān)聯(lián)沒有問題重父,但是你以后推送是推不上去的花椭,因為你的SSH Key公鑰不在我的賬戶列表中。
添加后房午,遠程庫的名字就是origin矿辽,這是Git默認的叫法,也可以改成別的,但是origin這個名字一看就知道是遠程庫
下一步袋倔,就可以把本地庫的所有內(nèi)容推送到遠程庫上
git push -u origin master
由于遠程庫是空的雕蔽,我們第一次推送master分支時,加上了-u參數(shù)宾娜,Git不但會把本地的master分支內(nèi)容推送的遠程新的master分支批狐,還會把本地的master分支和遠程的master分支關(guān)聯(lián)起來,在以后的推送或者拉取時就可以簡化命令前塔。
此后git add
git commit-m
之后 就可以使用
git push origin master
就可以把自己的代碼上傳到遠程倉庫了嚣艇。
方法二:
使用Git clone
直接從遠程倉庫克隆下來
前面我們講了先有本地庫,后有遠程庫的時候华弓,如何關(guān)聯(lián)遠程庫食零。
現(xiàn)在,假設(shè)我們從零開發(fā)寂屏,那么最好的方式是先創(chuàng)建遠程庫贰谣,然后,從遠程庫克隆迁霎。
首先吱抚,登陸GitHub,創(chuàng)建一個新的倉庫欧引,名字叫Gittest
每個倉庫都有一個地址:
我們在本地使用
git clone
直接把遠程倉庫克隆下來频伤。
git clonegit@github.com:MachinePlay/Gittest.git
看到這里大家就懂了,不僅僅是自己的倉庫可以克隆芝此,也可以克隆其他用戶的公開倉庫憋肖。
例如現(xiàn)在隨便找一個安卓閱讀app的倉庫
git clone git@github.com:smuyyh/BookReader.git
就把這位用戶倉庫里一個完整的閱讀app源碼全部下載到本地了。
至于有了全部源碼如何使用婚苹?可以學(xué)習(xí)別人的code結(jié)構(gòu)岸更、或者找成熟的中間模塊使用。
有點晚了膊升,我過段時間繼續(xù)更新使用Github合作開發(fā)內(nèi)容