Git不是工具,是协作哲学

Git不是工具,是协作哲学------从入门到企业级实践

说起来,上周三下午在望京的星巴克和几个同学吃饭,大家都在吐槽自己团队的Git使用现状。一个在字节的朋友说他们有5个人同时维护一个服务,每天都要花2-3小时解决merge冲突;另一个在创业公司的朋友说他们的commit历史像考古现场,"修复bug"、"update"、"改完了"这样的提交信息比比皆是;还有一个在传统企业的朋友更惨,他们还在用SVN,但最近要迁Git,团队里一半人不知道pull和fetch的区别。

听他们吐槽,我倒是挺有感触的。2019年刚入职第一份工作时,我对Git也特别恐惧。每次push都要祈祷,merge冲突就像拆弹,生怕搞错了就搞崩整个仓库。那时候觉得Git就是个难用的工具,能不用就不用。

直到后来参与过一个5人团队的项目,那个项目让我彻底理解了Git的价值。项目刚开始三个月,代码管理一团糟,每周都要花3-4小时解决冲突,生产环境因为代码合并问题出了3次事故。后来团队花了一周时间规范Git工作流,制定分支策略、commit规范、代码审查流程。奇迹般地,冲突少了,代码质量高了,上线速度反而更快了。那个项目最终上线时的bug率比预期低了40%,这个数据让我有点意外。

为什么会有这么大的差别?因为Git不是工具,是协作哲学。

当团队变大,Git从工具变成"灾难"

Git在2005年由Linus Torvalds创建,最初是为了管理Linux内核开发。它是个分布式版本控制系统,每个开发者都有完整的版本库历史。这意味着什么?意味着你可以离线工作,可以在本地提交代码,不用管远程仓库能不能连上。这种分布式特性,让Git比SVN这种集中式系统更灵活。

但灵活性是双刃剑。个人开发时,Git就是版本管理工具,用add、commit、push、pull就能应付。团队变大,情况就完全不同了。

我见过太多团队因为Git用得不好,把协作搞成灾难:

分支混乱 。有人从main分支拉feature,有人从develop拉hotfix,分支名称也不规范,什么user-login-fix、bugfix-2、feature-xxx-v2,三个月后仓库里有100多个分支,一半已经没人知道是干嘛的。

提交信息混乱 。commit message写"修复bug"、"update"、"改好了",过三个月自己都记不住这次提交改了什么。更糟糕的是,有些人提交前不拉最新代码,一上来就push -f,覆盖了别人的提交,整个团队都要停下来回滚。我之前有个同事就是这么干的,把团队其他人的提交都冲掉了,整个仓库都要强制回滚,后来花了半天时间才恢复。所以记住:永远不要在公共分支用git push -f,除非你真的知道自己在做什么。

冲突频繁 。两个人同时改同一个文件,merge时冲突了,一个人说"我改的逻辑是对的",另一个人说"我的业务需求更紧急",吵架吵到晚上11点,最后还是技术负责人拍板。这样的冲突每天发生,效率可想而知。我见过一个团队,因为冲突解决不了,两个开发者冷战了一个月,最后还是技术总监强制要求他们结对编程才解决。

代码审查流于形式 。创建了PR,但没人认真看,草草点个approve就合并了。或者审查者盯着格式问题不放,空格缩进能讨论半小时,核心逻辑反而没人关注。

这些问题看似是Git的问题,本质是协作问题。Git提供了强大的版本控制能力,但如果没有统一的规范和流程,团队成员各玩各的,Git反而会放大混乱。

Git核心概念:理解分布式版本控制的思想

要真正用好Git,首先要理解它的核心概念。

三个区域:工作区、暂存区、本地仓库

Git有3个核心区域:工作区(Working Directory)、暂存区(Staging Area)、本地仓库(Local Repository)。
图1:Git工作区、暂存区与本地仓库关系图

工作区就是你当前看到和编辑的文件。你在IDE里改的代码,都在工作区。

暂存区是个中间区域,你可以把要提交的修改先放进来。比如你改了3个文件,但只想提交其中2个,就可以把这两个文件add到暂存区,第三个文件留在工作区。这个机制很灵活,让提交更精准。

本地仓库是暂存区提交后的结果,保存在.git目录下。本地仓库有完整的历史记录,你可以随时查看、回滚、创建分支。

