当前位置:   article > 正文

Hello , Git

git官网是哪一个

前言

由于最近公司开始停止使用SVN,开始转向GIT了,利用周末的时间学习实践了下,分享给大家~


什么是Git?

Git的官网是:http://git-scm.com/ ,我们可以在上面了解到GIT的一些介绍:


Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.


Git是一个开源的,免费的,分布式的版本管理系统。


我们知道CVS,SVN,也是常用的版本管理系统,他们之间最大的区别在于“分布式”。


另外,我们还需要注意GIT的一个特性:everything is local  


要知道CSV,SVN,我们本地安装的是客户端,必须通过网络连接到服务器,才能取得代码,如果断网,那就OVER了。但是GIT则不同,它所有的东西都在本地存放,也就是说在断网的情况下,可以离线运行。


说到GIT,那么自然要知道一个网站:https://github.com/ 这是一个著名的程序员社交网站,我们可以在GITHUB上发布自己的项目或者参与到别人的项目中。


GIT是大名鼎鼎的LINUX之父在2005年发布,经过多年的沉淀,在开源社区使用率非常广泛,可以说花一点时间学习GIT,将会给我们带来巨大的帮助,那么下面我们就开始吧!



来,安装Git!

目前GIT的最新版本是2.6.3,GIT虽然有GUI,但是通过命令行的方式才是掌握GIT的最佳方式,因此我将使用LINUX GIT来进行实践。


为了避免安装GIT的过程中,涉及到诸多依赖,我已经在LINUX做好YUM源,并安装了一些常用工具包,如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@localhost ~] # yum grouplist install
Loading  "rhnplugin"  plugin
Loading  "security"  plugin
Loading  "installonlyn"  plugin
This system is not registered with RHN.
RHN support will be disabled.
Setting up Group Process
Setting up repositories
Installed Groups:
    Office /Productivity
    MySQL Database
    Development Libraries
    System Tools
    GNOME Desktop Environment
    Network Servers
    X Window System
    Printing Support
    Mail Server
    Server Configuration Tools
    Administration Tools
    Graphical Internet


大家可以到https://www.kernel.org/pub/software/scm/git/  下载    git-2.6.3.tar.gz

1
2
3
4
tar  -xvf git-2.6.3. tar .gz 
. /configure  --prefix= /usr/local
make
make  install


安装完毕后,我们可以看到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost bin] # pwd
/usr/local/bin
[root@localhost bin] # ll
total 23260
-rwxr-xr-x 116 root root 5817589 Dec  4 18:29 git
-rwxr-xr-x   2 root root  162431 Dec  4 18:29 git-cvsserver
-rwxr-xr-x   1 root root  348074 Dec  4 18:29 gitk
-rwxr-xr-x 116 root root 5817589 Dec  4 18:29 git-receive-pack
-rwxr-xr-x   2 root root 2763905 Dec  4 18:29 git-shell
-rwxr-xr-x 116 root root 5817589 Dec  4 18:29 git-upload-archive
-rwxr-xr-x   2 root root 2998205 Dec  4 18:29 git-upload-pack
[root@localhost /] # git --version
git version 2.6.3
[root@localhost /] #



要使用,就要先配置Git

配置GIT,很简单!

1
2
3
[root@localhost /] # git config --global user.name zhangfengzhe
[root@localhost /] # git config --global user.email zhangfengzhe1990@163.com
[root@localhost /] # git config --global color.ui true

之所以要配置USERNAME/EMAIL就是说对代码的改动进行唯一PERSON标示

为了让GIT有些色彩,我们对颜色进行了配置。


列出配置:

1
2
3
4
5
[root@localhost /] # git config --list
user.name=zhangfengzhe
user.email=zhangfengzhe1990@163.com
color.ui= true
[root@localhost /] #


说白了,我们利用git config命令进行的配置操作,实际上是对文件的改动,那么在哪里呢?

1
2
3
4
5
6
7
8
[root@localhost ~] # pwd
/root
[root@localhost ~] # cat .gitconfig 
[user]
name = zhangfengzhe
email = zhangfengzhe1990@163.com
[color]
ui =  true


