活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

从零开始学习上传项目到GitLab掌握版本控制核心技能包括创建仓库配置SSH密钥推送代码管理分支解决冲突以及利用CI CD提升开发效率成为团队中的Git专家

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-13 14:30:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言:GitLab与版本控制的重要性

在当今软件开发的世界中,版本控制已成为团队协作的基石。GitLab作为一个强大的基于Web的Git仓库管理工具,不仅提供了代码托管功能,还集成了CI/CD、问题跟踪、Wiki等丰富的功能,使开发团队能够在一个统一的平台上完成整个软件开发生命周期。

版本控制系统允许开发者追踪代码变更、协作开发、回滚错误以及管理项目的不同版本。掌握GitLab的使用,不仅能提高个人开发效率,还能使你在团队协作中游刃有余。本文将带你从零开始,逐步学习如何使用GitLab进行版本控制,最终成为团队中的Git专家。

GitLab基础:创建和配置仓库

注册GitLab账号

首先,你需要在GitLab上创建一个账号。访问GitLab官网,点击”Register”按钮,填写必要信息完成注册。你也可以使用GitHub、Google等第三方账号快速注册。

创建新项目

登录后,点击页面顶部的”+“图标,选择”New project”来创建一个新项目。在创建页面,你需要填写以下信息:

• Project name:项目名称
• Project slug:项目的URL标识,通常基于项目名称自动生成
• Description(可选):项目描述
• Visibility Level:项目的可见性级别(Private、Internal或Public)

对于初学者,建议选择”Private”以保护你的代码不被公开。填写完毕后,点击”Create project”按钮。

项目初始化

创建项目后,GitLab会显示一个空的项目页面。页面提供了几种初始化项目的方式:

1. 创建一个新的README文件
2. 上传现有文件
3. 从其他版本控制系统导入
4. 使用命令行工具初始化

对于新项目,建议选择”Create a README file”选项,这会自动创建一个README.md文件并初始化仓库。

了解项目结构

初始化完成后,你会看到项目的主页面,包含以下主要部分:

• Files:显示项目文件和目录结构
• Commits:显示提交历史
• Branches:显示所有分支
• Merge Requests:显示合并请求
• CI/CD:显示持续集成/持续部署状态
• Wiki:项目文档
• Issues:问题跟踪

SSH密钥配置:安全连接GitLab

为什么需要SSH密钥

SSH(Secure Shell)是一种加密网络协议,用于在不安全的网络上安全地运行网络服务。使用SSH密钥连接GitLab有以下优势:

1. 安全性:相比HTTPS,SSH使用公钥加密,更加安全
2. 便利性:配置后无需每次输入用户名和密码
3. 自动化:便于脚本和CI/CD流程使用

生成SSH密钥对

如果你还没有SSH密钥,可以通过以下步骤生成:

1. 打开终端(Linux/macOS)或Git Bash(Windows)
2. 输入以下命令生成新的SSH密钥:
  1. ssh-keygen -t ed25519 -C "your_email@example.com"
复制代码

这里的your_email@example.com应该替换为你在GitLab注册时使用的邮箱地址。

1. 系统会提示你保存密钥的位置,默认是~/.ssh/id_ed25519,按Enter键接受默认值
2. 系统会要求你输入密码(passphrase),这是可选的,但建议设置以增加安全性

如果你使用的是较旧的系统,可能不支持ED25519算法,可以使用RSA算法:
  1. ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
复制代码

查看SSH公钥

生成密钥后,你需要将公钥添加到GitLab账户中。公钥通常以.pub结尾,可以使用以下命令查看:
  1. cat ~/.ssh/id_ed25519.pub
复制代码

或对于RSA密钥:
  1. cat ~/.ssh/id_rsa.pub
复制代码

命令会输出一长串以ssh-ed25519或ssh-rsa开头的文本,这就是你的SSH公钥。

在GitLab中添加SSH密钥

1. 登录GitLab,点击右上角的头像,选择”Settings”
2. 在左侧菜单中,选择”SSH Keys”
3. 将上一步中复制的公钥粘贴到”Key”文本框中
4. 在”Title”文本框中为密钥起一个描述性的名称(例如”My Laptop”)
5. 点击”Add key”按钮保存