理解这三个区域的关系很重要。很多新手搞不清git diff和git diff --cached的区别,前者是工作区和暂存区的差异,后者是暂存区和本地仓库的差异。搞混了,提交的内容就不对。

提交:原子化的代码变更单元

提交(commit)是Git最重要的概念。每次提交都会创建一个快照,记录下当前仓库的状态。提交有唯一的SHA-1哈希值,通过这个哈希值可以精确找到这个提交。

提交应该是"原子的",意思是每个提交只做一件事。比如你修复一个bug,应该是一个提交;你添加一个功能,可能需要多个提交,但每个提交都应该是完整的、可测试的。

糟糕的提交是什么样?把功能开发、bug修复、配置修改、注释更新混在一个提交里。这样的提交很难回滚,很难审查,也很难理解。

我之前见过一个提交,改了20个文件,commit message写"优化代码"。结果后来要回滚,发现这个提交里有个关键bug修复不能回,必须手动挑出来,折腾了一下午。如果当时分开提交,直接revert那个有问题的commit就行。这个教训让我记住了:提交要原子化,每个提交只做一件事。

分支:并行开发的时空通道

分支是Git最强大的特性之一。你可以在任何时间点创建分支,在分支上独立开发,完成后合并回来。这个过程不会影响其他分支。

很多人不理解Git的分支,觉得它是文件的副本。其实Git的分支只是指向某个提交的指针,非常轻量。创建一个分支只需要一个命令,几毫秒就完成了,不占用额外空间。

为什么分支这么重要?因为它让并行开发成为可能。比如你在开发一个需要两周的功能,同时另一个同事在紧急修复线上bug。如果没有分支,你们要么等对方完成,要么互相干扰。有了分支,你可以在feature分支上安心开发,同事在hotfix分支上修复bug,互不影响。

但分支也是双刃剑。分支太多、分支太长、分支不清理,都会造成混乱。我见过一个项目有50多个feature分支,其中30个已经没人维护了,但没人敢删,怕删错了影响别人。这种情况,说明分支策略出问题了。

单人开发工作流:从add到push的完整流程

理解了核心概念,我们来看一个完整的单人开发工作流。

初始化与配置

如果是新项目,需要先初始化仓库:

bash 复制代码
git init

如果是从远程仓库克隆:
图2:常用Git命令操作示例

bash 复制代码
git clone https://github.com/username/repo.git

克隆后,需要配置用户信息,这对团队协作很重要:

bash 复制代码
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"

这个配置会在每次提交时记录是谁提交的,方便追溯。

日常开发流程

一个典型的开发流程是这样的:
图3:团队协作完整流程图

  1. 修改代码 。在工作区编辑文件。

  2. 查看修改 。使用git diff查看具体改了什么。

bash 复制代码
git diff              # 查看工作区和暂存区的差异
git diff --cached     # 查看暂存区和本地仓库的差异
  1. 添加到暂存区 。把要提交的修改add进来。
bash 复制代码
git add filename      # 添加单个文件
git add .             # 添加所有修改
  1. 提交到本地仓库 。写一个清晰的commit message。
bash 复制代码
git commit -m "feat: 添加用户登录功能"
  1. 推送到远程仓库 。把本地提交同步到远程。
bash 复制代码
git push origin main

这个过程看起来简单,但有很多细节需要注意。比如git add的时候,很多人习惯用git add .,但这样会把所有修改都加进去,包括可能不想提交的文件。更好的做法是明确指定要提交的文件,或者使用git add -p交互式选择。

再看commit message,很多人写"update"、"fix bug"、"改完了"。这样的信息三个月后自己都看不懂。业界有个规范叫Conventional Commits,格式是:

bash 复制代码
<type>(<scope>): <subject>

常见的type有:

• feat:新功能

• fix:bug修复

• docs:文档更新

• style:代码格式(不影响功能)

• refactor:代码重构

• test:测试相关

• chore:构建工具或辅助工具变动

比如"feat(auth): 添加JWT token验证",就比"添加登录"清晰多了。

查看历史与回滚

有时候需要查看提交历史或回滚代码。常用的命令有:

bash 复制代码
git log                     # 查看提交历史
git log --oneline           # 简洁显示
git log --graph             # 图形化显示分支合并
git reflog                  # 查看所有操作历史(包括被删除的提交)

如果需要回滚,有几个选择:

bash 复制代码
git reset --hard HEAD~1     # 强制回滚到上一个提交(危险!)
git revert HEAD            # 创建一个新提交撤销上一个提交(安全)
git checkout <commit-hash>  # 查看某个历史版本

reset --hard会彻底删除后面的提交,如果已经push到远程,千万别用!revert会创建一个新提交,把修改"撤销"掉,更安全。我之前有个同事在main分支上用了reset --hard,把团队其他人的提交都冲掉了,整个仓库都要强制回滚,后来花了半天时间才恢复。所以记住:对已经推送的提交,永远用revert,不要用reset。

团队协作模式演进:从混乱到有序

单人开发时,Git就是工具。但团队协作时,Git变成了协作哲学。要实现高效协作,需要建立一套完整的协作模式。

分支策略:选择适合你团队的模式

分支策略是团队协作的基石。不同的项目、不同的团队规模、不同的发布节奏,适合不同的分支策略。

主流的分支策略有四种:Git Flow、GitHub Flow、GitLab Flow、Trunk-Based Development。

Git Flow 是最早也是系统化的分支策略,由Vincent Driessen在2010年提出。它有两个长期分支:master和develop。master分支存放生产环境代码,始终保持稳定可发布状态;develop分支是日常开发主分支,所有新功能先合并到develop。除此之外,还有三种短期分支:feature(功能分支)、release(发布分支)、hotfix(热修复分支)。
图4:Git Flow分支策略图

Git Flow的优点是清晰可控,每个分支职责明确,适合有计划发布周期的项目。但缺点也明显:复杂度高,要维护两个长期分支;很多工具默认用master分支,但实际开发都在develop,经常要切;对于持续交付的项目,master和develop差别不大,没必要搞两个。

GitHub Flow 是GitHub提出的简化版本。它只有一个长期分支:main。所有新功能从main分支拉feature分支,开发完成后通过PR合并回main,然后立即部署。这个流程非常简单,适合小团队和频繁发布的项目。

GitHub Flow的核心理念是:main分支永远是可部署的。所有提交必须通过代码审查和CI测试才能合并到main。这保证了代码质量和稳定性。

GitLab Flow 是GitLab提出的改进版本,它吸取了Git Flow和GitHub Flow的优点。核心原则是"上游优先"(Upstream First):所有代码变更必须先从主分支(main)流入,再通过自动化流程同步到下游环境。

GitLab Flow支持两种模式:持续发布和版本发布。持续发布模式为不同环境创建分支(如staging、production),代码从main流向staging,再流向production。版本发布模式为每个稳定版本创建长期分支(如2-3-stable、2-4-stable),只有bug修复才会合并到这些分支。这种模式适合有多个环境部署的项目。

Trunk-Based Development 是极简策略,强调"所有代码都放在主分支"。开发者可以直接提交到main,或者使用短生命周期分支(几小时或几天),快速合并回来。这个策略需要完善的CI/CD支撑,要求频繁提交、持续集成、深度代码审查。Google、Facebook、Netflix这样的公司在用。

这四种策略没有绝对的好坏,要看团队情况。我的建议是:

• 小团队、持续部署、频繁发布:用GitHub Flow

• 中大型团队、多环境部署:用GitLab Flow

• 有明确发布周期、版本管理严格:用Git Flow

• 实践持续集成、高频提交:用Trunk-Based

代码审查:从形式主义到质量保障

代码审查(Code Review)是团队协作中最容易被忽视的环节。很多人觉得代码审查就是走个流程,随便看看就approve了。但根据Microsoft的研究,认真做代码审查能拦截60%-70%的缺陷。这个数据还挺猛的,相当于你少修了一半以上的bug。

一个有效的代码审查流程是这样的:
图5:代码审查流程示意图

第一步:创建PR/MR 。开发完成后,推送feature分支到远程,在GitHub/GitLab上创建Pull Request(PR)或Merge Request(MR)。PR标题要清晰,比如"feat: 添加用户登录功能"。描述要包含:功能说明、测试步骤、关联Issue。