配置文件就在YOUR HOME目录下,在上面,我们看到了典型的LINUX分段式配置文件。


因此,我们可以直接修改.gitconfig就可以完成配置。



创建Git Repo

Repo即repository的简写,就是仓库,代码库的意思,有点MAVEN的感觉,呵呵。


先看下面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost myproject] # pwd
/myproject
[root@localhost myproject] # ll
total 16
drwxr-xr-x 2 root root 4096 Dec  4 19:41 hadoop
drwxr-xr-x 2 root root 4096 Dec  4 19:41 storm
[root@localhost myproject] # cd hadoop
[root@localhost hadoop] # git init 
Initialized empty Git repository  in  /myproject/hadoop/ .git/
[root@localhost hadoop] # ll -al
total 24
drwxr-xr-x 3 root root 4096 Dec  4 19:41 .
drwxr-xr-x 4 root root 4096 Dec  4 19:41 ..
drwxr-xr-x 7 root root 4096 Dec  4 19:41 .git
[root@localhost hadoop] #

我们经常使用的SVN,会在本地目录下生成.svn,GIT也类似。


通过git init命令,我们可以创建一个empty repository!


事实上,对于一般的开发人员而言,我们并不需要create empty repo,我们开始需要做的其实是克隆一个repo。


比如,最近阿里巴巴提交给apache的JSTORM项目,我们来看看如何CLONE它。


首先,我们通过https://github.com/alibaba/jstorm    COPY HTTPS

1
[root@localhost myproject] # git clone https://github.com/alibaba/jstorm.git

下载完成后,会出现jstorm目录,以及在目录中存在.git隐藏目录。


通过git clone命令,我们可以克隆一个repo到本地。



添加以及提交

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost hadoop] # pwd
/myproject/hadoop
[root@localhost hadoop] # ll -A
total 12
drwxr-xr-x 7 root root 4096 Dec  5 03:35 .git
-rw-r--r-- 1 root root    0 Dec  5 03:36 HelloWorld.java
[root@localhost hadoop] # git status
On branch master
Initial commit
Untracked files:
   (use  "git add <file>..."  to include  in  what will be committed)
HelloWorld.java
nothing added to commit but untracked files present (use  "git add"  to track)

首先注意到.git目录,说明已经进行了init。


通过git status命令,我们可以查看repo的状态信息。


注意到Untracked files列表,是在说明HelloWorld.java没有注册到Git,因此我们需要给HelloWorld.java“上户口”。

1
2
3
4
5
6
7
8
9
[root@localhost hadoop] # git add HelloWorld.java 
You have new mail  in  /var/spool/mail/root
[root@localhost hadoop] # git status
On branch master
Initial commit
Changes to be committed:
   (use  "git rm --cached <file>..."  to unstage)
new  file :   HelloWorld.java
[root@localhost hadoop] #


通过git add命令,实际上是将file推送到Staged Area。


上面再次查看状态,提示需要提交,HelloWorld.java is new file。


下面我们来提交:

1
2
3
4
5
6
7
[root@localhost hadoop] # git commit -m 
"this is the first commit for me and only one file : HelloWorld.java"
[master (root-commit) 815b551] this is the first commit  for  me and only one  file 
HelloWorld.java
  file  changed, 0 insertions(+), 0 deletions(-)
  create mode 100644 HelloWorld.java
[root@localhost hadoop] #


注意了,同SVN一样,GIT每次提交也会有MESSAGE信息,直接通过-m选项进行指定。


通过git commit -m命令来进行提交到HISTORY区域。


那么提交后的状态,又是什么呢?

1
2
3
4
[root@localhost hadoop] # git status
On branch master
nothing to commit, working directory clean
[root@localhost hadoop] #

提交后,就干净了,你懂的!


那么通过上面的一些实践,其实我们可以得到一些初步的认识:

如果有FILE并没有ADD到REPO的话,GIT会提示我们Untracked files

如果git add FILE但没有COMMIT的话,GIT会提示我们new files