测试SSH连接

配置完成后,你可以通过以下命令测试SSH连接是否成功:
  1. ssh -T git@gitlab.com
复制代码

如果是第一次连接,系统会询问是否信任GitLab的主机指纹,输入yes继续。如果一切正常,你会看到类似以下的欢迎信息:
  1. Welcome to GitLab, @yourusername!
复制代码

基本Git操作:克隆、添加、提交和推送代码

安装Git

在开始使用Git之前,确保你的系统上已安装Git。你可以通过以下命令检查:
  1. git --version
复制代码

如果未安装,可以根据你的操作系统从Git官网下载并安装。

克隆仓库

要将GitLab上的项目克隆到本地,你需要使用git clone命令。在项目页面,点击”Clone”按钮,复制SSH或HTTPS URL。

使用SSH克隆:
  1. git clone git@gitlab.com:username/project-name.git
复制代码

或使用HTTPS克隆:
  1. git clone https://gitlab.com/username/project-name.git
复制代码

克隆完成后,进入项目目录:
  1. cd project-name
复制代码

配置Git用户信息

在开始提交代码之前,你需要配置Git的用户信息,这些信息会包含在每次提交中:
  1. git config --global user.name "Your Name"
  2. git config --global user.email "your_email@example.com"
复制代码

基本工作流程

Git的基本工作流程包括以下几个步骤:

1. 修改文件:在项目目录中创建或修改文件
2. 查看状态:使用git status查看当前状态
3. 添加更改:使用git add将更改添加到暂存区
4. 提交更改:使用git commit将暂存区的更改提交到本地仓库
5. 推送更改:使用git push将本地提交推送到远程仓库

让我们通过一个完整的例子来说明这个过程:
  1. # 创建一个新文件
  2. echo "# My Project" > README.md
  3. # 查看Git状态
  4. git status
  5. # 输出: On branch master
  6. #       No commits yet
  7. #       Untracked files:
  8. #         (use "git add <file>..." to include in what will be committed)
  9. #               README.md
  10. #
  11. #       nothing added to commit but untracked files present (use "git add" to track)
  12. # 添加文件到暂存区
  13. git add README.md
  14. # 再次查看状态
  15. git status
  16. # 输出: On branch master
  17. #       No commits yet
  18. #       Changes to be committed:
  19. #         (use "git rm --cached <file>..." to unstage)
  20. #               new file:   README.md
  21. # 提交更改
  22. git commit -m "Add initial README file"
  23. # 输出: [master (root-commit) a1b2c3d] Add initial README file
  24. #       1 file changed, 1 insertion(+)
  25. #       create mode 100644 README.md
  26. # 推送到远程仓库
  27. git push origin master
复制代码

常用Git命令详解

git add命令将文件添加到暂存区,准备提交。你可以添加特定文件:
  1. git add filename.txt
复制代码

或添加所有修改的文件:
  1. git add .
复制代码

或添加所有修改和删除的文件:
  1. git add -A
复制代码

git commit命令将暂存区的更改保存到本地仓库。基本用法:
  1. git commit -m "Commit message"
复制代码

如果你想修改上一次的提交(例如修改提交信息或添加更多文件),可以使用:
  1. git commit --amend
复制代码

git push命令将本地提交推送到远程仓库。基本用法:
  1. git push origin branch-name
复制代码

如果你是第一次推送,或者设置了上游分支,可以使用:
  1. git push -u origin branch-name
复制代码

git pull命令从远程仓库获取最新更改并合并到本地。基本用法:
  1. git pull origin branch-name
复制代码

git log命令显示提交历史。基本用法:
  1. git log
复制代码

如果你想以更简洁的方式查看历史:
  1. git log --oneline
复制代码

git diff命令显示文件之间的差异。查看工作区与暂存区的差异:
  1. git diff
复制代码

查看暂存区与最新提交的差异:
  1. git diff --staged
复制代码

git reset命令用于撤销更改。将文件从暂存区移回工作区:
  1. git reset filename.txt
复制代码

