標籤:

Git 有什麼奇技淫巧?


git bisect

有沒有過寫了一天的代碼,checkin無數,結果突然發現之前沒注意的地方break的時候?

這個時候要在茫茫commits里尋找那個錯誤的commit是多麼的痛苦啊。`git-bisect`就是大救星!

git-bisect本質上就是一個二分法,用起來也很簡單:

git bisect start #start
git bisect bad #current branch is bad
git bisect good & #some old commit that is good

然後只要不停的告訴git當前commit是不是好的,

git bisect good

或者

git bisect bad

就能找到罪魁禍首了!


1. 在嘗試過所有命令都不能把你從深淵裡挽救出來的時候,git reflog 也許能救你一命。

比如撤銷一次 rebase(rebase 可是會直接修改歷史的,一定要了解原理後再使用) Undoing a git rebase

2. 每次 merge 完總是出現很多 .orig 文件,使用 git clean -f 幹掉所有 untracked files

3. rebase 一個 diverged 分支一直要解決衝突很痛苦,可以嘗試在自己的分支先 squash 一下,git rebase -i,然後再 rebase 主幹,解決一次衝突就 ok 了

4. 本地有很多其實早就被刪除的遠程分支,可以用 git remote prune origin 全部清除掉,這樣再 checkout 別的分支時就清晰多了


上面有答主提到過rebase的用法,正好最近用到了這個指令,那我就分享一下我在解決衝突時對git rebase的用法吧~

場景還原一下:

我在stash里提交了一個pull requst,但我的branch還沒有到merge到develop上的時候,就有另一個和我修改了同一個文件的branch被合併到了主支。

那麼現在我的分支就會出現conflict,必須得解決衝突後才能進行下一步的merge操作。

那麼我們先假設,

我創建的分支叫"ling_long"

先被合併到主支develop上即別人創建的分支叫"xie_seng"

