初识Git,带你深入学习Git相关的知识
在之前的博客中我都会在博客的开头放一个gitee的链接。Gitee是什么呢它是一个远程的代码托管库。在我们学习和项目管理的时候起着非常重要的作用。本期我就带领着大家一起学习Git相关的知识内容。学习它的操作了解其在企业级开发中的作用目录Git初识Git安装CentosUbuntuGIt初始化与配置初始化配置用户信息并查看Git区块划分Git相关的操作修改并增加文件版本回退撤销修改删除文件Git提交日志的规范专业的日志结构模型核心提交类型 (Type) 详解日志原则示例Git分支管理如何理解分支分支的基本操作创建分支切换分支删除分支合并冲突和冲突解决合并的两种方式合并冲突的四种解决方案方案一手动解决最常用方案二使用 --ours 或 --theirs 策略方案三通过 Rebase 解决方案四中止合并重新规划Bug分支Git远程操作理解分布式远程管理系统创建远程仓库在平台上创建空仓库将本地仓库与远程关联克隆远程仓库HTTPS vs SSHHTTPS 方式SSH 方式HTTPS 与 SSH 的切换推送与拉取推送push拉取pull vs fetch忽略特殊文件.gitignore.gitignore 的创建与作用全局 .gitignore配置命令别名分布式协作的最佳实践Git标签管理标签的本质两种标签类型操作标签——资深工程师的实践指南创建标签核心原则信息完备性2. 查看与筛选标签3. 删除标签谨慎操作4. 基于标签创建分支紧急修复场景推送标签——协同开发的核心要点推送单个标签推送所有本地标签标签的拉取与同步典型工作流CI/CD中的标签驱动发布资深工程师的实战经验总结核心原则Git指令总结1. 初始与配置2. 基本快照日常核心3. 分支管理4. 远程协同5. 历史查看与追溯6. 标签管理版本发布7. 临时保存与整理8. 高级与修复Git初识在企业项目运营中面对几十个人甚至几百人的同时写的代码、技术文档不同人写不同的副本就会诞生几十个甚至几百个副本我们怎么知道他们分别改了哪些内容呢而且这些内容哪些被修改了哪些没有被修改哪个版本需要测试哪个版本需要上线如果只依赖最原始的压缩包和目录来区分这件事那项目管理简直就是灾难。因此企业中不可避免的引入了一个重要的东西——版本控制器。而在版本控制器中最经典的就属两类——Git和SVN。我们以Git为主题深入讲解Git安装Git 在大多数 Linux 发行版中默认没有预装需要主动安装。下面分别给出 CentOS 和 Ubuntu 下的安装方法。Centos# CentOS 7 sudo yum install -y git # CentOS 8 / Rocky Linux / AlmaLinux sudo dnf install -y gitUbuntusudo apt update sudo apt install -y gitGIt初始化与配置初始化git init作用在当前目录创建一个新的 Git 仓库生成.git子目录。配置用户信息并查看配置设置git config --global user.name Your Name git config --global user.email your.emailexample.com作用设置全局用户名和邮箱每次提交时会记录这些信息。--global表示全局配置影响当前用户的所有仓库若只针对某个仓库去掉--global并在仓库内执行。查看配置git config --list查看所有的Git配置Git区块划分我们虽然是利用Git进行版本管理但是并不能直接修改.git中的文件Git严禁这么做。那么我们就只能在我们本地的目录中修改。这就牵扯到我们的Git区块划分了工作区专业定义工作区是对项目中某个特定版本的本地检出Checkout。它是从 Git 仓库的压缩数据库中提取出来供你在磁盘上修改的实际文件。底层逻辑处于“非受控”状态。Git 此时只作为观察者通过文件系统的mtime修改时间和文件大小来感知变化但并不真正持有这些数据。暂存区专业定义暂存区在物理上表现为.git/index文件。它是一个二进制索引文件记录了即将进入下一个提交的所有文件路径及其对应的 Blob 对象 ID。底层逻辑它是工作区与版本库之间的缓冲层Buffer。Git 独特于 SVN 或 Mercurial 的地方就在于此——它允许开发者对提交进行“原子化打包”。版本库专业定义版本库是 Git 存储所有元数据和对象数据库的地方即.git目录。它包含了完整的有向无环图 (DAG)结构。底层逻辑基于内容寻址Content-Addressable Storage。每一个进入版本库的文件都会被压缩并计算 SHA-1 哈希值形成不可变的 Blob、Tree 和 Commit 对象。Git相关的操作修改并增加文件新增文件到暂存区git add file_name # 暂存单个文件 git add . # 递归暂存当前目录下所有变更提交修改日志日志建议好好写不要写无关的内容这是为了符合开发规范并且方便理解git commit -m feat: 明确的提交说明版本回退当你发现整个方向都错了或者最近几次提交导致了生产事故你需要用到git reset。git reset有多种模式你需要根据需求精确选择模式模式表达式影响范围使用场景--softgit reset --soft HEAD~1只移动版本库指针。暂存区和工作区内容不变。仅仅是想合并多次 commit或者重写提交注释。--mixedgit reset HEAD~1**默认**移动指针并重置暂存区。工作区内容保留。想把暂存的代码拿回来重新整理再提交。--hardgit reset --hard HEAD~1全部重置。版本库、暂存区、工作区全部回到上一个版本。危险操作彻底放弃当前所有未提交的工作回到过去。撤销修改这是日常操作中最频繁的部分。根据代码所处的区域不同撤销的方式完全不同。场景 A修改了代码还没执行git add撤销工作区的修改git restore file_name场景 B执行了git add想撤回暂存区回到工作区代码还在git restore --staged file_name场景 C刚执行了git commit发现注释写错了git commit --amend -m 正确的提交说明删除文件删除文件在 Git 中有两种语境取决于你是否还想在磁盘上保留它。#彻底删除工作区和暂存区同步删除 git rm file_name git commit -m delete: 移除不再使用的配置文件 #只从仓库移除保留本地文件常用于误提交了 .env 或大文件 git rm --cached file_nameGit提交日志的规范实际开发中Git的日志是至关重要的一套专业的 Git 日志规范本质上是为了给未来的自己和同事留下一份清晰的“系统演进备忘录”。目前业界公认的标准是Conventional Commits约定式提交专业的日志结构模型一个标准的、高质量的 Commit Message 应该包含三个部分Header标题、Body正文和Footer脚注。type(scope): subject // 空一行 body // 空一行 footerHeader (必填)这是最重要的部分通常限制在50 个字符以内。Type: 本次提交的类型见下表。Scope: 可选表示受影响的范围如auth,database,ui。Subject: 简短描述。职业建议使用祈使句如 Add 而不是 Added且末尾不加句号。Body (选填)详细说明修改的动机以及与旧版本的对比。重点解释“为什么要改”而不是“怎么改”代码本身会说明怎么改。Footer (选填)用于放置破坏性改动BREAKING CHANGE说明或关联 Issue如Closes #123。核心提交类型 (Type) 详解这是规范的灵魂。通过 Type我们一眼就能看出这次变更是增加了功能、修复了 Bug 还是仅仅优化了格式。类型 (Type)语义使用场景feat新功能 (Feature)引入了新逻辑、新界面或新接口。fix修复 Bug修正了已知的缺陷或异常。docs文档变更仅仅修改了 README、API 文档或代码注释。style格式优化不影响逻辑的变动如空格、分号、格式化、缺少分号等。refactor代码重构既不是新增功能也不是修 Bug而是优化了内部结构。perf性能提升优化算法或逻辑以提高运行效率。test测试用例新增或修改单元测试、集成测试。chore杂务构建流程、依赖管理如更新 npm 包、CI/CD 配置变更。revert回滚撤销之前的某个提交。日志原则原子性提交一个 Commit 只做一件事。如果你修了 Bug 又顺手重构了代码请拆分成两个 Commit。50/72 原则标题不超过 50 字符正文每行不超过 72 字符为了在终端和各种 Git 工具中完美显示。禁止空信息永远不要为了省事使用git commit -m .。关联 Issue如果是为了解决某个需求或 Bug 任务务必在 Footer 加上 ID。示例新增功能feat(auth): add google oauth2 login support修复 Bugfix(api): resolve memory leak in user streaming endpoint破坏性改动重大更新feat(api): change user profile response structure BREAKING CHANGE: The address field is now an object instead of a string.重构与性能优化refactor(db): optimize query logic for large datasetsGit分支管理如何理解分支Git中分支的存在就像平行宇宙一样不同宇宙的你正在进行着不同的活动最后合并在一起Git 的默认主分支叫main或master。当你创建一个新分支dev时Git 只是新建了一个指针指向当前最新的提交。为什么它高效无论你的代码库有 1GB 还是 10GB创建一个分支的操作只需要几毫秒因为它只增加了一个 41 字节的文件存放 SHA-1 哈希值。可以靠以下方式查看# 查看当前分支指向的提交 cat .git/refs/heads/master # 输出e4a3b5c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3分支的基本操作作为专业开发者建议尽早习惯git switch命令Git 2.23 引入它比老旧的checkout语义更明确。创建分支# 创建分支停留在当前分支 git branch feature/payment # 创建并切换到新分支 git checkout -b feature/payment # 或使用较新的命令 git switch -c feature/payment老程序员建议分支命名要有规范。我经历过太多“fix”、“test”这样的分支名带来的混乱。推荐使用/分隔的层级结构type/scope-description如feature/user-auth、hotfix/critical-bug-1234。切换分支git checkout feature/payment # 或 git switch feature/payment切换分支时Git 会做三件事更新工作目录的文件以匹配目标分支的最新提交更新暂存区移动 HEAD 指针一个常见的坑工作区有未提交的修改时无法切换分支。这时可以用git stash临时保存。删除分支# 删除已合并的分支 git branch -d feature/payment # 强制删除未合并的分支慎用 git branch -D feature/experiment我的原则分支一旦完成使命立即删除。保持仓库的整洁是一个老程序员的职业素养。合并冲突和冲突解决合并是分支操作中最容易出问题的地方。在我二十年的职业生涯中合并冲突是导致生产事故的主要原因之一。合并的两种方式Fast-forward 合并当目标分支是源分支的直接上游时Git 只需移动指针。这是最理想的情况。git merge feature/payment # 输出Fast-forwardThree-way 合并当分支出现分叉时Git 会创建一个新的“合并提交”将两个分支的历史串联起来。合并冲突的四种解决方案当两个人修改了同一文件的同一区域时冲突就产生了。这时我们有四种选择方案一手动解决最常用适用场景复杂的逻辑冲突需要人工判断代码的正确性。# 1. 查看冲突文件 git status # 2. 编辑冲突文件删除 、、 标记保留最终代码 # 3. 标记为已解决 git add conflicted_file.java # 4. 完成合并 git commit实战建议使用git mergetool可以启动可视化合并工具如 vimdiff、meld比手动编辑更直观。方案二使用--ours或--theirs策略适用场景确定某一方的修改完全正确另一方可以全部丢弃。# 完全保留当前分支的版本 git merge --strategy-optionours feature/payment # 完全保留被合并分支的版本 git merge --strategy-optiontheirs feature/payment注意--ours和--theirs的含义在git merge和git rebase中是相反的这是 Git 设计中的一个经典陷阱。方案三通过 Rebase 解决适用场景希望在合并前保持线性历史避免合并提交。git checkout feature/payment git rebase main # 解决冲突后 git add . git rebase --continue我的观点公共分支用 merge私有分支用 rebase。在团队共享的分支上使用 rebase 会改写历史这是要坚决避免的。方案四中止合并重新规划适用场景冲突过于复杂或者发现合并的方向本身就有问题。git merge --abortBug分支它是一种临时性的辅助分支专门用于修复生产环境或测试中发现的特定缺陷Issue。诞生场景与工作流假设你正在feature分支写新功能写到一半老板跑过来说“线上有个紧急 Bug现在就得修”。保存现场你现在的代码没写完不能提交。执行git stash把工作区暂存起来。建立 Bug 分支回到main分支开一个新分支fix-issue-101。git switch maingit switch -c fix-issue-101修复并合并修完后提交并合并回main然后上线。恢复现场删除 Bug 分支回到feature分支执行git stash pop取回你之前写到一半的代码。Git远程操作理解分布式远程管理系统Git 与 SVN 的根本区别。这不仅仅是一个工具的选择而是一种思维的转变。SVN集中式一个中央服务器所有人的提交都必须经过它。你在本地工作每次操作几乎都要联网。服务器挂了所有人都无法提交、无法查看历史。Git分布式每个开发者的本地都拥有一个完整的仓库——包含完整的历史记录、所有分支、所有标签。远程仓库只是大家约定的“官方同步点”而不是唯一的真相源。我的理解是Git 本质上是一个“对等网络”系统。每个本地仓库都是完整的节点远程仓库只是其中一个被大家认可的“权威节点”。你可以离线提交、离线查看历史、离线创建分支等到有网络时再与其他节点同步。这种设计给了开发者极大的自由但也要求我们必须理解“同步”的真正含义。创建远程仓库远程仓库通常托管在 GitHub、GitLab、Gitee 等平台上也可以在自建服务器上创建。这里我以 GitHub 为例。在平台上创建空仓库登录 GitHub点击“New repository”填写名称、描述注意不要勾选“Initialize this repository with a README”除非你想创建一个带初始内容的仓库。通常我们推荐先在平台上创建空仓库然后从本地推送上去这样避免后续合并冲突。选择公开或私有根据项目性质定。创建完成后平台会给出两种方式的地址HTTPS 和 SSH。下面我会详细讲它们的区别。将本地仓库与远程关联如果你已经有了本地仓库需要把它和远程仓库关联起来bash# 添加远程仓库命名通常为 origin这是惯例 git remote add origin https://github.com/username/repo.git # 查看远程仓库配置 git remote -vorigin只是一个名字你可以叫任何名字但origin是全世界 Git 开发者的默认约定。如果你有多个远程比如从多个地方拉取可以起不同的名字。克隆远程仓库HTTPS vs SSH克隆是获取远程仓库完整副本的操作git clone repository-urlHTTPS 方式地址形如https://github.com/username/repo.git优点无需额外配置只要有账号密码或个人访问令牌即可在公司防火墙环境下通常更稳定因为 SSH 端口可能被封缺点每次 push 都需要输入用户名和密码除非配置凭证缓存需要配置个人访问令牌PAT因为 GitHub 已禁用密码认证配置凭证缓存避免重复输入# 缓存 15 分钟 git config --global credential.helper cache # 永久存储明文不安全 git config --global credential.helper store更推荐使用 SSH 方式。SSH 方式地址形如gitgithub.com:username/repo.git原理基于公钥加密。你生成一对密钥公钥和私钥把公钥添加到远程平台私钥留本地。通信时通过密钥对验证身份无需每次输入密码。配置步骤老程序员的标准化流程# 1. 生成 SSH 密钥如果还没有 ssh-keygen -t ed25519 -C your_emailexample.com # 或使用 RSA ssh-keygen -t rsa -b 4096 -C your_emailexample.com # 2. 启动 ssh-agent 并添加私钥 eval $(ssh-agent -s) ssh-add ~/.ssh/id_ed25519 # 3. 查看公钥并复制到剪贴板 cat ~/.ssh/id_ed25519.pub # 在 GitHub/GitLab 的 Settings - SSH and GPG keys 中添加 # 4. 测试连接 ssh -T gitgithub.com # 输出Hi username! Youve successfully authenticated...我的建议团队开发一律使用 SSH。安全、方便而且避免了令牌过期的问题。我在二十年的经验中SSH 是最稳定的远程认证方式。HTTPS 与 SSH 的切换如果你想将现有 HTTPS 仓库改为 SSHgit remote set-url origin gitgithub.com:username/repo.git推送与拉取推送push推送是将本地分支的提交上传到远程仓库并更新远程分支指针。# 推送当前分支到远程同名分支如果远程没有则创建 git push origin branch-name # 设置上游关联第一次推送时常用 git push -u origin feature/payment # -u 是 --set-upstream 的简写之后可以直接 git push # 删除远程分支 git push origin --delete feature/old-branch注意git push默认只推送当前分支除非配置了push.default。如果你想让所有本地分支都推送需谨慎。拉取pull vs fetch很多初学者混淆pull和fetch。我这样解释git fetch从远程下载新的提交到本地仓库但不合并到当前工作区。它只是更新了远程跟踪分支如origin/main让你看到远程的变化但你的工作区不变。git pullgit fetchgit merge。它会下载并尝试合并到当前分支。为什么我强烈建议新手多用 fetch因为pull会自动合并可能在你不知情的情况下产生合并冲突。而fetch后你可以先查看差异再决定如何合并bashgit fetch origin git log HEAD..origin/main # 查看远程比本地多了哪些提交 git diff HEAD origin/main # 查看差异内容 git merge origin/main # 确认无误后再合并老程序员的黄金法则在推送前先 fetch 并检查再合并最后推送。这能避免 90% 的“冲突风暴”。忽略特殊文件.gitignore每个项目都有一些文件不应该提交到版本库比如编译产物.class,.exe依赖目录node_modules/本地配置文件.env,config.local.js操作系统生成文件.DS_Store.gitignore 的创建与作用在仓库根目录创建.gitignore文件写入要忽略的模式# 忽略所有 .log 文件 *.log # 忽略 node_modules 目录 node_modules/ # 忽略 .env 文件但保留 .env.example .env !.env.example # 忽略特定文件 config/local.phpGit 会依据这些规则让被忽略的文件永远不被跟踪。常见陷阱如果一个文件已经被跟踪已 commit再添加到.gitignore不会自动删除它。你必须先停止跟踪bashgit rm --cached config/local.php团队应该共享同一个.gitignore避免因人而异导致的问题。全局 .gitignore如果你有一些个人工具的临时文件不想污染每个项目的.gitignore可以设置全局忽略git config --global core.excludesfile ~/.gitignore_global echo .DS_Store ~/.gitignore_global配置命令别名二十年的经验告诉我频繁输入长命令是效率的杀手。Git 允许你为常用命令设置别名大大提升日常操作速度。# 基本别名 git config --global alias.co checkout git config --global alias.br branch git config --global alias.ci commit git config --global alias.st status # 更强大的组合别名 git config --global alias.lg log --oneline --graph --all --decorate git config --global alias.unstage reset HEAD -- git config --global alias.last log -1 HEAD # 查看所有别名 git config --global --get-regexp alias配置后你可以这样使用git co feature/login # 等价于 git checkout feature/login git st # 等价于 git status git lg # 漂亮的图形化日志我的个人推荐git lg几乎是我每天使用最频繁的命令图形化日志让你一眼看清分支结构git unstage用于撤销git add很实用分布式协作的最佳实践结合二十年的团队管理经验我总结了几条铁律远程 master/main 分支永远是稳定的。所有提交到主分支的代码必须经过 code review 和 CI 测试。推送前必须同步。git pull --rebase是我推荐的方式它能保持线性历史避免无意义的合并提交。但要注意--rebase不应在公共分支上使用如 main。git pull --rebase origin main # 拉取并变基保持历史整洁不要强制推送force push到公共分支。git push --force会覆盖远程历史导致其他团队成员陷入混乱。如果必须修正历史使用--force-with-lease它会更安全会检查远程是否有你未拉取的更新。远程仓库是团队的“契约”。提交的 message 要清晰遵循约定式提交Conventional Commits能让自动化 changelog 生成变得简单。定期清理远程分支。合并后及时删除远程分支保持仓库清爽git push origin --delete feature/mergedGit标签管理标签Tag是Git中用于为特定提交commit打上“里程碑”标记的引用类型。它就像一本书的ISBN号或者软件版本的封底标注——一旦发布就永远指向同一个提交不会像分支那样随着新提交而移动。标签的本质静态指针标签一旦创建永远指向某个固定的commit hash可读性标识用v1.2.3、release-2024-01-15等人类可读的名称替代a3b2c1d...这种哈希值版本锚点是版本发布、回滚、基线追溯的核心依据两种标签类型类型特点使用场景轻量标签Lightweight Tag仅是一个指向commit的指针不包含额外元数据临时标记、个人开发过程中的快速标记附注标签Annotated Tag完整的Git对象包含打标签者、时间、注释可被GPG签名正式发布版本、需要追溯审计的场景# 轻量标签 git tag v1.0.0 # 附注标签推荐生产环境使用 git tag -a v1.0.0 -m Release version 1.0.0: 新增用户认证模块修复内存泄漏问题操作标签——资深工程师的实践指南创建标签核心原则信息完备性# 针对当前HEAD创建附注标签推荐 git tag -a v1.2.0 -m FEAT: 支持分布式事务; FIX: 修复高并发下的死锁问题 # 针对历史提交打标签 git tag -a v1.1.0 9fceb02 -m HOTFIX: 紧急修复生产环境数据一致性bug # 为标签添加GPG签名企业级安全要求 git tag -s v1.2.0 -m Release v1.2.0 # 需先配置gpg-key专业建议生产发布的标签必须使用附注标签携带完整变更日志标签命名遵循语义化版本规范vmajor.minor.patch[-pre-release]历史追溯时git show v1.2.0能立即看到是谁、何时、为何打这个标签2. 查看与筛选标签# 列出所有标签默认按字母序 git tag # 按模式筛选正则匹配 git tag -l v1.2.* # 查看标签详细信息 git show v1.2.0 # 显示标签元数据 指向的commit内容 # 查看标签指向的commit不展开diff git rev-parse v1.2.0^{commit}3. 删除标签谨慎操作# 删除本地标签 git tag -d v1.0.0-rc1 # 删除远程标签需要两步 git push origin :refs/tags/v1.0.0-rc1 # 方式一推送空引用 git push origin --delete v1.0.0-rc1 # 方式二显式删除重要删除已推送的标签属于破坏性操作需确保所有协作者知晓并同步清理本地标签。4. 基于标签创建分支紧急修复场景# 从历史版本拉出修复分支 git checkout -b hotfix/v1.1.1 v1.1.0 # 修复bug后打新补丁标签 v1.1.1 git tag -a v1.1.1 -m HOTFIX: 修复XX漏洞推送标签——协同开发的核心要点推送单个标签git push origin v1.2.0推送所有本地标签git push origin --tags警告--tags会推送所有本地标签包括调试用的临时标签。企业级实践应避免使用此命令改用显式推送。标签的拉取与同步# 拉取远程标签但不自动更新本地已存在的同名标签 git fetch origin --tags # 强制更新本地标签以匹配远程团队协作必备 git fetch origin --tags --force典型工作流CI/CD中的标签驱动发布# 示例GitLab CI 基于标签自动发布 release-job: only: - tags script: - echo Building release for $CI_COMMIT_TAG - ./build.sh - ./publish.sh专业建议在团队中约定只有集成负责人或发布经理才有权限推送标签使用Git Hooks如pre-push校验标签命名规范生产环境标签必须通过CI/CD流水线自动创建避免人工直接推送资深工程师的实战经验总结场景错误做法正确做法版本发布使用轻量标签附注标签 GPG签名标签命名final、test1等无意义名称v2.1.0-rc.3遵循语义化版本推送标签git push --tags推送全部显式推送每个正式标签删除标签直接git tag -d后忘记同步远程先删远程再删本地并通知团队历史回溯只记版本号不记commit每个版本标签关联changelog文件核心原则标签是发布契约一旦推送到远程禁止修改或删除除非紧急安全事件信息可审计附注标签记录谁、何时、为何发布自动化优先CI/CD流水线应自动基于标签构建、测试、部署分支与标签分离永远不要向已打标签的提交进行修改所有修复通过新标签或hotfix分支Git指令总结1. 初始与配置命令作用备注git init在当前目录初始化Git仓库生成.git目录git clone url克隆远程仓库加--depth 1浅克隆git config配置用户信息、别名等必配user.name和user.email2. 基本快照日常核心命令作用备注git add file将修改加入暂存区git add .谨慎使用git commit -m msg提交暂存区内容描述遵循规范如Conventional Commitsgit status查看工作区/暂存区状态解决冲突必备git diff比较工作区与暂存区差异--staged比较暂存区与HEADgit reset撤销提交/暂存--soft保留修改--hard彻底丢弃慎用git rm从版本库和工作区删除文件保留文件用--cachedgit mv重命名文件并追踪保留历史3. 分支管理命令作用备注git branch列出、创建、删除分支-d删除已合并-D强制删除git checkout/switch切换分支推荐switchGit 2.23git merge合并分支生产用--no-ff保留合并历史git rebase变基使历史线性仅用于本地未推送分支git cherry-pick commit挑选提交应用到当前分支热修复常用4. 远程协同命令作用备注git remote管理远程仓库-v查看地址add/removegit fetch拉取远程引用不合并安全更新远程分支状态git pull拉取并合并推荐git pull --rebasegit push推送本地提交先pull解决冲突5. 历史查看与追溯命令作用备注git log查看提交历史--oneline简洁--graph图形化git reflog记录所有HEAD变动救命命令找回误操作git blame逐行标注修改者定位问题源头git bisect二分查找引入bug的提交自动化回归定位6. 标签管理版本发布命令作用备注git tag列出标签-a附注标签推荐-m加注释git push origin tagname推送单个标签禁止--tags推送所有git tag -d tagname删除本地标签删除远程需git push origin --delete7. 临时保存与整理命令作用备注git stash暂存未提交修改配合list/apply/pop/dropgit worktree多工作目录管理并行维护不同版本避免频繁切分支8. 高级与修复命令作用备注git revert commit生成反向提交撤销历史安全可追溯git commit --amend修改最近一次提交慎用于已推送分支git clean -fd清理未跟踪文件先用-n预览危险操作git gc垃圾回收优化仓库Git自动触发一般无需手动我的20年忠告多用git reflog——后悔药。少用--force——破坏协作。标签即版本务必附注签名。分支命名规范feature/xxx、hotfix/xxx、release/xxx可读性提升十倍。本期关于Git的基本操作就讲到这里了。封面图自取
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2468262.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!