第二步:指定审查者 。不要自己review自己,最好交叉审查。比如A和B互审,这样大家都能看到对方的代码,知识共享效果好。

第三步:执行审查 。审查者关注以下几个方面:

• 业务逻辑是否正确?功能是否按需求实现?

• 代码结构是否合理?是否有重复代码、过长函数、过深嵌套?

• 安全性是否有问题?SQL注入、XSS攻击、敏感信息泄露等。

• 性能是否有隐患?N+1查询、不必要的循环、内存泄漏等。

• 测试覆盖率是否足够?单元测试、集成测试、边界测试是否覆盖。

• 代码风格是否符合团队规范?命名、注释、格式是否统一。

第四步:反馈与修改 。审查者提出意见,开发者根据反馈修改代码,再次提交,直到所有问题都解决。这个过程可能需要几轮往返,要有耐心。

第五步:合并 。所有审查者approve后,CI测试通过,就可以合并了。合并方式有三种:

• Merge commit:创建一个合并提交,保留完整历史

• Squash merge:将多个提交压缩为一个,保持主分支历史整洁(推荐)

• Rebase:变基,保持线性历史

对于feature分支,推荐用squash merge,把开发者本地的多个提交压缩成一个清晰、可理解的提交,合并到main分支。

代码审查的注意事项

• PR不要太大,超过500行的代码很难认真审查。我的经验是控制在200-400行,一个功能拆成多个小PR。

• 不要纠结格式问题。空格、缩进这种可以自动化检查的问题,用lint工具解决,不要在review里浪费时间。

• 及时反馈。收到PR后24小时内要给出反馈,否则开发者的工作流会阻塞。

• 正向反馈。除了指出问题,也要肯定写得好的地方。代码审查不是挑刺,是共同提升。

冲突解决:从噩梦到可控

代码冲突是每个开发者最头疼的问题。但冲突不是坏事,是Git提醒你:这里有分歧,需要你手动处理。

冲突通常发生在三个场景:merge分支、rebase分支、pull远程代码。Git的三向合并算法会对比三个版本:本地版本(HEAD)、远程版本(目标分支)、共同祖先版本(Base)。如果同一行在本地和远程都被修改,Git无法自动决定保留哪个,就会提示冲突。

一个完整的冲突解决流程是这样的:
图6:Git冲突解决步骤流程图

第一步:识别冲突文件

bash 复制代码
git status

Git会列出所有冲突的文件,标记为"both modified"。

第二步:查看冲突内容

打开冲突文件,你会看到特殊标记:

bash 复制代码
<<<<<<< HEAD
你的代码
=======
别人的代码
>>>>>>> feature-branch

<<<<<<< HEAD到=======是本地代码,=======到>>>>>>> feature-branch是远程代码。

第三步:手动解决冲突

根据业务需求,选一个:

• 保留本地代码

• 保留远程代码

• 手动合并,把两者的关键部分都保留

现代IDE(VS Code、IntelliJ IDEA)会提供可视化工具,点个按钮就能选择保留哪个版本,很方便。但我建议新手还是手动看一遍冲突,理解发生了什么,不要盲目点按钮。

第四步:标记冲突已解决

bash 复制代码
git add filename

告诉Git这个文件的冲突已经解决了。

第五步:提交合并结果

bash 复制代码
git commit -m "fix: resolve merge conflict in UserService"

Git会自动生成合并提交信息,也可以自定义。

第六步:验证测试

冲突解决后,一定要跑测试、启动应用验证,确保功能正常。很多人这一步偷懒,结果合并后出问题,又要重新回滚。

预防冲突比解决冲突更重要 。几个有效的预防措施:

• 小步提交,减少冲突范围。每天至少commit一次,不要累积一周再提交。

• 频繁拉取最新代码。每天早上第一件事就是git pull --rebase,同步远程变更。

• 定期merge主分支到feature分支。如果feature分支开发周期较长(超过3天),每隔两天就merge一次main,避免偏离太远。

• 明确分支职责。多人同时改同一个文件时,先沟通一下,避免重复劳动。

• 使用rebase代替merge。git pull --rebase保持历史线性,减少不必要的合并提交。

我见过一个团队,实施这些预防措施后,冲突解决时间从平均4.2小时缩短到1.5小时,效率提升近65%。这个数据说明,规范的使用习惯比冲突解决技巧更重要。