完全撤销最近的提交(保留更改):
  1. git reset HEAD~1
复制代码

完全撤销最近的提交(丢弃更改):
  1. git reset --hard HEAD~1
复制代码

分支管理:创建、切换、合并分支

理解分支的概念

在Git中,分支是一个轻量级的可移动指针,指向特定的提交。分支允许你并行开发不同的功能,而不会影响主代码库。GitLab中的分支策略通常包括:

• 主分支(master/main):包含稳定、可部署的代码
• 开发分支(develop):集成所有功能开发的分支
• 功能分支(feature):开发特定功能的分支
• 发布分支(release):准备发布的分支
• 修复分支(hotfix):紧急修复生产问题的分支

创建分支

创建新分支的命令是:
  1. git branch new-branch-name
复制代码

或者,你可以创建并立即切换到新分支:
  1. git checkout -b new-branch-name
复制代码

例如,创建一个名为”feature-login”的新分支:
  1. git checkout -b feature-login
复制代码

切换分支

切换到已有分支:
  1. git checkout branch-name
复制代码

例如,切换到master分支:
  1. git checkout master
复制代码

查看分支

查看所有本地分支:
  1. git branch
复制代码

查看所有本地和远程分支:
  1. git branch -a
复制代码

查看远程分支:
  1. git branch -r
复制代码

删除分支

删除本地分支:
  1. git branch -d branch-name
复制代码

强制删除未合并的分支:
  1. git branch -D branch-name
复制代码

删除远程分支:
  1. git push origin --delete branch-name
复制代码

合并分支

将一个分支合并到当前分支:
  1. git merge source-branch
复制代码

例如,将feature-login分支合并到master分支:
  1. git checkout master
  2. git merge feature-login
复制代码

变基(Rebase)

变基是另一种整合分支的方法,它可以将一系列提交应用到另一个分支上。基本用法:
  1. git checkout feature-branch
  2. git rebase master
复制代码

这将把feature-branch上的提交重新应用到master的最新提交之上。

GitLab中的合并请求(Merge Request)

在GitLab中,合并请求(Merge Request,简称MR)是一种将代码从一个分支合并到另一个分支的方式,同时提供了代码审查、讨论和自动化测试的功能。

1. 在GitLab项目页面,点击左侧菜单中的”Merge Requests”
2. 点击”New merge request”按钮
3. 选择源分支和目标分支
4. 点击”Compare branches and continue”
5. 填写标题和描述
6. 点击”Submit merge request”

作为审查者,你可以:

• 查看代码更改
• 发表评论
• 请求更改
• 批准合并请求

当合并请求被批准后,你可以:

1. 点击”Merge”按钮立即合并
2. 设置”Merge when pipeline succeeds”在CI/CD通过后自动合并
3. 选择”Squash commits”将多个提交压缩为一个

解决冲突:识别和解决代码冲突

理解冲突的产生

冲突通常发生在以下情况:

1. 多人修改了同一文件的同一部分
2. 一个分支修改了文件,而另一个分支删除了同一文件
3. 合并或变基时,Git无法自动整合更改

当发生冲突时,Git会标记冲突的文件,你需要手动解决这些冲突。

识别冲突

当合并或变基过程中发生冲突,Git会输出类似以下的信息:
  1. Auto-merging filename.txt
  2. CONFLICT (content): Merge conflict in filename.txt
  3. Automatic merge failed; fix conflicts and then commit the result.
复制代码

使用git status查看冲突的文件:
  1. git status
  2. # 输出: On branch master
  3. #       You have unmerged paths.
  4. #         (fix conflicts and run "git commit")
  5. #         (use "git merge --abort" to abort the merge)
  6. #
  7. #       Changes to be committed:
  8. #
  9. #               modified:   another-file.txt
  10. #
  11. #       Unmerged paths:
  12. #         (use "git add <file>..." to mark resolution)
  13. #
  14. #               both modified:   filename.txt
复制代码

解决冲突

打开冲突的文件,你会看到类似以下的标记:
  1. <<<<<<< HEAD
  2. 这是当前分支的内容
  3. =======
  4. 这是要合并的分支的内容
  5. >>>>>>> feature-branch