如果COMMIT后,GIT会提示我们nothing to commit, working directory clean



初步认识Git的核心原理图

在上面的例子中,已经提及到working directory,staged area以及history。


其实这三个区域就是GIT的核心,理解他们之间的关系,是掌握GIT的基础。


wKiom1Zjypag-E2gAAAmWV2aDWk570.png


我们工作在working dir区域,对文件进行改动、添加、删除的操作,而这些改动首先应该先到达Staged area区域,然后通过提交在History区域形成最新version。



既然有3个区域,那么自然,对于一个文件,应该有2部分的状态信息:


第一,对于working dir和staged area而言,有什么区别?

第二,对于staged area和history而言,有什么区别?


事实上,对于git status -s会看到2列状态标志位来表达这2部分状态信息。【后文会有介绍】



对于History有一个HEAD的概念:


wKioL1ZjzXmhK5QwAAAdO6jE4M8858.png


说起head,自然会想到头部指针,确实是有这么个意思。


关于HEAD,也会在命令中予以体现!



Git状态标志位剖析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@localhost hadoop] # git status
On branch master
nothing to commit, working directory clean
[root@localhost hadoop] # ll -a
total 28
drwxr-xr-x 3 root root 4096 Dec  5 03:36 .
drwxr-xr-x 4 root root 4096 Dec  4 20:08 ..
drwxr-xr-x 8 root root 4096 Dec  5 04:01 .git
-rw-r--r-- 1 root root    0 Dec  5 03:36 HelloWorld.java
[root@localhost hadoop] # vi HelloWorld.java 
[root@localhost hadoop] # git status
On branch master
Changes not staged  for  commit:
   (use  "git add <file>..."  to update what will be committed)
   (use  "git checkout -- <file>..."  to discard changes  in  working directory)
modified:   HelloWorld.java
no changes added to commit (use  "git add"  and /or  "git commit -a" )
[root@localhost hadoop]
[root@localhost hadoop] # git status -s
  M HelloWorld.java
?? love.txt
[root@localhost hadoop] # git add love.txt 
[root@localhost hadoop] # git status -s
  M HelloWorld.java
A  love.txt


注意git status -s会简明扼要的列出状态信息,就列出2个标志位!


仔细观察上面的信息,love.txt的A,和HelloWorld.java的M并没有对齐,这是为什么呢?


实际上,一个文件的git status有2列,第一列代表staging区域信息;第二列代表woring dir信息。也即是说,HelloWorld.java在working dir中修改了,但没有提交到staging area 。love.txt在staging中添加了,但是在work dir中,没有改变。


继续,看下面的操作,来看status的变化:

1
2
3
4
5
6
7
8
9
10
[root@localhost hadoop] # git commit -m "love.txt" love.txt 
[master f43f700] love.txt
  file  changed, 0 insertions(+), 0 deletions(-)
  create mode 100644 love.txt
[root@localhost hadoop] # git status -s
  M HelloWorld.java
[root@localhost hadoop] # git add HelloWorld.java 
[root@localhost hadoop] # git status -s
M  HelloWorld.java
[root@localhost hadoop] #



如何查看文件差别?

其实当我们利用git status发现文件有差异时,很显然,我们需要查看文件的差别在哪里!


看差异,看什么和什么的差异呢?


是working dirPK staged area ?

是staged area PK history ?

还是working dir PK history ?


git都可以满足你!


working dir PK staged area:

1
2
3
4
5
6
7
8
9
10
11
[root@localhost hadoop] # git status -s
MM HelloWorld.java
[root@localhost hadoop] # git diff
diff  --git a /HelloWorld .java b /HelloWorld .java
index 2e3abaa..5e6618e 100644
--- a /HelloWorld .java
+++ b /HelloWorld .java
@@ -1 +1,2 @@
  this is not a java  file ,haha
+abc
[root@localhost hadoop] #


staged area PK history:

1
[root@localhost hadoop] # git diff --staged


working dir PK history:

1
2
3
4
5
6
7
8
9
10
11
[root@localhost hadoop] # git status -s
MM HelloWorld.java
[root@localhost hadoop] # git diff HEAD
diff  --git a /HelloWorld .java b /HelloWorld .java
index e69de29..5e6618e 100644
--- a /HelloWorld .java
+++ b /HelloWorld .java
@@ -0,0 +1,2 @@
+this is not a java  file ,haha
+abc
[root@localhost hadoop] #

git diff/git diff --staged/git diff HEAD 查看文件差异。


git diff列出的信息也是蛮多的,当然可以像git status -s那样有简化版本:


git diff --stat

1
2
3
4
[root@localhost hadoop] # git diff --stat HEAD
  HelloWorld.java | 2 ++
  file  changed, 2 insertions(+)
[root@localhost hadoop] #



Git有后悔药可以吃!

有一句老话叫 人非圣贤,孰能无过。


那么在GIT中,如何撤销错误呢?


既然是撤销错误,那么是从哪里撤销到哪里呢?


在实际开发中,我们经常遇到的是这样的情况,我们对working dir的FILE进行了修改,然后ADD到了staged area区域,突然发现有问题,想撤销这些改动。


SO EASY,我们只需要将history的内容还原即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost hadoop] # ll -A
total 20
drwxr-xr-x 8 root root 4096 Dec  5 06:20 .git
-rw-r--r-- 1 root root   33 Dec  5 04:56 HelloWorld.java
-rw-r--r-- 1 root root    0 Dec  5 04:06 love.txt
[root@localhost hadoop] # vi HelloWorld.java 
[root@localhost hadoop] # git status -s
  M HelloWorld.java
[root@localhost hadoop] # git add HelloWorld.java 
[root@localhost hadoop] # git status -s
M  HelloWorld.java
[root@localhost hadoop] # git reset HelloWorld.java 
Unstaged changes after reset:
M  HelloWorld.java
[root@localhost hadoop] # git status -s
  M HelloWorld.java
[root@localhost hadoop] #

可以发现通过git reset命令将staging area还原至history版本,需要注意是的不影响WORK DIR的改动。其实,就是一个标志位的还原操作而已。


那如果我们想把已经修改的WORK DIR的文件也恢复到原来的状态,怎么办呢?

同上,我们只需要将STAGING AREA的文件覆盖WORK DIR即可,利用git checkout命令。

1
2
3
4
5
6
7
8
9
10
[root@localhost hadoop] # more HelloWorld.java 
this is not a java  file ,haha
abc
woyaogaini
[root@localhost hadoop] # git checkout HelloWorld.java 
[root@localhost hadoop] # git status -s
[root@localhost hadoop] # more HelloWorld.java 
this is not a java  file ,haha
abc
[root@localhost hadoop] #

注意,git提供了一个简化命令git checkout HEAD,它等价于下面的操作:

git checkout HEAD = git reset + git checkout

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@localhost hadoop] # git status -s
[root@localhost hadoop] # ll -A
total 24
drwxr-xr-x 8 root root 4096 Dec  5 06:34 .git
-rw-r--r-- 1 root root   33 Dec  5 06:26 HelloWorld.java
-rw-r--r-- 1 root root   11 Dec  5 06:34 love.txt
[root@localhost hadoop] # cat love.txt 
i love you
[root@localhost hadoop] # vi love.txt 
[root@localhost hadoop] # cat love.txt 
i love you
do  you love me
[root@localhost hadoop] # git status -s
  M love.txt
[root@localhost hadoop] # git add love.txt 
[root@localhost hadoop] # git status -s
M  love.txt
[root@localhost hadoop] # git checkout HEAD love.txt 
[root@localhost hadoop] # git status -s
[root@localhost hadoop] # cat love.txt 
i love you
[root@localhost hadoop] #



移除及重命名文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@localhost hadoop] # ll
total 16
-rw-r--r-- 1 root root 33 Dec  5 06:26 HelloWorld.java
-rw-r--r-- 1 root root 31 Dec  5 06:42 love.txt
[root@localhost hadoop] # git status -s
[root@localhost hadoop] # touch delete.log
[root@localhost hadoop] # git add delete.log 
[root@localhost hadoop] # git commit -m "commit"
[master 0eccf50] commit
  file  changed, 0 insertions(+), 0 deletions(-)
  create mode 100644 delete.log