进阶技巧:从工具到自动化

掌握了基础概念和协作模式,就可以学习一些进阶技巧,把Git玩得更溜。

Git Hooks:自动化你的工作流

Git Hooks是一些脚本,在Git的特定事件发生时自动执行。比如pre-commit hook在提交前执行,可以检查代码格式、运行测试;post-commit hook在提交后执行,可以发通知给团队;pre-push hook在推送前执行,可以检查提交是否满足规范。

常用的hooks有:

• pre-commit:提交前检查(代码格式、静态分析)

• pre-push:推送前验证(测试通过、无敏感信息)

• commit-msg:提交信息规范检查

• post-merge:合并后执行(依赖安装、数据库迁移)

一个典型的pre-commit hook示例:

bash 复制代码
#!/bin/sh
# 运行ESLint检查代码格式
npm run lint
# 运行测试
npm test

把这个文件放在.git/hooks/pre-commit,并加上执行权限(chmod +x .git/hooks/pre-commit),每次提交前都会自动运行lint和测试。如果检查失败,提交会被阻止。

除了手写hooks,还可以用工具。husky是Node.js项目的流行工具,可以方便地配置git hooks。lint-staged可以只检查本次修改的文件,而不是整个项目,速度更快。

子模块:管理外部依赖

子模块(Submodules)用于将一个Git仓库嵌入另一个Git仓库。比如你的项目依赖一个第三方库,但这个库是独立维护的,或者你的项目需要共享一个公共代码库,子模块就派上用场了。

基本操作:

bash 复制代码
# 添加子模块
git submodule add https://github.com/user/repo.git path/to/submodule

# 初始化子模块
git submodule init

# 更新子模块
git submodule update

# 克隆带子模块的仓库
git clone --recursive https://github.com/user/repo.git

子模块的优势是每个子模块是独立的仓库,有自己的提交历史和版本。但缺点是使用起来比较复杂,很多新手会被绕晕。我的建议是:如果没有明确需求,不要用子模块。如果只是依赖第三方库,用包管理工具(npm、pip、maven)就好。只有当需要修改子模块代码,或者需要精确控制子模块版本时,才考虑用子模块。

CI/CD集成:从手动到自动化

持续集成(CI)和持续部署(CD)是现代软件开发的标配。Git作为版本控制核心,天然支持与CI/CD平台集成。

GitHub Actions是GitHub内置的CI/CD工具,配置简单,使用方便。
图7:GitHub Actions CI/CD自动化流水线

一个典型的CI配置(.github/workflows/ci.yml):

bash 复制代码
name: CI

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Set up Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '18'
    - name: Install dependencies
      run: npm install
    - name: Run tests
      run: npm test
    - name: Build
      run: npm run build

这个配置会在每次push到main/develop分支、或者创建PR到main分支时,自动触发:检出代码 → 安装依赖 → 运行测试 → 构建项目。如果任何一步失败,PR就不能合并。

CD配置可以在此基础上增加部署步骤:

bash 复制代码
jobs:
  deploy:
    needs: test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    steps:
    - uses: actions/checkout@v3
    - name: Deploy to production
      run: |
        # 部署命令,比如scp到服务器,或者调用云平台API
        scp -r dist/* user@server:/var/www/app

CI/CD集成的价值在于自动化和一致性。每次提交都自动测试,减少了人工疏忽;每次部署都按统一流程,减少了环境差异。实施CI/CD后,某电商团队的发布错误率从12%降至1.3%,这个数据还挺猛的。

但CI/CD不是银弹。如果团队没有规范的开发流程,没有清晰的代码审查,没有足够的测试覆盖,CI/CD只是把问题暴露得更早,而不是解决问题。所以要在建立规范的基础上,再用CI/CD来提升效率。

最佳实践总结与学习资源推荐

最后,我总结了一些Git团队协作的最佳实践,可以作为团队的行动指南。

分支管理规范

• 分支命名规范:

◦ feature/功能描述

◦ bugfix/问题描述

◦ hotfix/问题描述(紧急修复)

◦ release/版本号(发布分支)

• 分支生命周期:

◦ 功能分支合并后立即删除

◦ 发布分支发布完成后删除

◦ hotfix分支修复完成后删除

◦ 定期清理已合并的远程分支

• 分支保护:

◦ main/develop分支设置保护规则,禁止直接push

◦ 强制要求通过代码审查才能合并

◦ 强制要求CI测试通过才能合并

提交规范

• 遵循Conventional Commits格式

• 提交应该原子化,每个提交只做一件事

• 提交信息应该清晰,三个月后自己能看懂

• 提交前先拉取最新代码,减少冲突

• 对已推送的提交永远用revert,不要用reset --hard

代码审查规范

• PR大小控制在200-400行,过大时拆分成多个小PR

• 交叉审查,避免自我审查

• 审查者关注逻辑、安全、性能,不要纠结格式

• 及时反馈,收到PR后24小时内给出意见

• 正向反馈,肯定写得好的地方

• 审查通过后用squash merge,保持主分支历史整洁

团队协作规范

• 定期同步代码,每天至少一次git pull --rebase

• 修改公共文件前先沟通

• 遇到冲突先理解再解决,不要盲目保留一方

• 定期开展Git培训,新人入职要有Git入门手册

• 每季度做一次Git健康度评估,检查:

◦ 是否按时完成PR审查?平均耗时多少?

◦ 是否有大量未清理的废弃分支?

◦ CI失败率是否持续下降?

◦ 提交频率与功能产出是否匹配?

学习资源推荐

官方文档

• Git官方文档:https://git-scm.com/doc

• GitHub文档:https://docs.github.com

• GitLab文档:https://docs.gitlab.com

可视化学习

• Learn Git Branching:https://learngitbranching.js.org/

• 这个网站用可视化方式教Git分支操作,非常直观,适合新手入门

书籍

• 《Pro Git》:Scott Chacon,Git官方推荐书籍,在线免费阅读

• 《Git团队协作》:基于企业实战场景,系统讲解团队协作

工具推荐

• SourceTree:免费的图形化Git客户端,适合新手

• GitKraken:跨平台Git客户端,界面友好

• VS Code + GitLens:VS Code内置Git工具,GitLens增强功能

最佳实践参考

• Google工程实践:https://google.github.io/eng-practices/review/

• Netflix的Git工作流:参考他们的开源项目

• 各种开源项目的CONTRIBUTING文档:看看别人怎么规范流程

最后

回到开篇的话题,Git不是工具,是协作哲学。

工具的目的是解决问题,而哲学的目的是规范行为。Git提供了强大的版本控制能力,但如何用好这个能力,取决于团队的规范和文化。

我见过太多团队,花了很多时间学习Git命令,却忽视了协作流程的建设。结果命令学得再溜,团队协作还是一团糟。反过来,一些团队可能记不住所有命令,但有清晰的分支策略、严格的代码审查、规范的提交习惯,协作效率反而很高。

所以,Git团队协作的核心不是学命令,是建规范。规范不是约束,是共识。团队成员对"应该怎么做"达成一致,协作就会顺畅。

这个过程需要时间,需要磨合,需要持续改进。但一旦形成,收益是巨大的。代码质量提升了,bug减少了,上线速度加快了,团队协作更顺畅了。这些不是Git工具本身带来的,是规范的Git工作流带来的。

所以,如果你所在的团队Git使用混乱,不要急着学更多命令,先停下来,问问自己:我们有统一的分支策略吗?有规范的代码审查吗?有清晰的提交信息格式吗?有定期同步的习惯吗?

如果有,很好,继续优化。如果没有,那就从这些基础做起。

Git不难,难的是协作哲学。但这正是它有价值的地方。

相关推荐
生活很暖很治愈3 小时前
Linux基础开发工具
linux·服务器·git·vim
极地星光5 小时前
如何使用 Git 实现 revert
git
厨 神5 小时前
IFLOW-Git-Claude
git·cloudera
ghostwritten11 小时前
git 发布版本
git
无限进步_12 小时前
206. 反转链表 - 题解与详细分析
c语言·开发语言·数据结构·git·链表·github·visual studio
是店小二呀13 小时前
Git远程仓库操作:从入门到精通的协作指南
git
每天要多喝水14 小时前
git常用命令
git
哪里不会点哪里.14 小时前
Git 入门与常用操作总结
git
Jo乔戈里15 小时前
Git学习自用笔记
笔记·git·学习