复制代码

你需要编辑文件,保留所需的内容,删除冲突标记。例如,修改后的文件可能如下:
  1. 这是合并后的内容
复制代码

完成合并

解决所有冲突后,使用以下命令完成合并:
  1. git add filename.txt
  2. git commit
复制代码

Git会自动生成一个合并提交信息,你可以接受或修改它。

中止合并

如果你想中止合并过程,恢复到合并前的状态:
  1. git merge --abort
复制代码

避免冲突的最佳实践

1. 频繁拉取最新更改:定期从主分支拉取最新更改,减少冲突的可能性
2. 小步提交:保持提交小而专注,便于理解和解决冲突
3. 清晰沟通:与团队成员协调谁负责修改哪些文件
4. 使用功能分支:为每个功能创建独立的分支,减少直接修改主分支的情况
5. 定期合并主分支:定期将主分支的更改合并到功能分支,保持代码同步

CI/CD入门:利用GitLab CI/CD提升开发效率

理解CI/CD的概念

CI/CD是现代软件开发的核心实践,包括:

• 持续集成(Continuous Integration, CI):频繁地将代码集成到共享仓库中,每次集成都会通过自动化构建和测试来验证
• 持续交付(Continuous Delivery, CD):确保代码可以随时部署到生产环境
• 持续部署(Continuous Deployment, CD):自动将通过所有测试的代码部署到生产环境

GitLab CI/CD是GitLab内置的持续集成、持续交付和持续部署服务,与GitLab紧密集成,无需额外安装或配置。

GitLab CI/CD的基本组件

.gitlab-ci.yml文件是GitLab CI/CD的配置文件,定义了项目的构建、测试和部署流程。这个文件应该放在项目的根目录下。

