Git和GitHub使用教程

github.png

內(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.png

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從指向某個版本:


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

為什么用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個人主頁

每個用戶有一個類似博客的主頁卧惜,和很多倉庫(一個項目一個倉庫),程序員把自己寫的代碼上傳到GitHub來托管夹纫,因為是大公司在管,你不必擔(dān)心它的服務(wù)器會掛掉设凹,在全球任何有網(wǎng)絡(luò)的地方你都可以開始工作舰讹!
沒錯,很多公司也使用GitHub管理他們的項目
google.png

大概有三種用途:
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_rsaid_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)容即可。


添加sshkey

點“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)建一個新的倉庫

new.png

然后起一個項目名
test.png

來到這個項目的主頁
主頁

可以看到主頁提供了兩種和本地倉庫關(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

每個倉庫都有一個地址:

image.png

我們在本地使用git clone直接把遠程倉庫克隆下來频伤。

git clonegit@github.com:MachinePlay/Gittest.git

看到這里大家就懂了,不僅僅是自己的倉庫可以克隆芝此,也可以克隆其他用戶的公開倉庫憋肖。

例如現(xiàn)在隨便找一個安卓閱讀app的倉庫

image.png

git clone git@github.com:smuyyh/BookReader.git

就把這位用戶倉庫里一個完整的閱讀app源碼全部下載到本地了。

至于有了全部源碼如何使用婚苹?可以學(xué)習(xí)別人的code結(jié)構(gòu)岸更、或者找成熟的中間模塊使用。

有點晚了膊升,我過段時間繼續(xù)更新使用Github合作開發(fā)內(nèi)容
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末怎炊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子廓译,更是在濱河造成了極大的恐慌评肆,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件非区,死亡現(xiàn)場離奇詭異悼做,居然都是意外死亡气笙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門层玲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了缸榄?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長祝拯。 經(jīng)常有香客問我甚带,道長,這世上最難降的妖魔是什么鹿驼? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任欲低,我火速辦了婚禮,結(jié)果婚禮上畜晰,老公的妹妹穿的比我還像新娘砾莱。我一直安慰自己,他們只是感情好凄鼻,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布腊瑟。 她就那樣靜靜地躺著,像睡著了一般块蚌。 火紅的嫁衣襯著肌膚如雪闰非。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天峭范,我揣著相機與錄音财松,去河邊找鬼。 笑死纱控,一個胖子當(dāng)著我的面吹牛辆毡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播甜害,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼舶掖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了尔店?” 一聲冷哼從身側(cè)響起眨攘,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嚣州,沒想到半個月后鲫售,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡该肴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年情竹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沙庐。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡鲤妥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拱雏,到底是詐尸還是另有隱情棉安,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布铸抑,位于F島的核電站贡耽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鹊汛。R本人自食惡果不足惜蒲赂,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望刁憋。 院中可真熱鬧滥嘴,春花似錦、人聲如沸至耻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尘颓。三九已至走触,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疤苹,已是汗流浹背互广。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卧土,地道東北人惫皱。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子段多,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容