(。。。我不管我的分支就要叫這個名字。。

我以往的做法是:

1.先切換到主支develop上,pull下最新的代碼。

2.然後切換到我的分支,並將develop merge到我的分支上。

3.這個時候就會出現conflict提示,再根據提示解決conflict,merge成功進行。

4.最後將合併過的分支commit到遠程。

畫一張圖描述一下:

分支「ling_long"在圖中標示為」玲瓏「

分支「邪僧」在圖中標示為「邪僧」

感覺描述起來的話中文比英語好區分。。。

從下往上看起:

我們可以看到我創建了一個名為「玲瓏」的branch,修改了zhihu.js文件並進行了兩次commit

團隊中其他的人創建了一個名為「邪僧」的branch,同樣修改了zhihu.js文件並進行兩次commit。

這時候「邪僧」優先被merge進了develop,這個時候,「玲瓏」就會被提示出現confict。如果按照上文描述的方法進行pull然後merge的話,我們可以看到「邪僧」的分支上的所有commit記錄會被合併到「玲瓏」身上。這個時候玲瓏再進行commit的時候就會將「邪僧」的commit記錄一起提交上去。這樣的話,不僅不利於code reviewer審查代碼,也會讓記錄變得凌亂不幹凈。

那麼這個時候,利用rebase這個指令的優勢就會體現出來。

1.

$ git fetch origin develop

拉下遠端develop更新

2.

$ git checkout ling_long

切換到自己的分支

3.

$ git rebase -i develop

rebase ling_long 分支到develop上

4.解決衝突

5.

$ git add app/lalala/zhihu.js

git add 修改後的文件

6.

$ git diff -cached

可以檢查一下代碼變更的部分

7.

$ git rebase --continue

8.

$ git push -f origin ling_long:ling_long

強行更新ling_long branch

繼續用圖直觀地看一下:

其實就是把「玲瓏」branch移到了上面

讓它始終保持在tree的頂端。對了

當你執行

$ git rebase -i develop

其實你會進入vim模式,如果你在ling_long上有兩次commmit,如果第二次commit是對第一次commit的補充,你可以根據上面的提示進行合併,一般就是把pick改成s就可以。這個具體情況具體分析吧,我就不多描述啦。

如果有不對的地方還望前輩們多多指正。


謝邀。

我的git水平很菜,寫個回答,希望能拋磚引玉吧。

1. git add -p

以前我git add的時候,經常會把一些本地的用於調試的代碼add進去(比如console.log之類的),git add -p可以一段一段地add,每一段都會問你要不要添加(y/n?)。

2. git rebase -i

有的時候出現臨時需求,需要切換分支。本地完成一半的工作會commit成一個temp save。

git rebase -i 可以修改、增加、刪除、合併任意的commit。

3. git diff master...

注意,是3個點,不是2個點。

新開發一個功能,會創建一個新的branch。在開發新的branch的期間,master也會增加很多代碼。如果用2個點進行diff,會把master的新增代碼顯示出來。用3個點進行diff,只會顯示當前分支與master的最近公共祖先與當前分支的差異。

4. git push -u

如果當前分支沒有設置過track,這個命令會在push的同時,設置track。

Branch feature_xxx set up to track remote branch feature_xxx from origin.

有了track,有3個好處。

  1. git status的時候可以顯示領先/落後的多少個commit。
  2. git push的時候可以省略後兩個參數。
  3. git pull的時候可以省略後兩個參數。


git blame,緝兇利器


寫了一個bash自動創建git aliases,省的在terminal里一個一個打了,嗯懶癌晚期必備

Franktian/GitAliasAuto · GitHub

------------------------------------2015-01-30更新-------------------

自問自答,拋磚引玉

用git alias設置short cut可以大大提高每次輸入命令的效率。

舉個栗子:

在GIt控制台里輸入

git config --global alias.co checkout

以後每次輸入git co就相當於git checkout了

下面是一些自己常用的

st = status
ci = commit
br = branch
co = checkout
df = diff
po = push origin
pl = pull origin
pu = pull upstream

官方文檔

11. Aliases | Git How To

對於已經在版本控制之下的文件,修改後一般需要以下兩步操作提交代碼

git add &

git commit -m "&"

這兩步可以簡化成

git commit -am "commit message"

一行命令進行stage和commit兩步操作,-a 代表目標為所有修改過的文件(注意不包括untracked files)

這個方法對於有很多修改過的文件並不推薦,原因在於Commit message原則要做到盡量細緻闡述當前修改的代碼的意義,太多文件可能包含多個不同的目的,所以大家要盡量勤快的commit


title: Git常用命令和Git團隊使用規範指南

date: 2016-04-22 16:22:32

categories: 學習 | Study

description: Git是目前世界上最先進的分散式版本控制系統

---

## 前言

在2005年的某一天,Linux之父Linus Torvalds 發布了他的又一個里程碑作品——Git。它的出現改變了軟體開發流程,大大地提高了開發流暢度,直到現在仍十分流行,完全沒有衰退的跡象。其實一般情況下,只需要掌握git的幾個常用命令即可,但是在使用的過程中難免會遇到各種複雜的需求,這時候經常需要搜索,非常麻煩,故總結了一下自己平常會用到的git操作。本文根據團隊實踐記錄Git入門指南和Git常用命令,文章中不僅記錄了Git的搭建和使用教程,還參考了大量Git團隊使用規範上的經驗,希望大家可以結合自己團隊的實際應用場景讓Git協作優雅的落地。

&> Git是目前世界上最先進的分散式版本控制系統

## 更新記錄

2016年04月22日 - 初稿

閱讀原文 - Git常用命令和Git團隊使用規範指南

**擴展閱讀**

Git Book - Git - Book

git簡明指南 - git - the simple guide

常用 Git 命令清單 - http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html

猴子都能懂的GIT入門 - http://backlogtool.com/git-guide/cn/

Git教程 - Git教程 - 廖雪峰的官方網站

## SVN與Git的最主要的區別

SVN是集中式版本控制系統,版本庫是集中放在中央伺服器的,而幹活的時候,用的都是自己的電腦,所以首先要從中央伺服器哪裡得到最新的版本,然後幹活,幹完後,需要把自己做完的活推送到中央伺服器。集中式版本控制系統是必須聯網才能工作,如果在區域網還可以,帶寬夠大,速度夠快,如果在互聯網下,如果網速慢的話,就納悶了。

Git是分散式版本控制系統,那麼它就沒有中央伺服器的,每個人的電腦就是一個完整的版本庫,這樣,工作的時候就不需要聯網了,因為版本都是在自己的電腦上。既然每個人的電腦都有一個完整的版本庫,那多個人如何協作呢?比如說自己在電腦上改了文件A,其他人也在電腦上改了文件A,這時,你們兩之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。

## Git搭建和使用

&> Git上手並不難,深入學習還是建議多實踐,可以參考擴展閱讀中廖雪峰的Git教程

### Git服務端

&> 服務端搭建Git很簡單,有更多需求不妨試試Gogs和Gitlab

使用Gogs輕鬆搭建可能比GitLab更好用的Git服務平台 - 使用Gogs輕鬆搭建可能比GitLab更好用的Git服務平台

``` bash

#安裝git

sudo apt-get install git

yum install git

#創建一個git用戶,用來運行git服務

sudo adduser git

#創建證書使用公鑰免密碼登錄(可選)

ssh-keygen -t rsa

vi ~/.ssh/authorized_keys

#初始化Git倉庫

sudo git init --bare sample.git

sudo chown -R git:git sample.git

#禁用shell登錄

vi /etc/passwd

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

#在客戶端上克隆遠程倉庫

git clone git@server:/srv/sample.git

```

管理公鑰推薦使用Gitosis

Gitosis - GitHub - res0nat0r/gitosis: Manage git repositories, provide access to them over SSH, with tight access control and not needing shell accounts.

Gitosis配置手記 - Gitosis配置手記

管理許可權推薦使用Gitolite

Gitolite - GitHub - sitaramc/gitolite: Hosting git repositories -- Gitolite allows you to setup git hosting on a central server, with very fine-grained access control and many (many!) more powerful features.

### Git客戶端

&> Git客戶端可以按個人習慣來選擇,遵守團隊協作中的Git規範標準才是更重要的

Git - Git

TortoiseGit - TortoiseGit a€「 Windows Shell Interface to Git

SourceTree - Free Mercurial and Git Client for Windows and Mac

``` bash

#以最基本的Git命令行為例,先下載Git

Git - Downloads

#配置git提交用戶名和郵箱,定義別名方便區分

git config --global user.name "你的姓名"

git config --global user.email "you@example.com"

#克隆倉庫

git clone cap@172.28.70.243:/cap/cap.git

$ git clone cap@172.28.70.243:/cap/cap.git

Cloning into "cap"...

warning: You appear to have cloned an empty repository.

Checking connectivity... done.

#測試推送

touch README

git add README

git commit -m "add readme"

git push origin master

Counting objects: 3, done.

Writing objects: 100% (3/3), 199 bytes | 0 bytes/s, done.

Total 3 (delta 0), reused 0 (delta 0)

To cap@172.28.70.243:/cap/cap.git

* [new branch] master -&> master

```

## Git常用命令

**符號約定**

- `&` 自定義內容

- `[xxx]` 可選內容

- `[&]`自定義可選內容

``` bash

#初始設置

git config --global user.name "&<用戶名&>" #設置用戶名

git config --global user.email "&<電子郵件&>" #設置電子郵件

#本地操作

git add [-i] #保存更新,-i為逐個確認。

git status #檢查更新。

git commit [-a] -m "&<更新說明&>" #提交更新,-a為包含內容修改和增刪,-m為說明信息,也可以使用 -am。

#遠端操作

git clone & #克隆到本地。

git fetch #遠端抓取。

git merge #與本地當前分支合併。

git pull [&<遠端別名&>] [&<遠端branch&>] #抓取併合並,相當於第2、3步

git push [-f] [&<遠端別名&>] [&<遠端branch&>] #推送到遠端,-f為強制覆蓋

git remote add &<別名&> & #設置遠端別名

git remote [-v] #列出遠端,-v為詳細信息

git remote show &<遠端別名&> #查看遠端信息

git remote rename &<遠端別名&> &<新遠端別名&> #重命名遠端

git remote rm &<遠端別名&> #刪除遠端

git remote update [&<遠端別名&>] #更新分支列表

#分支相關

git branch [-r] [-a] #列出分支,-r遠端 ,-a全部

git branch &<分支名&> #新建分支

git branch -b &<分支名&> #新建並切換分支

git branch -d &<分支名&> #刪除分支

git checkout &<分支名&> #切換到分支

git checkout -b &<本地branch&> [-t &<遠端別名&>/&<遠端分支&>] #-b新建本地分支並切換到分支, -t綁定遠端分支

git merge &<分支名&> #合併某分支到當前分支

```

Git常用命令 - Git常用命令

- workspace: 本地的工作目錄。(記作A)

- index:緩存區域,臨時保存本地改動。(記作B)

- local repository: 本地倉庫,只想最後一次提交HEAD。(記作C)

- remote repository:遠程倉庫。(記作D)

&> 以下所有的命令的功能說明,都採用上述的標記的A、B、C、D的方式來闡述。

``` bash

#初始化

git init //創建

git clone /path/to/repository //檢出

git config --global user.email "you@example.com" //配置email

git config --global user.name "Name" //配置用戶名

#操作

git add & // 文件添加,A → B

git add . // 所有文件添加,A → B

git commit -m "代碼提交信息" //文件提交,B → C

git commit --amend //與上次commit合併, *B → C

git push origin master //推送至master分支, C → D

git pull //更新本地倉庫至最新改動, D → A

git fetch //抓取遠程倉庫更新, D → C

git log //查看提交記錄

git status //查看修改狀態

git diff//查看詳細修改內容

git show//顯示某次提交的內容

#撤銷操作

git reset &//某個文件索引會回滾到最後一次提交, C → B

git reset//索引會回滾到最後一次提交, C → B

git reset --hard // 索引會回滾到最後一次提交, C → B → A

git checkout // 從index複製到workspace, B → A

git checkout -- files // 文件從index複製到workspace, B → A

git checkout HEAD -- files // 文件從local repository複製到workspace, C → A

#分支相關

git checkout -b branch_name //創建名叫「branch_name」的分支,並切換過去

git checkout master //切換回主分支

git branch -d branch_name // 刪除名叫「branch_name」的分支

git push origin branch_name //推送分支到遠端倉庫

git merge branch_name // 合併分支branch_name到當前分支(如master)

git rebase //衍合,線性化的自動, D → A

#衝突處理

git diff //對比workspace與index

git diff HEAD //對於workspace與最後一次commit

git diff && //對比差異

git add & //修改完衝突,需要add以標記合併成功

#其他

gitk //開燈圖形化git

git config color.ui true //彩色的 git 輸出

git config format.pretty oneline //顯示歷史記錄時,每個提交的信息只顯示一行

git add -i //互動式添加文件到暫存區

```

## Git使用規範

Git 使用規範流程 - http://www.ruanyifeng.com/blog/2015/08/git-use-process.html

團隊中的 Git 實踐 - 團隊中的 Git 實踐

構家網 git 團隊協作使用規範 v2 - 構家網 git 團隊協作范 使用規範 v2_百度文庫

&> Git使用規範提醒

- 使用Git過程中,必須通過創建分支進行開發,堅決禁止在主幹分支上直接開發。review的同事有責任檢查其他同事是否遵循分支規範。

- 在Git中,默認是不會提交空目錄的,如果想提交某個空目錄到版本庫中,需要在該目錄下新建一個 .gitignore 的空白文件,就可以提交了

- 把外部文件納入到自己的 Git 分支來的時候一定要記得是先比對,確認所有修改都是自己修改的,然後再納入。不然,容易出現代碼回溯

- 多人協作時,不要各自在自己的 Git 分支開發,然後發文件合併。正確的方法應該是開一個遠程分支,然後一起在遠程分支里協作。不然,容易出現代碼回溯(即別人的代碼被覆蓋的情況)

- 每個人提交代碼是一定要 git diff 看提交的東西是不是都是自己修改的。如果有不是自己修改的內容,很可能就是代碼回溯

- review 代碼的時候如果看到有被刪除掉的代碼,一定要確實是否是寫代碼的同事自己刪除的。如果不是,很可能就是代碼回溯


git-auto-squash

git-auto-squash 可以將提交歷史中連續的fixup 合併到它之前最早的1個正式提交點上,類似不需要交互的rebase --interactive。

Usage:
&> git-auto-squash [-f] [-p &

] &...

舉個栗子

運行 git-auto-squash 後將所有 fixup! 開頭的message的commit 合併到最早遇到的非fixup!的提交點」ok」上.

處理merge的栗子

git-auto-squash 也可以處理merge的fixup。對於merge commit,如果它的其中一個parent被squash掉了,它也會被squash掉:

這樣在某些merge commit有3個或3個以上的parent的時候,會丟棄某些中間的merge點。 但不影響最終結果。

處理merge的歷史的時候建議加上-t參數, 以保證被重寫的歷史裡所有的分支都會指向新的提交點。

主頁: 隨手改變世界之 git-auto-squash

下載

git-auto-squash on gist

複製腳本到/usr/local/bin下並:

chmod +x git-auto-squash


在公司工作或者管理學習代碼,開發的代碼時使用Git是一個十分方便的選擇,然而,有些時候會遇到commit以後要規範化備註,以便以後出問題了回溯版本就可以看得到每次commit的詳情。

每次手動輸入一堆東西,又比較坑,這次BUG放前面,下次忘了又把說明放前面,導致查找的時候又有點混亂。

這個時候,定一個模板,輕鬆加愉快,規範化管理代碼,節約時間成本,又提高代碼效率,何樂而不為呢~

做法:

一、在工程的根目錄下建立模板文件

比如建立一個gitcommit_template 文件,裡面的內容為:

[部門][項目]:

問題原因:

解決方法:

變更類別:

適用機型:

驗證建議:

關聯變更項:

任務 Id:

二、設置模板的命令

  • 設置當前分支的提交模板

git config commit.template [模板文件名]

例如:git config commit.template gitcommit_template

  • 設置全局的提交模板

git config --global commit.template [模板文件名]

例如:git config --global commit.template gitcommit_template

  • 設置文本編輯器

git config -global core.editor [編輯器名稱]

例如:git config -global core.editor vim

選擇你需要的相應設置然後你就可以提交你的文件了。

  • 提交代碼

git commit (git gommit 之前需要將沒有加入代碼庫的 git add 進入代碼庫)

git commit -a (這個可以提交多個代碼文件)

此時,你commit之後,就會用你設置的編輯器打開你設置的模板,然後按照你的格式添加相應的備註,保存

  • 提交到遠程分支

git push


git rebase -i 修改提交記錄

git stash 當前分支放到緩存棧,

炒雞好用的兩個技能.


在文件路徑參數前加上--空格,可以避免歧義


是時候奉上我的git命令速記寶典了!

生成SSH Key

ssh-keygen -t rsa -C "youremail@example.com"

  • 在用戶主目錄里找到.ssh目錄
  • 將id_rsa.pub中的數據放到伺服器的.ssh目錄下

克隆遠程倉庫

git clone https/git

查看所有的版本提交記錄

git log (--pretty=oneline)

$ git log
commit affd8ca1bc90c0865fbdc425726513b1dd09a523
Author: chaimm &<350142639@qq.com&>
Date: Mon May 8 15:28:08 2017 +0800

自動化查詢頁增加:分頁功能

commit b8f06aab3a71bd4a4b66c5310b52be36748b56af
Merge: 1766243 3648640
Author: ZzzSimon &<2234587454@qq.com&>
Date: Mon May 8 15:20:17 2017 +0800

+分頁

查看版本回退/提交信息

git reflog

本地版本倉庫的版本回退

git reset --hard 3628164

工作區 與 暫存區 與 本地版本庫

  • 對代碼的修改是在工作區進行的;
  • git add後代碼會進入暫存區
  • git commit僅會提交暫存區的代碼,不會提交工作區的代碼!

撤銷工作區修改

git checkout -- 指定文件

  • 若暫存區是乾淨的,則工作區撤銷後,和之前提交的版本保持一致;
  • 若暫存區已經有代碼了,則工作區撤銷後,和暫存區的代碼保持一致。

注意:git checkout 後必須加–,否則就成切換分支命令了!

撤銷暫存區的修改,將暫存區的修改放回至工作區

git reset HEAD 指定文件

創建分支

git branch 新分支名

切換分支

git checkout 指定分支名

查看所有分支

git branch

* dev
master

合併分支

  • 切換到master分支上:

git checkout master

  • 將指定分支合併至master分支

git merge dev

刪除指定分支

git branch -d 分支名

分支管理策略

  • master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面幹活;
  • 幹活都在dev分支上,每個人都有自己的dev分支;
  • 所以,團隊合作的分支看起來就像這樣:

Bug分支

當被分配到bug時,需要創建一個新分支,在上面進行修改。但此時可能還在自己的dev分支上開發新功能,此時需要將當前工作區存起來,在bug修復完後再還原。

  • 存儲當前工作區

git stash

  • 切回master分支,基於master分支創建新的bug分支

git checkout master
git checkout -b issue-101

  • 在新分支上修改bug
  • 切回master分支,合併bug分支

git checkout master
git merge issue-101

  • 刪除bug分支

git branch -d issue-101

  • 查看所有保存的工作區

git stash list

  • 使用apply還原指定stash,再使用drop刪除

git stash apply xxx
git stash drop xxx

  • 使用pop還原並刪除第一個stash

git stash pop


用branch管(yin)理(cang)FBI Warning


真實情況:

卧槽這誰寫的這麼噁心?

git reset HEAD~1

git push -f

( ̄ー ̄)


寫幾個我常用的。

git commit -am "blabla" 快速提交

git checkout - 切換回上一次分支

git fetch —prune 和遠程分支同步

git branch -r --merged | grep -v master | sed "s/origin///『 這個可以將你merge到master的分支刪除掉

git rm --cached a.a 移除暫存區的文件(在分類提交時挺管用的

git diff --cached 或 $ git diff --staged 查看尚未提交的更新

+++++++

另 付上一個速查表 大家共勉:

git status 查看當前狀態


git commit 提交


git branch -a 查看所有的分支


git branch -r 查看遠程所有分支


git commit -am "init" 提交並且加註釋


git remote add origin git@192.168.1.119:ndshow


git push origin master 將文件給推到伺服器上


git remote show origin 顯示遠程庫origin里的資源


git push origin master:develop


git push origin master:hb-dev 將本地庫與伺服器上的庫進行關聯


git checkout --track origin/dev 切換到遠程dev分支


git branch -D master develop 刪除本地庫develop


git checkout -b dev 建立一個新的本地分支dev


git merge origin/dev 將分支dev與當前分支進行合併


git checkout dev 切換到本地dev分支


git remote show 查看遠程庫


git add .


git rm 文件名(包括路徑) 從git中刪除指定文件


git clone git://http://github.com/schacon/grit.git 從伺服器上將代碼給拉下來


git config --list 看所有用戶


git ls-files 看已經被提交的


git rm [file name] 刪除一個文件


git commit -a 提交當前repos的所有的改變


git add [file name] 添加一個文件到git index


git commit -v 當你用-v參數的時候可以看commit的差異


git commit -m "This is the message describing the commit" 添加commit信息


git commit -a -a是代表add,把所有的change加到git index里然後再commit


git commit -a -v 一般提交命令


git log 看你commit的日誌


git diff 查看尚未暫存的更新


git rm a.a 移除文件(從暫存區和工作區中刪除)


git rm --cached a.a 移除文件(只從暫存區中刪除)


git commit -m "remove" 移除文件(從Git中刪除)


git rm -f a.a 強行移除修改後文件(從暫存區和工作區中刪除)


git diff --cached 或 $ git diff --staged 查看尚未提交的更新


git stash push 將文件給push到一個臨時空間中


git stash pop 將文件從臨時空間pop下來


---------------------------------------------------------


git remote add origin git@github.com:username/Hello-World.git


git push origin master 將本地項目給提交到伺服器中


-----------------------------------------------------------


git pull 本地與伺服器端同步


-----------------------------------------------------------------


git push (遠程倉庫名) (分支名) 將本地分支推送到伺服器上去。


git push origin serverfix:awesomebranch


------------------------------------------------------------------


git fetch 相當於是從遠程獲取最新版本到本地,不會自動merge


git commit -a -m "log_message" (-a是提交所有改動,-m是加入log信息) 本地修改同步至伺服器端 :


git branch branch_0.1 master 從主分支master創建branch_0.1分支


git branch -m branch_0.1 branch_1.0 將branch_0.1重命名為branch_1.0


git checkout branch_1.0/master 切換到branch_1.0/master分支


du -hs


pro git。書里寫得好清楚。感覺以上都不是奇技淫巧,和人說自己不懂這些,就以為這些是很高端的命令,其實只不過是我們都懶得好好讀文檔了。


分頁阅读: 1 2