一个简单的.gitlab-ci.yml示例:
  1. # 定义阶段
  2. stages:
  3.   - build
  4.   - test
  5.   - deploy
  6. # 构建作业
  7. build_job:
  8.   stage: build
  9.   script:
  10.     - echo "Building the project..."
  11.     - npm install
  12.     - npm run build
  13. # 测试作业
  14. test_job:
  15.   stage: test
  16.   script:
  17.     - echo "Running tests..."
  18.     - npm test
  19. # 部署作业
  20. deploy_job:
  21.   stage: deploy
  22.   script:
  23.     - echo "Deploying the project..."
  24.     - scp -r build/* user@server:/path/to/deploy
  25.   only:
  26.     - master
复制代码

Runner是执行CI/CD作业的服务器。GitLab提供共享的Runner,你也可以设置自己的Runner。Runner有两种类型:

• Shared Runner:由GitLab管理,所有项目都可以使用
• Specific Runner:为特定项目或组配置的Runner

Pipeline是.gitlab-ci.yml中定义的一系列作业,按阶段执行。例如,上面的示例定义了一个包含三个阶段的Pipeline:build、test和deploy。

Job是Pipeline中的基本单位,定义了要执行的任务。每个Job属于一个阶段,同一阶段的Job并行执行,不同阶段的Job顺序执行。

创建第一个Pipeline

让我们创建一个简单的Node.js项目的Pipeline:

1. 在项目根目录创建.gitlab-ci.yml文件:
  1. image: node:14
  2. stages:
  3.   - install
  4.   - test
  5.   - build
  6. install_dependencies:
  7.   stage: install
  8.   script:
  9.     - npm ci
  10.   cache:
  11.     paths:
  12.       - node_modules/
  13. run_tests:
  14.   stage: test
  15.   script:
  16.     - npm test
  17.   cache:
  18.     paths:
  19.       - node_modules/
  20.     policy: pull
  21. build_application:
  22.   stage: build
  23.   script:
  24.     - npm run build
  25.   artifacts:
  26.     paths:
  27.       - dist/
  28.   only:
  29.     - master
复制代码

1. 提交并推送这个文件:
  1. git add .gitlab-ci.yml
  2. git commit -m "Add CI/CD configuration"
  3. git push origin master
复制代码

1. 在GitLab中,转到”CI/CD > Pipelines”,你应该能看到一个新的Pipeline正在运行

使用缓存和构件

缓存用于在作业之间保存文件,加速后续作业的执行。在.gitlab-ci.yml中配置缓存:
  1. cache:
  2.   paths:
  3.     - node_modules/
复制代码

构件是作业生成的文件,可以在作业之间传递或下载。在.gitlab-ci.yml中配置构件:
  1. build_application:
  2.   stage: build
  3.   script:
  4.     - npm run build
  5.   artifacts:
  6.     paths:
  7.       - dist/
  8.     expire_in: 1 week
复制代码

环境变量

你可以在GitLab CI/CD中使用环境变量:

GitLab CI/CD提供了一系列预定义变量,例如:

• CI_COMMIT_SHA:当前提交的SHA
• CI_JOB_NAME:作业名称
• CI_PIPELINE_ID:Pipeline ID

你可以在项目设置中定义自定义变量:

1. 转到项目页面
2. 点击”Settings > CI/CD”
3. 展开”Variables”部分
4. 点击”Add variable”

在.gitlab-ci.yml中使用这些变量:
  1. deploy_production:
  2.   stage: deploy
  3.   script:
  4.     - echo "Deploying to $PRODUCTION_URL"
  5.     - scp -r build/* user@$PRODUCTION_SERVER:/path/to/deploy
  6.   only:
  7.     - master
复制代码

部署到不同环境

你可以定义不同的环境(如开发、测试、生产)并部署到它们:
  1. deploy_staging:
  2.   stage: deploy
  3.   script:
  4.     - echo "Deploying to staging environment"
  5.     - scp -r build/* user@staging-server:/path/to/deploy
  6.   environment:
  7.     name: staging
  8.     url: https://staging.example.com
  9.   only:
  10.     - develop
  11. deploy_production:
  12.   stage: deploy
  13.   script:
  14.     - echo "Deploying to production environment"
  15.     - scp -r build/* user@production-server:/path/to/deploy
  16.   environment:
  17.     name: production
  18.     url: https://example.com
  19.   only:
  20.     - master
  21.   when: manual
复制代码

使用Docker构建和部署

GitLab CI/CD与Docker紧密集成,你可以使用Docker来构建和部署应用程序:
  1. image: docker:latest
  2. services:
  3.   - docker:dind
  4. variables:
  5.   DOCKER_DRIVER: overlay2
  6.   IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
  7. stages:
  8.   - build
  9.   - deploy
  10. build_image:
  11.   stage: build
  12.   script:
  13.     - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  14.     - docker build -t $IMAGE_TAG .
  15.     - docker push $IMAGE_TAG
  16. deploy_production:
  17.   stage: deploy
  18.   script:
  19.     - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  20.     - docker pull $IMAGE_TAG
  21.     - docker run -d -p 80:80 $IMAGE_TAG
  22.   only:
  23.     - master
复制代码

监控和优化Pipeline

在GitLab中,你可以:

• 查看Pipeline的整体状态
• 查看每个作业的日志
• 查看Pipeline的可视化图表
• 下载作业构件

1. 使用缓存:缓存依赖项和构建结果
2. 并行作业:将任务分解为可以并行运行的作业
3. 使用Docker镜像:预安装依赖项的自定义Docker镜像
4. 选择性运行:使用only和except控制作业运行条件
5. 使用artifacts:在作业之间传递构建结果,而不是重新构建

高级技巧:成为Git专家的进阶技能

Git钩子(Git Hooks)

Git钩子是在特定事件(如提交、推送)发生时自动执行的脚本。GitLab支持服务器端钩子,例如:

• pre-receive:在接收推送时运行,可用于验证提交
• post-receive:在接收推送后运行,可用于触发CI/CD
• update:在更新分支时运行,可用于实施分支策略

子模块(Submodules)

Git子模块允许你将一个Git仓库作为另一个Git仓库的子目录。添加子模块:
  1. git submodule add https://gitlab.com/user/repo.git path/to/submodule
复制代码

克隆包含子模块的项目:
  1. git clone --recurse-submodules https://gitlab.com/user/project.git
复制代码

更新子模块:
  1. git submodule update --remote
复制代码

变基与交互式变基

交互式变基允许你修改提交历史,例如重新排序、编辑、合并或删除提交:
  1. git rebase -i HEAD~3
复制代码

这将打开一个编辑器,显示最近3个提交的列表,你可以选择对这些提交执行的操作。

暂存更改(Stashing)

当你需要切换分支但不想提交当前更改时,可以使用git stash:
  1. # 暂存当前更改
  2. git stash
  3. # 查看暂存列表
  4. git stash list
  5. # 应用暂存的更改
  6. git stash apply
  7. # 应用并删除暂存
  8. git stash pop
复制代码

Cherry-pick

git cherry-pick允许你选择一个或多个提交应用到当前分支:
  1. git cherry-pick commit-hash
复制代码

Git工作流

Git Flow是一个流行的分支模型,定义了严格的分支策略:

• master:始终处于可生产状态
• develop:最新的开发代码
• feature:开发新功能
• release:准备发布
• hotfix:紧急修复

GitHub Flow是一个更简单的模型,适用于持续部署:

• master:始终可部署
• feature:从master创建,通过Pull Request合并回master

GitLab Flow结合了Git Flow和GitHub Flow的优点:

• 使用环境分支(如production、staging)
• 功能分支通过合并请求合并到主分支
• 使用上游分支跟踪部署进度

高级GitLab功能

GitLab的问题跟踪系统允许你:

• 创建和分配问题
• 标记问题和里程碑
• 关联问题与合并请求
• 使用时间跟踪功能

每个GitLab项目都有一个内置的Wiki,用于项目文档:

• 使用Markdown格式
• 版本控制
• 可以克隆Wiki仓库

代码片段允许你分享小段代码:

• 公开或私有
• 支持多种语言语法高亮
• 可以关联到项目

GitLab提供了内置的包注册表,支持:

• Maven
• npm
• PyPI
• NuGet
• Composer
• Conan

GitLab提供了应用程序性能监控功能:

• 性能指标
• 错误跟踪
• 健康检查

总结:回顾核心要点

通过本文的学习,你已经掌握了从零开始使用GitLab进行版本控制的核心技能。让我们回顾一下关键要点:

基础操作

1. 创建和配置GitLab仓库:学会如何在GitLab上创建新项目,并理解项目的基本结构。
2. 配置SSH密钥:通过SSH密钥安全地连接GitLab,提高工作效率和安全性。
3. 基本Git操作:掌握克隆、添加、提交和推送代码的基本命令,这是日常开发的核心技能。

分支管理

1. 创建和使用分支:理解分支的概念,学会创建、切换和合并分支。
2. 合并请求:利用GitLab的合并请求功能进行代码审查和团队协作。
3. 分支策略:了解不同的分支模型(如Git Flow、GitHub Flow),并根据团队需求选择合适的策略。

解决冲突

1. 识别冲突:学会使用Git命令识别冲突文件。
2. 解决冲突:掌握手动解决冲突的方法,确保代码正确合并。
3. 避免冲突:采用最佳实践减少冲突的发生,提高团队协作效率。

CI/CD

1. 理解CI/CD概念:掌握持续集成、持续交付和持续部署的基本原理。
2. 创建Pipeline:学会编写.gitlab-ci.yml文件,定义自动化构建、测试和部署流程。
3. 优化Pipeline:使用缓存、构件和环境变量等工具优化CI/CD流程。

高级技能

1. Git高级命令:掌握变基、暂存、cherry-pick等高级Git命令。
2. GitLab高级功能:利用问题跟踪、Wiki、代码片段等功能提高项目管理效率。
3. 工作流优化:根据团队需求,选择和定制适合的工作流程。

通过不断实践和探索,你将能够熟练运用这些技能,成为团队中的Git专家。记住,版本控制不仅是一种技术工具,更是一种协作哲学。良好的Git实践能够帮助团队更高效地协作,减少错误,提高代码质量。

最后,GitLab和Git都在不断发展,保持学习的态度,关注新功能和最佳实践,将使你在软件开发的道路上走得更远。祝你在GitLab的旅程中取得成功!
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则