当前位置: 首页 > article >正文

初识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的基本操作就讲到这里了。封面图自取

相关文章:

初识Git,带你深入学习Git相关的知识

在之前的博客中,我都会在博客的开头放一个gitee的链接。Gitee是什么呢?它是一个远程的代码托管库。在我们学习和项目管理的时候起着非常重要的作用。 本期我就带领着大家一起学习Git相关的知识内容。学习它的操作,了解其在企业级开发中的作用…...

League-Toolkit:重新定义英雄联盟游戏体验的智能助手

League-Toolkit:重新定义英雄联盟游戏体验的智能助手 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-Toolkit …...

【Python并发革命】:GIL解除后首个生产级无锁插件生态正式开放下载(限时72小时)

第一章:Python并发革命的里程碑意义 Python 并发模型的演进并非渐进式改良,而是一场深刻重塑编程范式的革命。从早期依赖线程与锁的阻塞式模型,到 asyncio 的异步 I/O 抽象、async/await 语法糖的引入,再到结构化并发(…...

从云端到指尖:巧用Aspose组件实现Office/PDF文档秒级HTML预览,攻克移动端大文件访问瓶颈

1. 移动端大文件预览的痛点与解决思路 最近接手一个企业级项目时,遇到了一个非常典型的场景:用户通过PC端上传各种办公文档(Word、Excel、PPT、PDF),需要在移动端随时查看。但当文件体积较大时(比如超过50M…...

保姆级教程:用OpenAI Whisper给视频自动生成字幕(附Python代码)

视频创作者必备:用Whisper打造高效字幕工作流 每次剪辑视频最头疼的就是加字幕?作为过来人,我完全理解那种对着时间轴逐帧调整的痛苦。直到发现Whisper这个神器,我的工作效率直接翻了三倍。今天就把这套全自动字幕生成方案完整分享…...

告别兼容性问题:手把手教你用canvas和base64转换TIFF图片

前端工程师必备:TIFF图片处理全攻略与实战解决方案 在当今数字内容爆炸式增长的时代,图片处理已成为前端开发中不可或缺的一环。作为专业开发者,我们经常需要面对各种图片格式的兼容性问题,其中TIFF(Tagged Image Fil…...

Godep历史意义揭秘:Go依赖管理工具的开创者如何改变开发方式

Godep历史意义揭秘:Go依赖管理工具的开创者如何改变开发方式 【免费下载链接】godep dependency tool for go 项目地址: https://gitcode.com/gh_mirrors/go/godep Godep作为Go语言依赖管理工具的开创者,在Go生态系统的演进历程中扮演了至关重要的…...

PyTorch 3.0静训性能断崖预警:当AllReduce延迟>8.3ms或图编译耗时>117s时,你的训练任务已在 silently fail——附实时诊断CLI工具

第一章:PyTorch 3.0静态图分布式训练的静默失效危机全景PyTorch 3.0 引入的 TorchScript 静态图编译机制与 torch.distributed 的深度耦合,在多节点多卡场景下暴露出一类高危静默失效现象:训练进程持续运行、梯度同步无报错、loss 曲线看似收…...

IDEA插件开发:集成Nunchaku-flux-1-dev实现代码注释自动图解

IDEA插件开发:集成Nunchaku-flux-1-dev实现代码注释自动图解 1. 引言 作为一名Java开发者,你是否曾经面对过这样的困境:接手一个复杂的遗留系统,代码量庞大但注释稀少,逻辑关系错综复杂,光是理解代码执行…...

腾讯混元翻译模型HY-MT1.5-1.8B:免费开源,企业级翻译解决方案

腾讯混元翻译模型HY-MT1.5-1.8B:免费开源,企业级翻译解决方案 1. 引言 1.1 为什么选择HY-MT1.5-1.8B 在全球化的商业环境中,语言障碍成为企业拓展国际市场的首要挑战。腾讯混元团队推出的HY-MT1.5-1.8B翻译模型,以其18亿参数的…...

Android USB串口通信终极指南:智能家居物联网项目实战

Android USB串口通信终极指南:智能家居物联网项目实战 【免费下载链接】usb-serial-for-android Android USB host serial driver library for CDC, FTDI, Arduino and other devices. 项目地址: https://gitcode.com/gh_mirrors/us/usb-serial-for-android …...

从NDVI到地表温度:用ENVI Band Math一次性搞定植被与热环境分析

ENVI波段运算实战:NDVI与地表温度的高效批量处理技巧 遥感影像分析中,植被指数和地表温度是最基础却又最关键的指标。传统操作流程往往需要反复切换不同工具模块,既耗时又容易出错。而ENVI的Band Math功能就像一把瑞士军刀,能将这…...

告别Swagger注解污染:用smart-doc + Maven插件5分钟生成整洁API文档(SpringBoot实战)

零侵入API文档革命:smart-doc在SpringBoot项目中的极致实践 如果你曾经被Swagger注解污染代码所困扰,或是厌倦了在业务逻辑中嵌入大量文档相关注解,那么smart-doc可能会成为你API文档管理的新选择。作为一款基于源码解析的文档生成工具&#…...

从拒稿到录用:我的TOMM投稿实战复盘与经验分享

1. 从TMM拒稿到TOMM录用的心路历程 第一次收到TMM的拒稿邮件时,我正在实验室熬夜改代码。邮件弹出来的那一刻,整个人就像被泼了一盆冷水。那篇论文已经经历了三轮大修,每次都是几十条审稿意见,我们团队前前后后修改了上百个细节。…...

Linux环境下Python段错误全解析:从内存管理到线程安全的避坑手册

Linux环境下Python段错误全解析:从内存管理到线程安全的避坑手册 当你在深夜调试一个复杂的Python项目时,突然看到屏幕上跳出"Segmentation fault (core dumped)"的提示,那种感觉就像在高速公路上爆胎——明明代码逻辑看起来没问题…...

告别天价桥接芯片!用高云GW5AT-LV15MG132 FPGA搞定MIPI C-PHY摄像头测试盒

国产FPGA革新摄像头测试方案:高云GW5AT-LV15MG132的MIPI C-PHY实战解析 在摄像头模组生产线上,测试环节的成本与效率直接关系到企业竞争力。传统测试方案依赖进口FPGA搭配昂贵桥接芯片,不仅物料清单(BOM)成本居高不下…...

uniapp集成腾讯地图:从marker点聚合到轨迹回放的跨端实战与性能调优

1. uniapp集成腾讯地图SDK的核心步骤 第一次在uniapp里用腾讯地图SDK时,我踩了个大坑——直接在H5端跑代码发现地图出不来。后来才明白,腾讯地图在H5端需要单独配置安全域名。具体操作是在腾讯地图开放平台申请key时,必须把H5的域名加入白名单…...

如何通过InstantClick事件回调实现精准的性能监控:开发者必备指南

如何通过InstantClick事件回调实现精准的性能监控:开发者必备指南 【免费下载链接】instantclick InstantClick makes following links in your website instant. 项目地址: https://gitcode.com/gh_mirrors/in/instantclick InstantClick是一款能让网站链接…...

Qwen3-Reranker-0.6B一文详解:轻量0.6B参数如何实现SOTA级重排序性能

Qwen3-Reranker-0.6B一文详解:轻量0.6B参数如何实现SOTA级重排序性能 1. 引言:为什么你需要关注这个0.6B的小模型? 如果你用过搜索引擎,肯定有过这样的体验:输入一个问题,搜出来一堆结果,但真…...

Electron + Vue 3 + Vite 桌面应用开发:从零到打包的实战指南

1. 为什么选择Electron Vue 3 Vite组合 如果你正在寻找一种既能快速开发又能保证性能的桌面应用解决方案,Electron Vue 3 Vite的组合绝对值得考虑。这个组合最大的优势在于开发体验的提升,特别是对于那些已经熟悉Vue生态的开发者来说。 Vite带来的开…...

KEPServerEX与SQLServer数据库的无缝集成指南

1. KEPServerEX与SQLServer集成的核心价值 在工业自动化和数据采集领域,KEPServerEX作为领先的通信平台,与SQLServer数据库的集成能够实现设备数据到关系型数据库的高效流转。这种组合特别适合需要长期存储设备运行数据、生成生产报表或进行数据分析的场…...

5个维度深度评估:哪款内容解锁工具真正值得投入时间?

5个维度深度评估:哪款内容解锁工具真正值得投入时间? 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在数字信息时代,付费墙已成为内容获取的主要障…...

FPGA密码锁设计避坑指南:状态机划分、时序约束与安全逻辑的那些事儿

FPGA密码锁设计避坑指南:状态机划分、时序约束与安全逻辑的那些事儿 在FPGA开发领域,密码锁设计看似简单,实则暗藏玄机。许多工程师在完成基础功能后,往往会在状态机划分、时序约束和安全逻辑等环节踩坑。本文将结合实战经验&…...

新手福音:用快马平台将vmware官网概念转化为可交互的虚拟机演示代码

作为一名刚接触虚拟化技术的新手,我最近在VMware官网上看到了关于虚拟机的基础概念介绍。虽然理论知识很全面,但总觉得少了点动手实践的环节。直到发现了InsCode(快马)平台,它让我能够把抽象的概念快速转化为可运行的代码,这种学习…...

zynq7020 u-boot 外设配置实战指南

1. Zynq7020 U-Boot外设配置概述 在嵌入式系统开发中,U-Boot作为系统启动加载器扮演着关键角色。对于Xilinx Zynq-7020平台来说,正确配置U-Boot外设是确保系统正常启动和运行的基础。本文将重点介绍网口、QSPI Flash和eMMC这三个核心外设的配置方法。 为…...

noice.nvim终极性能优化指南:让你的Neovim编辑器运行如飞

noice.nvim终极性能优化指南:让你的Neovim编辑器运行如飞 【免费下载链接】noice.nvim 💥 Highly experimental plugin that completely replaces the UI for messages, cmdline and the popupmenu. 项目地址: https://gitcode.com/gh_mirrors/no/noic…...

Qwen3-TTS-Tokenizer-12Hz快速上手:Web界面一键处理音频文件

Qwen3-TTS-Tokenizer-12Hz快速上手:Web界面一键处理音频文件 1. 为什么选择Qwen3-TTS-Tokenizer-12Hz? 想象一下,你正在开发一个语音社交应用,用户上传的音频文件体积大、传输慢,服务器存储成本居高不下。传统压缩算…...

别再只查列表了!Flowable 7.x 待办任务‘状态’字段的实战设计与前端动态渲染

Flowable 7.x 待办任务状态引擎设计与前端动态交互实战 在当今企业级应用开发中,工作流引擎已成为复杂业务流程管理的核心基础设施。作为Activiti的下一代产品,Flowable 7.x在任务状态管理和前后端协同方面提供了更强大的能力。本文将深入探讨如何基于Fl…...

RouterOS网桥VLAN实战:从零构建安全隔离的二层虚拟网络

1. VLAN基础与RouterOS网桥概述 刚接触网络管理的朋友可能经常听到"VLAN"这个词,但总觉得它神秘莫测。其实VLAN就像给一栋办公楼划分不同部门:财务部、研发部、市场部各自有独立的办公区域,既保证了隐私安全,又避免了相…...

eNSP安装避坑指南:WinPcap/Wireshark/VirtualBox依赖关系解析

eNSP安装避坑指南:WinPcap/Wireshark/VirtualBox依赖关系解析 当你第一次打开eNSP安装包时,可能会疑惑为什么需要同时安装WinPcap、Wireshark和VirtualBox这三个看似不相关的软件。这就像组装一台精密仪器——少了任何一个螺丝,整台机器都无法…...