[root@localhost hadoop] # git status
On branch master
nothing to commit, working directory clean
[root@localhost hadoop] # git rm delete.log 
rm  'delete.log'
[root@localhost hadoop] # git status -s
D  delete.log
[root@localhost hadoop] # ll -A
total 24
drwxr-xr-x 8 root root 4096 Dec  5 06:53 .git
-rw-r--r-- 1 root root   33 Dec  5 06:26 HelloWorld.java
-rw-r--r-- 1 root root   31 Dec  5 06:42 love.txt
[root@localhost hadoop] #

看得出,利用git rm进行删除后,需要COMMIT!

1
2
3
4
5
6
7
8
[root@localhost hadoop] # git status -s
D  delete.log
[root@localhost hadoop] # git commit -m "commit"
[master 415380f] commit
  file  changed, 0 insertions(+), 0 deletions(-)
  delete mode 100644 delete.log
[root@localhost hadoop] # git status -s
[root@localhost hadoop] #

默认情况下,git rm会把working dir以及staged area的文件进行删除。


如果我们仅仅想从STAGING AREA中移除FILE,但是保留WORK DIR中的文件的话,可以这样操作:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[root@localhost myproject] # ll
total 16
drwxr-xr-x 3 root root 4096 Dec  5 06:53 hadoop
drwxr-xr-x 2 root root 4096 Dec  4 19:41 storm
[root@localhost myproject] # cd hadoop/
[root@localhost hadoop] # ll
total 16
-rw-r--r-- 1 root root 33 Dec  5 06:26 HelloWorld.java
-rw-r--r-- 1 root root 31 Dec  5 06:42 love.txt
[root@localhost hadoop] # git status -s
[root@localhost hadoop] # touch delete.log
[root@localhost hadoop] # git status -s
?? delete.log
[root@localhost hadoop] # git add delete.log 
[root@localhost hadoop] # git commit -m "commit"
[master 48b1bad] commit
  file  changed, 0 insertions(+), 0 deletions(-)
  create mode 100644 delete.log
[root@localhost hadoop] # git status -s
[root@localhost hadoop] # ll
total 20
-rw-r--r-- 1 root root  0 Dec  5 17:26 delete.log
-rw-r--r-- 1 root root 33 Dec  5 06:26 HelloWorld.java
-rw-r--r-- 1 root root 31 Dec  5 06:42 love.txt
[root@localhost hadoop] # git rm -cached delete.log 
error: did you mean `--cached` (with two dashes ?)
[root@localhost hadoop] # git rm --cached delete.log 
rm  'delete.log'
[root@localhost hadoop] # ll
total 20
-rw-r--r-- 1 root root  0 Dec  5 17:26 delete.log
-rw-r--r-- 1 root root 33 Dec  5 06:26 HelloWorld.java
-rw-r--r-- 1 root root 31 Dec  5 06:42 love.txt
[root@localhost hadoop] # git status -s
D  delete.log
?? delete.log
[root@localhost hadoop] #

git rm --cached的方式:


从最后的状态可以看到,delete.log仍然在WORK DIR中,但是并没有ADD到STAGING AREA区域,同时STAGING AREA区域的delete.log被删除。


重命名操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost hadoop] # ll -A
total 28
-rw-r--r-- 1 root root    0 Dec  5 17:26 delete.log
drwxr-xr-x 8 root root 4096 Dec  5 17:31 .git
-rw-r--r-- 1 root root   33 Dec  5 06:26 HelloWorld.java
-rw-r--r-- 1 root root   31 Dec  5 06:42 love.txt
[root@localhost hadoop] # git status -s
[root@localhost hadoop] # git mv delete.log delete.me
[root@localhost hadoop] # git status -s
R  delete.log -> delete.me
[root@localhost hadoop] # git commit -m "rename file"
[master 6f26a1b] rename  file
  file  changed, 0 insertions(+), 0 deletions(-)
  rename delete.log => delete.me (100%)
