资讯动态

测试工程师必学Git:从安装配置到分支合并与冲突解决

发布时间:2026/10/16 19:09:33 来源:尧图企业网站定制
团队里的测试用例文档已经换到了第四个版本文件名从 test_case_v1.xlsx 一路涨到 test_case_really_final_v9.xlsx里面还有一堆改了就是最终版再也不改了的批注。如果你也经历过这种命名地狱那 Git 版本控制就是解决这个问题的正解。这是 0基础学测试 系列的技术篇第八课。这一篇不搞概念轰炸直接从安装配置讲起把最常用的 Git 核心命令、分支合并、冲突解决完整过一遍而且全部结合测试岗位的真实场景来讲。我带过的不少测试新人刚开始对 Git 都有两个误解一是觉得 Git 是开发的事测试只需要会提 bug二是觉得 Git 命令又多又难记离自己很远。实际上测试用例、自动化脚本、接口测试数据、性能测试报告全部都是需要版本管理的资产。项目迭代到后期没有 Git 的支撑你连当前这个版本到底对应哪一套用例都说不清楚。这篇博文的目标很直接让零基础的测试同学看完之后能上手操作遇到常见问题能自己排查。我会把每个命令的为什么也讲清楚而不是只扔给你一串命令行。1. 测试工程师为什么要掌握Git版本控制1.1 测试工作里的版本管理痛点先还原一个场景。某迭代里你维护着一套 Web 系统的测试用例分布在以下几个地方本地 Excel、团队共享目录、自动化测试仓库里的 Markdown 文件。某天开发改了一个接口的返回结构你要同步修改用例但发现共享目录里的文件已经被另一个测试同事改过你俩的修改互相覆盖了。等到测试报告出来数据对不上两个人互相都觉得是对方改错了。这种问题不是个例。测试工作看起来是找 bug但实质上是在管理信息用例信息、脚本信息、数据信息、结果信息。信息没有版本概念就会陷入谁改的什么时候改的为什么改改了什么的连环追问。Git 把这些问题一次性解决了——每个文件在什么时间被谁改成什么样全部有记录且可以随时回溯。我在的实际项目里还见过测试和开发因为这个 bug 到底是不是这个版本修的吵起来的。开发说修复代码已经提交了测试说部署包上没有。最后查 Git 提交记录发现修复代码虽然提交了但没合到发布分支。这种事如果靠嘴去争永远说不清Git 记录一摆谁也不会再吵。1.2 Git 相比传统文件管理的核心优势Git 是一个分布式版本控制系统和 SVN 这种集中式版本控制最大的区别在于每个开发者的本地都有一份完整的仓库历史。这意味着你就算没有网络也可以提交、查看历史、创建分支等联网了再同步到远程仓库。对测试人员来说这个特性有个非常实用的意义你在分析一个老版本的 bug 时不需要连服务器直接在本地切到那个版本的代码看当时的提交记录和代码内容甚至能直接跑起来复现。这在排查历史缺陷时效率极高也是我用 Git 最多的场景之一。Git 还有几个对测试特别友好的能力分支切换成本极低。同一个仓库里可以同时存在多个测试环境对应的代码状态切换几乎瞬时完成。每次提交都有哈希值、作者、时间、提交说明审计链路完整。合并merge时会自动尝试整合双方修改只有真正冲突的地方才需要人工介入。几乎所有操作都可回退。误删分支、误改文件、误提交都有对应的恢复手段。所以无论你以后是走功能测试、自动化测试还是测试开发方向Git 都值得花一次系统的时间去掌握。掌握的标志不是背下多少命令而是能够完成提交、分支、合并、冲突解决、回退这一整套闭环操作。2. 从零开始安装配置与连接远程仓库2.1 不同操作系统的安装方式Git 的安装本身不难难的是安装完之后不知道下一步干什么。先列一下各平台的常见安装方式我按实际使用场景推荐操作系统安装方式推荐理由Windows官网下载安装包或者用 winget install Git.Git图形化安装一路 Next 即可macOSbrew install git便于后续用 brew 管理其他工具Ubuntu/Debiansudo apt install git仓库源里直接有装完即用CentOS/RHELsudo yum install git同理安装完成后先验证一下版本同时确认 Git 自带的图形工具是否可用git --version提示Windows 用户安装时如果遇到是否调整 PATH的选项务必选择从命令行使用 Git否则后面在终端里敲 git 会提示找不到命令。另外建议选择使用 OpenSSH 而不是内置 SSH的选项这样密钥配置和其他系统保持一致。2.2 用户信息与 SSH Key 配置Git 提交记录里会带上作者信息这个信息来自你的全局配置而不是登录用户名。如果不设置提交时会提示或者自动生成一条乱七八糟的作者名给后续追溯造成麻烦。设置方法是两条命令git config --global user.name 你的名字 git config --global user.email 你在公司或代码平台的邮箱这里的邮箱建议与你注册代码托管平台的邮箱一致。这样你的提交头像、记录才能和平台账号关联起来。查看当前配置用git config --list。如果你是个人电脑配置全局没问题。但如果你是在公司公用机器上工作建议去掉 --global 参数只给当前仓库配置避免把自己的个人信息留在公共设备上git config user.name 你的名字 git config user.email 你的邮箱接下来说 SSH Key。这个步骤决定了你能不能用自己的电脑拉取和推送远程仓库代码不需要每次输密码。很多测试同学看到 SSH 就发怵其实它就是一个身份钥匙。生成密钥的命令ssh-keygen -t rsa -b 4096 -C 你的邮箱连续按几次回车即可默认密钥文件会生成在用户主目录的 .ssh 文件夹里分别是 id_rsa私钥和 id_rsa.pub公钥。私钥永远留在自己电脑上公钥可以放到代码托管平台的SSH Keys配置页面里。放好公钥之后用ssh -T git某代码托管平台地址验证一下连通性。第一次连接时会提示是否确认主机指纹输入 yes 回车即可。验证通过后你的本机和远程仓库之间的通道就打通了。2.3 克隆远程仓库第一条高频命令配置完成后的第一个动作通常是克隆clone一个已有的远程仓库。无论是开发代码、自动化测试代码还是测试文档仓库只要对方给了你仓库地址就用这条命令git clone git某代码托管平台地址:group/project.git克隆下来的目录里会自动带上完整的 Git 历史。你可以在本地随意查看历史提交可以切分支甚至可以新建分支做验证都不会影响其他人的工作。实操心得我第一次用 Git 的时候不理解为什么 clone 下来的目录里没有远程其他成员新建的分支。这是因为本地默认只跟踪了部分分支想看更多分支需要先执行git branch -a查看全部远程分支然后git checkout 分支名创建对应的本地跟踪分支。后来用顺手了才发现这其实是一个很好的保护机制——你只拉取你需要的内容不会一次性把几十个分支全部摊在你面前。3. 日常高频核心命令实战日常开发测试中真正高频的命令其实就那么十几条。把下面这套流程跑顺就足够应对绝大多数工作。3.1 工作区状态检查git statusgit status 是使用频率最高的命令没有之一。它的作用是告诉你当前仓库处于什么状态哪些文件改了没提交哪些文件是新加的当前在哪个分支。git status输出里有两块需要重点理解Changes not staged for commit 表示文件有修改但还没放到暂存区Changes to be committed 表示文件已经暂存等待提交。这里涉及 Git 的三区概念我用大白话解释工作区你在编辑器里看到的文件实际内容。暂存区Index你决定本次提交包含哪些改动的中间区域。版本库HEAD已经提交的历史记录。你把文件加入暂存区再提交到版本库这是一条单向流程。理解了这个流程后面很多命令的对比逻辑就通了。比如git diff默认对比的是工作区和暂存区的差异而git diff --cached对比的是暂存区和 HEAD 的差异。注意不少测试同学一上来就git add .把所有改动全部提交这在个人练习仓库没问题但在项目仓库里很危险。因为你可能把不该提交的配置文件、临时脚本、本机专属的环境变量一起提交上去轻则污染仓库重则导致别人拉取代码后环境配置错乱。建议提交前先git status看清楚自己改了哪些文件再用 git add 指定文件加入。3.2 提交变更git add 与 git commitgit add 是把改动放进暂存区的意思。常见用法# 添加指定文件 git add test/login_test.py # 添加当前目录所有改动 git add . # 添加所有已跟踪文件的修改不含新增文件 git add -u提交流程是git addgit commit两步。为什么不能一步到位因为在暂存区你可以分门别类地组织提交把修复登录用例断言和补充注册接口用例分成两个提交历史看起来更清晰出问题了也好定位。这相当于写完文档先做局部排版再决定哪些内容发布到哪个章节。提交命令git commit -m feat(login): 补充登录异常场景测试用例很多人只知道 -m其实还有一些很省事的参数git commit -am 说明对已经跟踪过的文件跳过 add 步骤直接提交改动。注意新文件不会包含在内。git commit --amend对上一次提交进行修补适合刚提交完就发现漏了文件或信息写错的时候。提交说明的写法我建议测试同学也遵循类型(范围): 描述的规范例如fix(test): 修复断言错误 chore(testcase): 补充支付流程反向用例 refactor(script): 重构接口自动化脚本数据驱动这个习惯在回溯时价值巨大。两周后你翻 log看到清晰的提交信息能省下大量排查时间。反之如果提交信息全是Update files或111你根本看不出这个提交到底干了什么。3.3 历史查看与差异对比git log、git diffgit log 用来查看提交历史。日常我最常用的组合是git log --oneline --graph --all--oneline 让每次提交只显示一行--graph 以图形方式展示分支合并路径--all 同时显示所有分支。看起来好像刷屏很厉害但对理解仓库全貌尤其重要。测试新人经常说看不懂代码关系实际上一棵清晰的分支图能帮你快速理解项目版本脉络。只看某个人在某段时间改过什么加两个参数git log --author名字 --since2024-01-01 --until2024-06-01git diff 则用来查看具体差异。测试同学用它的高频场景是开发说这里改了我看看到底改了啥。这比在代码平台网页上对比要快得多而且可以反复执行不产生任何负面影响。# 查看未暂存的改动 git diff # 查看已暂存但与上次提交之间的差异 git diff --cached # 查看两个提交之间的差异 git diff A提交号 B提交号 # 只查看某一部分文件的差异 git diff -- test/login_test.py实操心得我在做接口自动化时经常用git diff 上一个构建版本号 当前版本号 -- 接口定义目录来判断这次构建到底动了哪些接口。这个技巧比逐个看开发提交消息靠谱多了因为它展示的是代码层面的实际变化而不是开发想让你知道的描述性变化。3.4 分支管理git branch、git switch分支是 Git 里最重要的概念之一。对一个测试工程师来说分支意味着同一份代码多个独立的工作空间。比如你在稳定分支上维护回归测试脚本同时在开发分支上验证新功能用例互不干扰。创建分支和查看分支# 查看本地分支 git branch # 查看所有分支含远程 git branch -a # 新建分支 git branch feature/test-phase2 # 切换分支 git switch feature/test-phase2 # 新建并切换分支最常用 git switch -c feature/test-phase2可能有同学见过git checkout切换分支的写法那是老命令。现在新的写法是git switch和git restore职责分离不容易混淆。checkout 既管分支切换又管文件恢复一个命令干两件事容易踩坑新版 Git 已经推荐分开了。切换分支时有几点测试场景需要注意当前有未提交的修改切换分支有可能带过去。如果两个分支都动了同一个文件Git 会拒绝切换。此时要么提交、要么暂存git stash不要硬切。切换到旧版本分支跑历史用例是常见操作。但要注意旧分支上的测试脚本很可能依赖旧的环境配置直接跑大概率报错这属于正常现象不代表代码坏了。4. 合并与冲突解决从原理到实战4.1 合并的两种方式merge 与 rebase当你的工作完成需要把开发分支的改动合入测试分支或者把测试分支的用例合到主干时常用的手段是 merge合并和 rebase变基。merge 的逻辑是把两个分支的历史拧成一股生成一个合并提交。它不会改动已有提交的历史是最安全、最直观的合并方式。测试分支上的场景通常是验证完合并后的稳定性保留一个明确的合并节点方便回溯是谁、在什么时候、把哪些改动合进来的。rebase 的逻辑则是把当前分支的提交重新接到目标分支的顶端历史是一条直线看起来很干净但会重写提交哈希。对测试同学来说我建议不要在自己不理解的场景下乱用 rebase特别是共享分支上。一句话结论团队协作分支用 merge只想整理自己本地提交历史时再考虑 rebase。4.2 冲突是怎么产生的冲突这个词听着吓人其实原理很简单。Git 在自动合并时能处理掉大部分不重叠的改动。只有一种情况会冲突两个分支修改了同一个文件的同一区域Git 不知道到底该听谁的只能请你人工决定。我举一个测试场景。你和另一位测试同学同时维护接口自动化脚本里同一个用例文件。你在自己的分支上改第 30 行的断言他也在另一个分支上改第 30 行的断言。你们把这个分支合到一起时Git 发现同一行被改了两次冲突就产生了。还有一种常见情况开发改了接口返回结构删掉了一个字段而你的测试数据文件里还保留着对这个字段的引用合并时也可能产生冲突。这种冲突有时不在代码里而在测试数据和配置文件里排查时需要细心。4.3 冲突解决的完整操作流程遇到冲突时第一步不要慌先看 Git 给你的提示git merge feature/test-phase2如果显示 CONFLICT (content): Merge conflict in test/checkout_test.py说明这个文件需要人工处理。用git status查看哪些文件处于 unmerged 状态。打开冲突文件你会看到类似这样的标记 HEAD 断言支付成功返回码为 200 断言支付成功返回码为 201并校验订单状态为已支付 feature/test-phase2其中 HEAD到之间是当前分支的内容到 feature/test-phase2是对方分支的内容。解决冲突的动作是留下你认为正确的代码删掉冲突标记。如果你不确定谁对谁错就去问改这段代码的人或者看需求文档。千万不要自作主张保留其中一个就完事。完整流程如下用git status列出冲突文件清单。逐个打开冲突文件删除不应保留的内容和、、标记。处理完所有冲突文件后执行git add 文件名把解决结果加入暂存区。执行git commit完成合并提交。注意冲突解决最忌讳的就是只保留一边。两边的改动可能都有价值只是位置重叠。比如一边是新增断言另一边是修改请求参数你只留半边的修改等于把另一半改动丢了。这是新手最常犯的错误。4.4 解决冲突后的验证与提交冲突解决完不是提交就完事了。测试场景下必须补一步验证因为你自己也不确定保留的合并结果是否能正常工作。我在项目里总结了一套固定动作先跑一遍受影响用例的冒烟测试。如果解决的是接口脚本冲突就执行该接口的脚本如果是用例文档冲突就检查文档格式和引用关系。再全量跑一遍自动化测试回归。合并经常会产生隐性冲突——Git 帮你合并成功了但代码之间业务逻辑不兼容这种 bug 只能靠跑用例发现。确认无误之后再 commit 并 push。提交信息建议用 Merge branch ... into...这样后续看历史的时候能一眼看出这是一次合并。提交后的验证绝不能省。我有过惨痛教训解决一个用例文件冲突时只保留了同事的新用例格式却把原有关键步骤的预期结果改错了。当时看 Git 标记觉得没问题结果导致测试结果全部标红幸好还没推到远程否则就要污染团队分支了。5. 常见问题与排查技巧实录5.1 提交信息写错了或者漏了文件怎么办提交完了才发现信息写错、或者漏了一个文件这是最高频的问题之一。如果你还没有推送push到远程随便改都行因为改动只存在于本地。git commit --amend -m 修正后的提交信息--amend 会把暂存区的内容和上一次提交合并成一次新提交。如果你刚才漏了文件只要现在把漏掉的文件 add 进暂存区再执行 amend就能把它并进上一次提交不会产生一条额外的补交记录。但有个重要前提这条提交如果已经 push 到远程而且这个分支是你和其他人共用的那我建议不要用 amend 了。因为 amend 会生成一个新哈希其他人基于旧哈希的提交会变得错综复杂时间久了你会莫名遇到 pull 被拒的问题。5.2 push 被拒绝怎么办push 被拒绝是最常见的突发事件。你本地提交完了执行git push结果报错说远程有本地没有的提交。这通常是因为远程分支上别人已经推了新提交而你没有拉下来。Git 出于安全考虑拒绝你直接覆盖别人。我的处理流程是git pull --rebase--rebase 会把你的本地提交重新播放到远程最新提交之上让历史保持直线。如果拉取过程中有冲突解决办法和 merge 冲突一样解决、add、然后执行git rebase --continue完成。有些同学习惯直接git pull等于拉取远端并自动合并在某些情况下会生成一个合并提交历史会多一个分叉节点。对测试同学来说git pull --rebase更干净也更少踩坑。如果是 push 时提示以下报错! [rejected] main - main (fetch first)只需按上面流程执行 pull --rebase 再 push 即可。全程不会丢失你自己的提交只是位置发生变化。5.3 误删分支或丢了提交怎么办误删分支这个事绝大多数人都干过。先别崩溃有救。只要你的误删操作还在这台电脑上发生过而且你用 Git 做操作的时间不长基本都能找回。git reflogreflog 记录了 HEAD 指针的所有历史移动包括被你 reset 掉、被删除分支上的提交。找到你那个分支最后所在的提交哈希然后重新建分支指过去git branch 恢复的分支名 提交哈希这个命令的重要性对所有 Git 使用者都不为过。我甚至在团队里专门总结过一次Git 应急三件套reflog 找回误删分支、stash 临时保存未提交改动、revert 安全撤销已推送提交。5.4 代码回退的两种姿势reset 与 revert回退代码也是一个高频需求。比如测试验证后发现某个提交引入了严重问题你需要把代码回退到之前状态。Git 有两类做法git reset 是在本地回退会移动分支指针。git reset --hard 某提交号会彻底丢弃该提交之后的所有改动非常危险。git reset --soft 某提交号则把改动放回暂存区你可以重新整理提交。reset 只建议在还没推送的本地提交上使用。git revert 则是生成一次反做的提交用来撤销某次提交但不动历史。这适合已经 push 到远程、或者同事已经基于你的分支做了开发的场景。revert 的好处是历史是向前走的总的提交记录会越来越多但实际代码内容回到了你要的状态。在测试团队里我的原则是没推远用 reset 整理已推远用 revert 保平安。尤其在多人共用的测试分支上千万不要用 reset 硬回退否则别人拉代码时会出现大量不可预期的冲突。5.5 本地文件改乱了想丢弃改动怎么办用git restore 文件名可以把文件恢复到最近一次提交的状态。这个命令比 checkout 更安全因为它只做文件恢复不会影响分支状态。# 丢弃某个文件的未提交改动 git restore test/login_test.py # 丢弃当前所有未提交改动慎重 git restore .这个命令只能丢弃未提交的改动如果你的改动已经 commit 过了需要配合 reset 使用。我建议执行前先git status和git diff看一眼确认这些改动你真的不想要了。恢复操作不可逆没有后悔药。6. 测试场景中的 Git 实战心得前面把命令都讲了一遍最后我想从测试工程师的角度分享几点我个人在使用 Git 过程中的体会。第一Git 不是开发专属工具而是整个团队的协作语言。作为测试你不光要用 Git 管理自己的用例和脚本还要懂得从 Git 历史里获取需求变更脉络。开发把代码提交得再乱只要 git log 和 git diff 用得熟你就能在提 bug 之前搞清楚这个功能到底是怎么演变的bug 上报的质量会完全不一样。第二测试人员更应该重视可复现这个特性。我排查历史 bug 时最常用的套路是git switch -c debug/xxx 某次提交哈希直接切到一个历史版本去复现问题。这样做比在现网上反复试逼近要高效得多。Git 让你在任何时间点都能还原出当时的环境和代码这是测试工作最需要的确定性。第三提交信息别懒。我检查过不少同学的提交信息全是updatefix过了三个月再看完全不知道干了什么。测试用例的提交信息尤其要写清楚场景和意图因为它不像代码那样有调试堆栈能辅助记忆只有靠信息本身。我现在带的团队提交信息不完全code review 会打回这个习惯帮我们省了太多追溯时间。第四冲突不可怕盲目解决冲突才可怕。冲突标记只是 Git 在告诉你这里需要你决策不同的保留方案对应不同的业务结果。解决前去看一眼需求解决后务必跑用例验证一遍再提交。宁可慢一分钟不要快一天然后重新排查。最后分享一个实用技巧给自己建一个测试专用的本地分支专门用来存各种临时验证脚本、批量造数脚本、环境检查脚本。这类脚本往往不会提交到团队仓库但自己经常要用。建一个 personal 分支随手提交随手 amend 也能玩不需要有心理负担。配合git stash还能在切换任务时把未完成的修改存起来事了之后一键恢复。这些操作不需要任何权限也不需要打扰别人但能让你的日常效率提升一个档次。测试这行做久了你会发现扎实的技术功底才是提效的根本。Git 作为基础工具值得你花半天时间系统过一遍。这篇讲到的命令和流程已经覆盖了日常工作中九成以上的场景。剩下的一成等你真的用起来了再来直播间或者评论区一起交流。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