[root@localhost hadoop] # git status -s
[root@localhost hadoop] #

通过git mv即可重命名,需要COMMIT!



保留现场:暂存工作区

什么叫暂存工作区呢?

比如在实际开发中,我们经常遇到这样的场景:

我们在WORK DIR中进行修改,有时我们还add了一部分到staging area,此时突然发现代码存在BUG,需要修改。当然,我们可以利用git reset+git checkout的方式迅速得到clean code,然后开始修改,但是这样我们就丢失了在work dir中的所有改动。


git为我们提供了git stash命令,帮助我们保存现有的工作区,于此同时work dir /staging area的代码恢复到HISTORY水平。一旦我们改动完毕,COMMIT到HISTORY后,利用git stash pop进行还原原来的工作区!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
[root@localhost hadoop] # git status -s
[root@localhost hadoop] # ll
total 28
-rw-r--r-- 1 root root  7 Dec  5 18:07 delete.me
-rw-r--r-- 1 root root 33 Dec  5 06:26 HelloWorld.java
-rw-r--r-- 1 root root 31 Dec  5 06:42 love.txt
-rw-r--r-- 1 root root  0 Dec  5 17:40 t1.txt
[root@localhost hadoop] # vi delete.me 
[root@localhost hadoop] # cat delete.me 
hello , world
[root@localhost hadoop] # git status -s
  M delete.me
[root@localhost hadoop] # git add delete.me 
[root@localhost hadoop] # git status -s
M  delete.me
[root@localhost hadoop] # vi delete.me 
[root@localhost hadoop] # git status -s
MM delete.me
[root@localhost hadoop] # git stash
Saved working directory and index state WIP on master: b714e98 commit
HEAD is now at b714e98 commit
[root@localhost hadoop] # git status -s
[root@localhost hadoop] # ll
total 28
-rw-r--r-- 1 root root  7 Dec  5 18:11 delete.me
-rw-r--r-- 1 root root 33 Dec  5 06:26 HelloWorld.java
-rw-r--r-- 1 root root 31 Dec  5 06:42 love.txt
-rw-r--r-- 1 root root  0 Dec  5 17:40 t1.txt
[root@localhost hadoop] # vi HelloWorld.java 
[root@localhost hadoop] # git status -s
  M HelloWorld.java
[root@localhost hadoop] # git add HelloWorld.java 
[root@localhost hadoop] # git commit -m "bug fix"
[master 54cf628] bug fix
  file  changed, 1 insertion(+)
[root@localhost hadoop] # git status -s
[root@localhost hadoop] # git stash pop
On branch master
Changes not staged  for  commit:
   (use  "git add <file>..."  to update what will be committed)
   (use  "git checkout -- <file>..."  to discard changes  in  working directory)
modified:   delete.me
no changes added to commit (use  "git add"  and /or  "git commit -a" )
Dropped refs /stash @{0} (963a3ab0075e09ee63117b6b8b606780aca5d020)
[root@localhost hadoop] # ll
total 28
-rw-r--r-- 1 root root 26 Dec  5 18:12 delete.me
-rw-r--r-- 1 root root 37 Dec  5 18:11 HelloWorld.java
-rw-r--r-- 1 root root 31 Dec  5 06:42 love.txt
-rw-r--r-- 1 root root  0 Dec  5 17:40 t1.txt
[root@localhost hadoop] # cat delete.me 
hello , world
hello , git
[root@localhost hadoop] # git status -s
  M delete.me
[root@localhost hadoop] #



总结


wKiom1Zj2NThbPFIAABNqU95x5E353.png


到这里就结束了,下篇博客将会继续介绍GIT的一些深入知识,比如COMMIT对象、TREE-ISH表达式、创建/删除/合并分支等。


本文转自zfz_linux_boy 51CTO博客,原文链接:http://blog.51cto.com/zhangfengzhe/1720049,如需转载请自行联系原作者

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/201487
推荐阅读
相关标签
  

闽ICP备14008679号